def testPyDict_GetItemSuccess(self): frees = [] mapper = PythonMapper(GetAllocatingTestAllocator([], frees)) deallocTypes = CreateTypes(mapper) dictPtr = mapper.Store({12345: 67890}) mapper.EnsureGIL() itemPtr = mapper.PyDict_GetItem(dictPtr, mapper.Store(12345)) self.assertEquals(mapper.Retrieve(itemPtr), 67890, "failed to get item") self.assertEquals(mapper.RefCount(itemPtr), 1, "something is wrong") mapper.ReleaseGIL() self.assertEquals(itemPtr in frees, True) mapper.Dispose() deallocTypes()
def testTooBig(self): allocs = [] frees = [] mapper = PythonMapper(GetAllocatingTestAllocator(allocs, frees)) deallocTypes = CreateTypes(mapper) mapper.EnsureGIL() mapper.ReleaseGIL() mem1 = getattr(mapper, MALLOC_NAME)(4) del allocs[:] self.assertEquals(getattr(mapper, REALLOC_NAME)(mem1, sys.maxint), IntPtr.Zero) self.assertMapperHasError(mapper, None) self.assertEquals(frees, []) self.assertEquals(allocs, []) mapper.Dispose() deallocTypes()
def testReleaseGILChecksBridgePtrs(self): frees = [] allocator = GetAllocatingTestAllocator([], frees) mapper = PythonMapper(allocator) deallocTypes = CreateTypes(mapper) # force no throttling of cleanup mapper.GCThreshold = 0 def do1(): obj = object() ref = WeakReference(obj) # need to use same allocator as mapper, otherwise it gets upset on shutdown ptr = allocator.Alloc(Marshal.SizeOf(PyObject)) CPyMarshal.WriteIntField(ptr, PyObject, "ob_refcnt", 2) CPyMarshal.WritePtrField(ptr, PyObject, "ob_type", mapper.PyBaseObject_Type) mapper.StoreBridge(ptr, obj) # refcount > 1 means ref should have been strengthened del obj return ref, ptr ref, ptr = do1() gcwait() self.assertEquals(ref.IsAlive, True, "was reaped unexpectedly (refcount was 2)") CPyMarshal.WriteIntField(ptr, PyObject, "ob_refcnt", 1) mapper.EnsureGIL() mapper.ReleaseGIL() # refcount < 2 should have been weakened gcwait() self.assertRaises(NullReferenceException, mapper.Retrieve, ptr) # need to dealloc ptr ourselves, it doesn't hapen automatically # except for objects with Dispatchers mapper.IC_PyBaseObject_Dealloc(ptr) mapper.Dispose() deallocTypes()