[PyQt] sipConvertToInstance failing after sipCanConvertToInstance
succeeds.
Phil Thompson
phil at riverbankcomputing.com
Wed Jul 22 19:46:34 BST 2009
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().
It's almost certainly a bug in your handwritten code somewhere - not
necessarily in the code above.
Phil
More information about the PyQt
mailing list