From 764498b3d033a1c947a40dc1b2237e81b674992b Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Mon, 11 Sep 2017 13:36:35 +0200 Subject: Implement proper void pointer (void*) support This change introduces a new type into the shiboken2 module which is imported by calling "import PySide2.support.VoidPtr". The type takes care of conversions from / to void* values in function signatures. Creating an instance can be done by passing either a shiboken wrapped object, or an integer representing an address, or a python object that implements the buffer interface. For example, this is useful for passing numpy arrays to C OpenGL functions that take void* parameters. First you convert the array into a bytestring (using numpy.array.tobytes(), then you instantiate a VoidPtr from that bytestring, and finally you pass it along to a GL function. One corner case that is currently not supported is void** parameters. Change-Id: I01e291d6856cb6bd8b5175adc3ead6b728036535 Reviewed-by: Christian Tismer --- .../shiboken2/tests/samplebinding/voidholder_test.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'sources/shiboken2/tests/samplebinding/voidholder_test.py') diff --git a/sources/shiboken2/tests/samplebinding/voidholder_test.py b/sources/shiboken2/tests/samplebinding/voidholder_test.py index cb5cab6e5..6e841684b 100644 --- a/sources/shiboken2/tests/samplebinding/voidholder_test.py +++ b/sources/shiboken2/tests/samplebinding/voidholder_test.py @@ -34,21 +34,29 @@ import unittest from sample import VoidHolder, Point +import shiboken2 as shiboken class VoidHolderTest(unittest.TestCase): '''Test case for void pointer manipulation.''' def testGetVoidPointerFromCppAndPutsOnVoidHolder(self): - '''Passes a void pointer created in C++ and to kept by VoidHolder.''' + '''Passes a void pointer created in C++ to be kept by VoidHolder.''' voidptr = VoidHolder.gimmeMeSomeVoidPointer() voidholder = VoidHolder(voidptr) self.assertEqual(voidptr, voidholder.voidPointer()) + def testPassVoidPointerAsArgument(self): + '''Passes a void pointer created in C++ as an argument to a function.''' + voidptr = VoidHolder.gimmeMeSomeVoidPointer() + voidHolder = VoidHolder() + returnValue = voidHolder.takeVoidPointer(voidptr) + self.assertEqual(returnValue, voidptr) + def testPutRandomObjectInsideVoidHolder(self): '''Passes a C++ pointer for an object created in Python to be kept by VoidHolder.''' obj = Point(1, 2) voidholder = VoidHolder(obj) - self.assertEqual(obj, voidholder.voidPointer()) + self.assertEqual(shiboken.getCppPointer(obj)[0], int(voidholder.voidPointer())) def testGetNoneObjectFromVoidHolder(self): '''A VoidHolder created without parameters returns a NULL pointer @@ -56,14 +64,6 @@ class VoidHolderTest(unittest.TestCase): voidholder = VoidHolder() self.assertEqual(voidholder.voidPointer(), None) - def testPutPythonObjectInsideVoidHolder(self): - '''Passes a native Python object to be kept by VoidHolder.''' - obj = 'Foo' - voidholder = VoidHolder(obj) - self.assertEqual(obj, voidholder.voidPointer()) - - - if __name__ == '__main__': unittest.main() -- cgit v1.2.3