[Pyrex] SystemError: error return without exception set
Gary Bishop
gb at cs.unc.edu
Thu Apr 1 17:39:11 CEST 2004
I think I may have found a bug in pyrex 0.9 on WindowsXP. I'm writing a
__setitem__ handler for my extension class. When I run it, I get
"SystemError: error return without exception set". Looking at the
generated C, I see that __pyx_r is apparently the return value and it
is not initialized. It gets set near the bottom of the C function like this:
__pyx_L30:;
__pyx_r = 0;
goto __pyx_L0;
__pyx_L1:;
Py_XDECREF(__pyx_3);
Py_XDECREF(__pyx_4);
__Pyx_AddTraceback("fmatrix.fmatrix.__setitem__");
__pyx_r = -1;
__pyx_L0:;
Py_DECREF(__pyx_v_avalue);
Py_DECREF(__pyx_v_r);
Py_DECREF(__pyx_v_c);
Py_DECREF(__pyx_v_self);
Py_DECREF(__pyx_v_key);
Py_DECREF(__pyx_v_value);
return __pyx_r;
I'm guessing that a normal return should goto __pyx_L30, and an error
return should goto __pyx_L1.
In my pyrex code I say:
if PyInt_Check(key): # int index, simple and common
i = key
if i < 0:
i = i + self.len
if 0 <= i < self.len:
if svalue:
self.base[i] = fvalue
return
else:
raise TypeError
else:
raise IndexError
The return gets translated into "goto __pyx_L0;" which skips the
initialization of __pyx_r. I verified this by hacking the C code to
initialize __pyx_r = 0 when it is declared. Then the function works as
expected. So the problem *may* be that __pyx_r was supposed to be set
before the goto, or it may be that the goto was supposed to be to
__pyx_L30 instead of 0.
I can try to boil the code down to the minimum error producing subset
if you need it.
gb
More information about the Pyrex
mailing list