コード例 #1
0
    def testWritePtr(self):
        data = Marshal.AllocHGlobal(CPyMarshal.PtrSize)

        CPyMarshal.WritePtr(data, IntPtr(0))
        self.assertEquals(Marshal.ReadIntPtr(data), IntPtr(0), "wrong")

        CPyMarshal.WritePtr(data, IntPtr(100001))
        self.assertEquals(Marshal.ReadIntPtr(data), IntPtr(100001), "wrong")

        Marshal.FreeHGlobal(data)
コード例 #2
0
    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)
コード例 #3
0
    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)
コード例 #4
0
    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()