[PyQt] sipConvertToInstance failing after sipCanConvertToInstance succeeds.

Diez B. Roggisch deets at web.de
Tue Jul 21 08:26:39 BST 2009


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


More information about the PyQt mailing list