[Cython] Control Flow

Stefan Behnel stefan_ml at behnel.de
Sat May 28 16:14:56 CEST 2011


Vitja Makarov, 28.05.2011 14:12:
> 2011/5/28 Stefan Behnel:
>> Ok, I think we're done then, right? Anything else to do before merging it
>> back?
>
> I hope so ;)

I gave your branch a test with lxml and it spit out a couple of missing 
initialisation warnings. Most of them were due to the usage of C out 
arguments, e.g.

     cdef Py_ssize_t step
     ...
     _PyEval_SliceIndex(sliceobject.step, &step)

Here, it doesn't matter that "step" isn't initialised. I guess it's still 
ok to get a warning, since it's not obvious that "step" will always be set 
by the function call.

Similarly:

     cdef void _receiveXSLTError(void* c_log_handler, char* msg, ...) nogil:
         cdef cstd.va_list args
         ...
         cstd.va_start(args, msg)

Cython now tells me that "args" isn't initialised. That's true again, 
although this is an even more special case here. I guess I'll have to live 
with that as well for now, maybe until there's dedicated va_list support in 
Cython.

Next, I got a crash in a part of code where I was manually releasing the 
GIL, but only conditionally, and Cython figured out that a variable wasn't 
initialised in one case and injected an exception. I would have liked to 
get a compile time warning here, but didn't. I assume that's because it was 
only a "may be used uninitialised", not a "is used uninitialised"?

I'm currently looking through the other issues. A major problem is that I 
often relied on Cython setting uninitialised variables to None, especially 
in performance critical code where I wanted to avoid double 
initialisations. Cython is smarter now, so this needs fixing in the code. 
I'm sure I'm not the only one who'll run into that, so more warnings would 
be very helpful.

Stefan


More information about the cython-devel mailing list