[PyQt] sipConvertToInstance failing after sipCanConvertToInstance succeeds.

Phil Thompson phil at riverbankcomputing.com
Tue Jul 21 10:21:59 BST 2009


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.

Phil


More information about the PyQt mailing list