Hi,
The first function below "in_range" works fine (the last line
generates a call to PyObject_SetItem) but the "out_of_range" function
does not. The last line in it generates a call to PyList_SetItem as
it should, but the 'ob' PyObject is not converted to a Py_ssize_t.
[590]$ cat _out_of_range.pyx
def in_range():
lst = range(11)
ob = 10
lst[ob] = -10
def out_of_range():
cdef list lst = range(11)
ob = 10
lst[ob] = -10
Compiling raises a warning, as it should:
[591]$ python setup.py build_ext --inplace
running build_ext
cythoning _out_of_range.pyx to _out_of_range.c
building '_out_of_range' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall
-Wstrict-prototypes -fPIC -I/usr/include/python2.5 -c _out_of_range.c
-o build/temp.linux-x86_64-2.5/_out_of_range.o
_out_of_range.c: In function ‘__pyx_pf_13_out_of_range_out_of_range’:
_out_of_range.c:429: warning: passing argument 2 of ‘PyList_SetItem’
makes integer from pointer without a cast
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions
build/temp.linux-x86_64-2.5/_out_of_range.o -o _out_of_range.so
And calling it raises the exception:
[592]$ python out_of_range.py
after in_range
Traceback (most recent call last):
File "out_of_range.py", line 5, in <module>
_out_of_range.out_of_range()
File "_out_of_range.pyx", line 9, in _out_of_range.out_of_range
(_out_of_range.c:429)
lst[ob] = -10
IndexError: list assignment index out of range
[593]$ cat out_of_range.py
import _out_of_range
_out_of_range.in_range()
print "after in_range"
_out_of_range.out_of_range()
print "after out_of_range"
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev