def testReadInt(self): data = Marshal.AllocHGlobal(CPyMarshal.IntSize) Marshal.WriteInt32(data, 0) self.assertEquals(CPyMarshal.ReadInt(data), 0, "wrong") Marshal.WriteInt32(data, -1) self.assertEquals(CPyMarshal.ReadInt(data), -1, "wrong") Marshal.FreeHGlobal(data)
def testBufferProtocol(self, mapper, later): # should all be implemented in C really, but weaving cpy string type into # our code feels too much like hard work for now strPtr = mapper.PyString_Type bufPtr = CPyMarshal.ReadPtrField(strPtr, PyTypeObject, 'tp_as_buffer') self.assertNotEquals(bufPtr, IntPtr.Zero) getreadbuffer = CPyMarshal.ReadFunctionPtrField( bufPtr, PyBufferProcs, 'bf_getreadbuffer', dgt_int_ptrintptr) getwritebuffer = CPyMarshal.ReadFunctionPtrField( bufPtr, PyBufferProcs, 'bf_getwritebuffer', dgt_int_ptrintptr) getcharbuffer = CPyMarshal.ReadFunctionPtrField( bufPtr, PyBufferProcs, 'bf_getcharbuffer', dgt_int_ptrintptr) getsegcount = CPyMarshal.ReadFunctionPtrField(bufPtr, PyBufferProcs, 'bf_getsegcount', dgt_int_ptrptr) ptrptr = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr)) later(lambda: Marshal.FreeHGlobal(ptrptr)) strptr = mapper.Store("hullo") for getter in (getreadbuffer, getcharbuffer): self.assertEquals(getter(strptr, 0, ptrptr), 5) self.assertEquals( CPyMarshal.ReadPtr(ptrptr), CPyMarshal.GetField(strptr, PyStringObject, 'ob_sval')) self.assertEquals(getter(strptr, 1, ptrptr), -1) self.assertMapperHasError(mapper, SystemError) self.assertEquals(getwritebuffer(strptr, 0, ptrptr), -1) self.assertMapperHasError(mapper, SystemError) self.assertEquals(getsegcount(strptr, ptrptr), 1) self.assertEquals(CPyMarshal.ReadInt(ptrptr), 5) self.assertEquals(getsegcount(strptr, IntPtr.Zero), 1)
def testFills(self, mapper, addToCleanUp): # TODO: if we set a lower value, numpy will crash inside arr_add_docstring # I consider docstrings to be low-priority-enough that it's OK to fudge this # for now. also, fixing it would be hard ;). flagPtr = Marshal.AllocHGlobal(Marshal.SizeOf(Int32)) addToCleanUp(lambda: Marshal.FreeHGlobal(flagPtr)) mapper.RegisterData("Py_OptimizeFlag", flagPtr) self.assertEquals(CPyMarshal.ReadInt(flagPtr), 2)
def testCallsAppropriatelyNamedInitFunctionAndUnloadsWhenDone(self): l = Unmanaged.LoadLibrary("tests\\data\\setvalue.pyd") try: pValue = Unmanaged.GetProcAddress(l, "value") value = CPyMarshal.ReadInt(pValue) self.assertEquals(value, 1, "bad setup") pi = PydImporter() pi.Load("tests\\data\\setvalue.pyd") finally: # lose test reference to setvalue.pyd # only the PydImporter should still have a reference to it Unmanaged.FreeLibrary(l) value = CPyMarshal.ReadInt(pValue) self.assertEquals(value, 2, "PydImporter didn't call correct function") pi.Dispose() self.assertEquals(Unmanaged.GetModuleHandle("setvalue.pyd"), IntPtr.Zero, "failed to unload on dispose") pi.Dispose()
def testWorksWithEmbeddedNulls(self, mapper, addDealloc): dataPtrPtr = Marshal.AllocHGlobal(CPyMarshal.PtrSize * 2) sizePtr = CPyMarshal.Offset(dataPtrPtr, CPyMarshal.PtrSize) addDealloc(lambda: Marshal.FreeHGlobal(dataPtrPtr)) testStr = "You're fighting a saber-toothed ferret." + self.getStringWithValues( 0, 256) strPtr = mapper.Store(testStr) dataPtr = self.dataPtrFromStrPtr(strPtr) self.assertEquals( mapper.PyString_AsStringAndSize(strPtr, dataPtrPtr, sizePtr), 0) self.assertEquals(CPyMarshal.ReadPtr(dataPtrPtr), dataPtr) self.assertEquals(CPyMarshal.ReadInt(sizePtr), len(testStr)) self.assertMapperHasError(mapper, None) self.assertEquals( mapper.PyString_AsStringAndSize(strPtr, dataPtrPtr, IntPtr.Zero), -1) self.assertMapperHasError(mapper, TypeError)