Beispiel #1
0
    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()
Beispiel #2
0
 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()