[Cython] Type inference and C++
Stefan Behnel
stefan_ml at behnel.de
Tue Jul 24 14:33:08 CEST 2012
Stefan Behnel, 24.07.2012 12:43:
> Vitja Makarov, 23.07.2012 07:13:
>> Here is part of original testcase:
>>
>> from cython.operator cimport dereference as d
>> from cython.operator cimport preincrement as incr
>> from libcpp.vector cimport vector
>>
>> def reverse_iteration_test(L):
>> v = new vector[int]()
>> for a in L:
>> v.push_back(a)
>> it = v.rbegin()
>> while it != v.rend():
>> a = d(it)
>> incr(it)
>> print(a)
>>
>> It doesn't work with local type inference enabled since `a` in
>> for-loop is infered as pyobject and in while loop it's inferred as
>> reverse_iterator.
>>
>> Then I tried to comment out for loop and compile it with
>> upstream/master, same error here:
>>
>> note: cpp_stl_vector.pyx:8:6: inferred 'v' to be of type 'vector[int] *'
>> note: cpp_stl_vector.pyx:11:7: inferred 'it' to be of type 'reverse_iterator'
>> note: cpp_stl_vector.pyx:13:10: inferred 'a' to be of type 'reverse_iterator'
>>
>> Error compiling Cython file:
>> ------------------------------------------------------------
>> ...
>> v = new vector[int]()
>> #for a in L:
>> # v.push_back(a)
>> it = v.rbegin()
>> while it != v.rend():
>> a = d(it)
>> ^
>> ------------------------------------------------------------
>>
>> cpp_stl_vector.pyx:13:13: Cannot assign type 'int &' to 'reverse_iterator'
>>
>> Error compiling Cython file:
>> ------------------------------------------------------------
>> ...
>> # v.push_back(a)
>> it = v.rbegin()
>> while it != v.rend():
>> a = d(it)
>> incr(it)
>> print(a)
>> ^
>> ------------------------------------------------------------
>>
>> cpp_stl_vector.pyx:15:15: Cannot convert 'reverse_iterator' to Python object
>>
>>
>> I think it's not correct to infer `a` as reverse_iterator because it's
>> not an iterator it's vector's item.
>
> Right. DereferenceNode should implement infer_type().
... and not only DereferenceNode. Pretty much all C++ operators do not
properly implement type inference. I'll take a look.
Stefan
More information about the cython-devel
mailing list