[PyQt] sipConvertToInstance failing after sipCanConvertToInstance succeeds.

Diez B. Roggisch deets at web.de
Wed Jul 22 20:51:44 BST 2009


Phil Thompson schrieb:
> On Wed, 22 Jul 2009 20:13:45 +0200, "Diez B. Roggisch" <deets at web.de>
> wrote:
>> Phil Thompson schrieb:
>>> On Tue, 21 Jul 2009 11:07:19 +0200, "Diez B. Roggisch" <deets at web.de>
>>> wrote:
>>>> On Tuesday 21 July 2009 10:43:14 Phil Thompson wrote:
>>>>> On Tue, 21 Jul 2009 09:26:39 +0200, "Diez B. Roggisch" <deets at web.de>
>>>>>
>>>>> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> well, the subject pretty much says it. The below code exectutes fine
>>> in
>>>>>> the debugger until it reaches the line
>>>>>>
>>>>>> 	  irr::video::S3DVertex *vertex = (irr::video::S3DVertex
>>>>>> *)sipConvertToInstance(py_vertex, S3DVertexType, NULL, SIP_NOT_NONE,
>>>>>> NULL, &err);
>>>>>>
>>>>>>
>>>>>> where "err" then gets some seemingly random value & the program
>>>>>> terminates. The if-statement below the line doesn't work and was a
>>>>>> feeble attempt at error-handling - a subject that is given not much
>>>>>> more
>>>>>> information in the whole
>>>>>>
>>>>>> http://www.riverbankcomputing.com/static/Docs/sip4/c_api.html
>>>>>>
>>>>>> page.
>>>>>>
>>>>>> Any suggestions? Ah, python is 2.6 on osx, SIP is 4.7.9.
>>>>>>
>>>>>>
>>>>>> Diez
>>>>>>
>>>>>>
>>>>>> void append(SIP_PYLIST, SIP_PYLIST);
>>>>>> %MethodCode
>>>>>>        PyObject *py_vertices = a0;
>>>>>>        PyObject *py_indices = a1;
>>>>>>        irr::u32 numVertices = PyList_Size(py_vertices);
>>>>>>        irr::video::S3DVertex *vertices = (irr::video::S3DVertex
>>>>>> *)sipMalloc(sizeof(irr::video::S3DVertex) * numVertices);
>>>>>>        irr::u32 numIndices = PyList_Size(py_indices);
>>>>>>        irr::u16 *indices = (irr::u16*)sipMalloc(sizeof(irr::u16) *
>>>>>> numIndices);
>>>>>>
>>>>>>        sipWrapperType *S3DVertexType =
>>>>>> sipFindClass("irr::video::S3DVertex");
>>>>>>
>>>>>>        int err;
>>>>>>
>>>>>>        for(irr::u32 i=0; i < numVertices; i++) {
>>>>>> 	PyObject *py_vertex = PyList_GetItem(py_vertices, i);
>>>>>> 	if(sipCanConvertToInstance(py_vertex, S3DVertexType, SIP_NOT_NONE))
> {
>>>>>> 	  irr::video::S3DVertex *vertex = (irr::video::S3DVertex
>>>>>> *)sipConvertToInstance(py_vertex, S3DVertexType, NULL, SIP_NOT_NONE,
>>>>>> NULL, &err);
>>>>>> 	  if(err) {
>>>>>> 	    return -1;
>>>>>> 	  }
>>>>>> 	  vertices[i] = *vertex;
>>>>>> 	} // TODO: raise an exception here!
>>>>>>        }
>>>>>>
>>>>>>        for(irr::u32 i=0; i < numIndices; i++) {
>>>>>> 	PyObject *py_index = PySequence_GetItem(py_indices, i);
>>>>>> 	irr::u16 indices[3];
>>>>>> 	for(int j=0; j < 3; j++) {
>>>>>> 	  PyObject *item = PySequence_GetItem(py_index, j);
>>>>>> 	  if(PyLong_Check(item)) {
>>>>>> 	    indices[j] = (irr::u16)PyLong_AsLong(item);
>>>>>> 	  } else {
>>>>>> 	    // TODO: raise an exception here!
>>>>>> 	  }
>>>>>> 	}
>>>>>>        }
>>>>>>        sipCpp->append((void*)vertices, numVertices, indices,
>>>>>>        numIndices);
>>>>>>        sipFree(indices);
>>>>>>        sipFree(vertices);
>>>>>> %End
>>>>> What is S3DVertexType? I would expect it to start with 'sipClass_'.
>>>> It's a wrapped structure, with the original name
>>>> "irr::video::S3DVertex".
>>>> After reading the aforementioned docs, I was under the impression that
> I
>>>> need 
>>>> to get a sipTypeDef to check & convert. At least pointers of that kind
>>> are 
>>>> taken from sipConvertToInstance and sipCanConvertToInstance.
>>> It needs to be what the documentation calls a "generated type object"
>>> which
>>> all begin with "sipClass_" - probably sipClass_irr_video_S3DVertex in
>>> this
>>> case.
>> I did that, without any success - the behavior is the same. I get err 
>> set to the value "458520", and the program dies with an
> bus-error/segfault.
> 
> I missed your call to sipFindClass().

Ah, ok, I was wondering if sip changed so much. Good to know it didn't, 
but also good to know I can get a static reference & don't need the 
extra call.

> It's almost certainly a bug in your handwritten code somewhere - not
> necessarily in the code above.

I don't doubt that - I just don't find it... I created some test-code 
that toys around with S3DVertex-objecs, and all works fine. I can 
construct them, I can compare them using their overloaded ==-operator 
,which invokes

sipParseArgs(&sipArgsParsed,sipArg,"1JA",sipClass_irr_video_S3DVertex,&a0)

and that is working. I can access their members, some of them which are 
mapped types.

Do you have any idea how to go about this - can I build SIP in 
debug-mode, and then step into the conversion-code itself? How about 
building the extension in debug-mode - it does have the "-g"-flag, but 
also a -O3.


Diez


More information about the PyQt mailing list