[PySide] Shiboken not generating right code for member pointers?
John Cummings
jcummings2 at users.sf.net
Tue Oct 23 15:35:55 CEST 2012
On 10/22/2012 09:19 AM, Luiz Vitor Martinez Cardoso wrote:
> Anyone?
>
> On Sun, Oct 14, 2012 at 3:54 PM, Luiz Vitor Martinez Cardoso
> <grabber at gmail.com <mailto:grabber at gmail.com>> wrote:
>
> Dear,
>
> I'm new to PySide/Shiboken but I'm enjoying it!
>
> To be honest I don't like the lack of good and reasonable documentation
> and examples.
>
> I decided to create a git repo
> (https://github.com/Grabber/shiboken-binding-examples) together my friend
> /Yann Lanthony /to archive all the solutions we get to work in our lab. At
> the end we plan to write a very detailed and extensive article including
> everything from the installation (Win, OSX and Linux) to the binding
> process itself.
>
> Today the master's help to solve a little trouble.
>
> I'm trying to wrap the following code:
>
> class LIBFOO_EXPORT CustomType
> {
>
> public:
> CustomType() {}
> virtual ~CustomType() {}
> CustomType(const CustomType&) {}
> int a;
> int * b;
> };
>
>
> Using the following TypeSystem:
>
> <?xml version="1.0"?>
> <typesystem package="foo">
> <primitive-type name="int"/>
> <load-typesystem name="typesystem_core.xml" generate="no"/>
> <object-type name="CustomType" />
> </typesystem>
>
>
> But I'm getting some pointers erros in the generated wrapping code:
>
> /home/lmvc/Projects/shiboken-binding-examples/build/foo/foo/customtype_wrapper.cpp:
> In function 'PyObject* Sbk_CustomType_get_b(PyObject*, void*)':
> /home/lmvc/Projects/shiboken-binding-examples/build/foo/foo/customtype_wrapper.cpp:166:33:
> error: invalid conversion from 'int*' to 'int' [-fpermissive]
> /home/lmvc/Projects/shiboken-binding-examples/build/foo/foo/customtype_wrapper.cpp:
> In function 'int Sbk_CustomType_set_b(PyObject*, PyObject*, void*)':
> /home/lmvc/Projects/shiboken-binding-examples/build/foo/foo/customtype_wrapper.cpp:187:33:
> error: invalid conversion from 'int*' to 'int' [-fpermissive]
> /home/lmvc/Projects/shiboken-binding-examples/build/foo/foo/customtype_wrapper.cpp:189:18:
> error: invalid conversion from 'int' to 'int*' [-fpermissive]
> make[2]: *** [foo/CMakeFiles/foo.dir/foo/customtype_wrapper.cpp.o] Error 1
>
>
>
> The generated wrapping code was:
>
> static PyObject* Sbk_CustomType_get_b(PyObject* self, void*)
> {
> ::CustomType* cppSelf = 0;
> SBK_UNUSED(cppSelf)
> if (!Shiboken::Object::isValid(self))
> return 0;
> cppSelf =
> ((::CustomType*)Shiboken::Conversions::cppPointer(SbkfooTypes[SBK_CUSTOMTYPE_IDX],
> (SbkObject*)self));
> int cppOut_local = cppSelf->b;
> PyObject* pyOut =
> Shiboken::Conversions::copyToPython(Shiboken::Conversions::PrimitiveTypeConverter<int>(),
> &cppOut_local);
> return pyOut;
> }
> static int Sbk_CustomType_set_b(PyObject* self, PyObject* pyIn, void*)
> {
> ::CustomType* cppSelf = 0;
> SBK_UNUSED(cppSelf)
> if (!Shiboken::Object::isValid(self))
> return 0;
> cppSelf =
> ((::CustomType*)Shiboken::Conversions::cppPointer(SbkfooTypes[SBK_CUSTOMTYPE_IDX],
> (SbkObject*)self));
> if (pyIn == 0) {
> PyErr_SetString(PyExc_TypeError, "'b' may not be deleted");
> return -1;
> }
> PythonToCppFunc pythonToCpp;
> if (!(pythonToCpp =
> Shiboken::Conversions::isPythonToCppConvertible(Shiboken::Conversions::PrimitiveTypeConverter<int>(),
> (pyIn)))) {
> PyErr_SetString(PyExc_TypeError, "wrong type attributed to
> 'b', 'int' or convertible type expected");
> return -1;
> }
> int cppOut_local = cppSelf->b;
> pythonToCpp(pyIn, &cppOut_local);
> cppSelf->b = cppOut_local;
> return 0;
> }
>
>
>
> Could someone tell me what is going on? I feel I have to inject some code
> in TypeSystem but I don't know well...
>
> I appreciate your help!
> Best regards,
> Luiz Vitor.
>
Luiz,
I'm not certain, but since no one else jumped in, I believe it relates to int
being a primitive type. That is, it maps the types directly instead of using an
opaque pointer. I seem to recall there being similar issues [1] for me when I
tried to have a member array of primitives (which in C/C++ can be thought of as
a glorified pointer). The summary of the answer had to do with not being able to
keep track of updates to the pointer, or something like that.
I believe types specified as "value-type" are similar in that they are passed by
value.
Perhaps someone more knowledgeable can correct my simplistic answers.
Hope that helps
John Cummings
[1] http://thread.gmane.org/gmane.comp.lib.qt.pyside/2331/focus=2332
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20121023/901dd149/attachment.html>
More information about the PySide
mailing list