[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