コード例 #1
0
    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()
コード例 #2
0
    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()
コード例 #3
0
ファイル: slicetest.py プロジェクト: nathanwblair/ironclad
    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()
コード例 #4
0
    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()
コード例 #5
0
    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()