def testBasicStoreRetrieveFree(self): frees = [] allocs = [] mapper = PythonMapper(GetAllocatingTestAllocator(allocs, frees)) deallocTypes = CreateTypes(mapper) del allocs[:] obj1 = object() ptr = mapper.Store(obj1) self.assertEquals(len(allocs), 1, "unexpected number of allocations") self.assertEquals(allocs[0], (ptr, Marshal.SizeOf(PyObject)), "unexpected result") self.assertNotEquals(ptr, IntPtr.Zero, "did not store reference") self.assertEquals(mapper.RefCount(ptr), 1, "unexpected refcount") self.assertEquals(CPyMarshal.ReadPtrField(ptr, PyObject, "ob_type"), mapper.PyBaseObject_Type, "nearly-opaque pointer had wrong type") obj2 = mapper.Retrieve(ptr) self.assertTrue(obj1 is obj2, "retrieved wrong object") self.assertEquals(frees, [], "unexpected deallocations") mapper.PyObject_Free(ptr) self.assertEquals(frees, [ptr], "unexpected deallocations") self.assertRaises(KeyError, lambda: mapper.PyObject_Free(ptr)) mapper.Dispose() deallocTypes()
def testRefCountIncRefDecRef(self): frees = [] allocator = GetAllocatingTestAllocator([], frees) mapper = PythonMapper(allocator) deallocTypes = CreateTypes(mapper) obj1 = object() ptr = mapper.Store(obj1) self.assertEquals(mapper.HasPtr(ptr), True) mapper.IncRef(ptr) self.assertEquals(mapper.RefCount(ptr), 2, "unexpected refcount") self.assertEquals(mapper.HasPtr(ptr), True) del frees[:] mapper.DecRef(ptr) self.assertEquals(mapper.RefCount(ptr), 1, "unexpected refcount") self.assertEquals(mapper.HasPtr(ptr), True) self.assertEquals(frees, [], "unexpected deallocations") mapper.DecRef(ptr) self.assertEquals(mapper.HasPtr(ptr), False) self.assertEquals(frees, [ptr], "unexpected deallocations") self.assertRaises(KeyError, lambda: mapper.PyObject_Free(ptr)) mapper.Dispose() deallocTypes()
def testPySlice_DeallocDecRefsItemsAndCallsCorrectFreeFunction(self): frees = [] mapper = PythonMapper(GetAllocatingTestAllocator([], frees)) deallocTypes = CreateTypes(mapper) calls = [] def CustomFree(ptr): calls.append(ptr) freeDgt = dgt_void_ptr(CustomFree) CPyMarshal.WriteFunctionPtrField(mapper.PySlice_Type, PyTypeObject, "tp_free", freeDgt) slicePtr = mapper.Store(slice(1, 2, 3)) del frees[:] mapper.IC_PySlice_Dealloc(slicePtr) self.assertEquals(len(frees), 3, "did not dealloc each item") self.assertEquals(calls, [slicePtr], "did not call type's free function") mapper.PyObject_Free(slicePtr) mapper.Dispose() deallocTypes()
def testPyTuple_DeallocDecRefsItemsAndCallsCorrectFreeFunction(self): frees = [] mapper = PythonMapper(GetAllocatingTestAllocator([], frees)) deallocTypes = CreateTypes(mapper) calls = [] def CustomFree(ptr): calls.append(ptr) freeDgt = dgt_void_ptr(CustomFree) CPyMarshal.WriteFunctionPtrField(mapper.PyTuple_Type, PyTypeObject, "tp_free", freeDgt) tuplePtr, itemPtrs = MakeTuple(mapper, (1, 2, 3)) mapper.IC_PyTuple_Dealloc(tuplePtr) for itemPtr in itemPtrs: self.assertEquals(itemPtr in frees, True, "did not decref item") self.assertEquals(calls, [tuplePtr], "did not call type's free function") mapper.PyObject_Free(tuplePtr) mapper.Dispose() deallocTypes()
def testCanFreeWithRefCount0(self): frees = [] mapper = PythonMapper(GetAllocatingTestAllocator([], frees)) objPtr = mapper.Store(object()) CPyMarshal.WriteIntField(objPtr, PyObject, "ob_refcnt", 0) mapper.PyObject_Free(objPtr) self.assertEquals(frees, [objPtr], "didn't actually release memory") mapper.Dispose()