def testReadPtr(self): data = Marshal.AllocHGlobal(CPyMarshal.PtrSize) Marshal.WriteIntPtr(data, IntPtr(0)) self.assertEquals(CPyMarshal.ReadPtr(data), IntPtr(0), "wrong") Marshal.WriteIntPtr(data, IntPtr(100001)) self.assertEquals(CPyMarshal.ReadPtr(data), IntPtr(100001), "wrong") Marshal.FreeHGlobal(data)
def testShrink(self): allocs = [] frees = [] mapper = PythonMapper(GetAllocatingTestAllocator(allocs, frees)) deallocTypes = CreateTypes(mapper) del allocs[:] oldLength = 365 newLength = 20 ptrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr)) try: strPtr = mapper.PyString_FromStringAndSize(IntPtr.Zero, oldLength) Marshal.WriteIntPtr(ptrPtr, strPtr) baseSize = Marshal.SizeOf(PyStringObject) self.assertEquals(allocs, [(strPtr, oldLength + baseSize)], "allocated wrong") self.assertEquals(mapper._PyString_Resize(ptrPtr, newLength), 0, "bad return on success") self.assertHasStringType(strPtr, mapper) self.assertStringObjectHasLength(strPtr, newLength) self.assertEquals(allocs, [(strPtr, oldLength + baseSize)], "unexpected extra alloc") self.assertEquals(frees, [], "unexpected frees") finally: mapper.Dispose() Marshal.FreeHGlobal(ptrPtr) deallocTypes()
def testErrorCaseSecondArg(self, mapper, addToCleanup): part1Ptr = mapper.Store(17) mapper.IncRef(part1Ptr) # avoid garbage collection startingRefCnt = mapper.RefCount(part1Ptr) part2Ptr = mapper.Store("three") stringPtrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr)) addToCleanup(lambda: Marshal.FreeHGlobal(stringPtrPtr)) Marshal.WriteIntPtr(stringPtrPtr, part1Ptr) mapper.PyString_Concat(stringPtrPtr, part2Ptr) self.assertMapperHasError(mapper, TypeError) self.assertEquals(Marshal.ReadIntPtr(stringPtrPtr), IntPtr(0)) self.assertEquals(startingRefCnt - mapper.RefCount(part1Ptr), 1)
def testBasic(self, mapper, addToCleanup): part1Ptr = mapper.Store("one two") mapper.IncRef(part1Ptr) # avoid garbage collection part2Ptr = mapper.Store(" three") startingRefCnt = mapper.RefCount(part1Ptr) stringPtrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr)) addToCleanup(lambda: Marshal.FreeHGlobal(stringPtrPtr)) Marshal.WriteIntPtr(stringPtrPtr, part1Ptr) mapper.PyString_Concat(stringPtrPtr, part2Ptr) self.assertMapperHasError(mapper, None) newStringPtr = Marshal.ReadIntPtr(stringPtrPtr) self.assertEquals(mapper.Retrieve(newStringPtr), "one two three") self.assertEquals(startingRefCnt - mapper.RefCount(part1Ptr), 1)
def testGrow(self): allocs = [] frees = [] mapper = PythonMapper(GetAllocatingTestAllocator(allocs, frees)) deallocTypes = CreateTypes(mapper) del allocs[:] oldLength = 20 testString = "slings and arrows" + self.getStringWithValues(0, 256) newLength = len(testString) oldStrPtr = mapper.PyString_FromStringAndSize(IntPtr.Zero, oldLength) ptrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr)) try: Marshal.WriteIntPtr(ptrPtr, oldStrPtr) newStrPtr = IntPtr.Zero baseSize = Marshal.SizeOf(PyStringObject) self.assertEquals(allocs, [(oldStrPtr, oldLength + baseSize)], "allocated wrong") self.assertEquals(mapper._PyString_Resize(ptrPtr, newLength), 0, "bad return on success") newStrPtr = Marshal.ReadIntPtr(ptrPtr) expectedAllocs = [(oldStrPtr, oldLength + baseSize), (newStrPtr, newLength + baseSize)] self.assertEquals(allocs, expectedAllocs, "allocated wrong") self.assertEquals(frees, [oldStrPtr], "did not free unused memory") self.assertHasStringType(newStrPtr, mapper) self.assertStringObjectHasLength(newStrPtr, newLength) testBytes = self.byteArrayFromString(testString) self.fillStringDataWithBytes(newStrPtr, testBytes) self.assertEquals(mapper.Retrieve(newStrPtr), testString, "failed to read string data") if oldStrPtr != newStrPtr: # this would otherwise fail (very, very rarely) self.assertEquals(oldStrPtr in frees, True) finally: mapper.Dispose() Marshal.FreeHGlobal(ptrPtr) deallocTypes()
def testErrorHandling(self): allocs = [] frees = [] mapper = PythonMapper(GetAllocatingTestAllocator(allocs, frees)) deallocTypes = CreateTypes(mapper) del allocs[:] ptrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr)) try: data = mapper.PyString_FromStringAndSize(IntPtr.Zero, 365) Marshal.WriteIntPtr(ptrPtr, data) baseSize = Marshal.SizeOf(PyStringObject) self.assertEquals(allocs, [(data, 365 + baseSize)], "allocated wrong") self.assertEquals(mapper._PyString_Resize(ptrPtr, 2000000000), -1, "bad return on error") self.assertEquals(type(mapper.LastException), MemoryError, "wrong exception type") self.assertTrue(data in frees, "did not deallocate") finally: mapper.Dispose() Marshal.FreeHGlobal(ptrPtr) deallocTypes()