[Cython] CF based type inference

Vitja Makarov vitja.makarov at gmail.com
Wed May 9 15:16:25 CEST 2012


2012/5/9 Vitja Makarov <vitja.makarov at gmail.com>:
> 2012/5/9 Vitja Makarov <vitja.makarov at gmail.com>:
>> 2012/5/9 mark florisson <markflorisson88 at gmail.com>:
>>> On 9 May 2012 13:39, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>>>> 2012/5/9 Vitja Makarov <vitja.makarov at gmail.com>:
>>>>> 2012/5/9 Stefan Behnel <stefan_ml at behnel.de>:
>>>>>> Stefan Behnel, 08.05.2012 14:24:
>>>>>>> Vitja has rebased the type inference on the control flow
>>>>>>
>>>>>> On a related note, is this fixable now?
>>>>>>
>>>>>>  def test():
>>>>>>      x = 1    # inferred as int
>>>>>>      del x    # error: Deletion of non-Python, non-C++ object
>>>>>>
>>>>>> http://trac.cython.org/cython_trac/ticket/768
>>>>>>
>>>>>> It might be enough to infer "object" for names that are being del-ed for
>>>>>> now, and to fix "del" The Right Way when we split entries.
>>>>>>
>>>>>
>>>>> Do you mean that `x` should be inferred as "python object" in your example?
>>>>>
>>>>> Yes, we may add workaround for del <unspecified_type> case.
>>>>> Del is represented now by NameDeletion with the same rhs and lhs.
>>>>>
>>>>> We can add method infer_type() to NameAssignment and use it instead of
>>>>> Node.infer_type()
>>>>>
>>>>>
>>>>
>>>> Here I've tried to fix it, now deletion always infers as python_object
>>>>
>>>> https://github.com/vitek/cython/commit/225c9c60bed6406db46e87da31596e053056f8b7
>>>>
>>>>
>>>> That may break C++ object deletion
>>>>
>>>
>>> Memoryviews can be deleted as well.
>>
>>
>> That code is run for entries with unspecified_type only
>>
>>
>
> Yeah, this code doesn't work now:
>
> cdef extern from "foo.h":
>    cdef cppclass Foo:
>        Foo()
>
> def foo():
>    foo = new Foo()
>    print typeof(foo)
>    del foo
>
> And I'm not sure how to fix it.

I've fixed cppclasses:

https://github.com/vitek/cython/commit/f5acf44be0f647bdcbb5a23c8bfbceff48f4414e

About memoryviews:

from cython cimport typeof

def foo(float[::1] a):
    b = a
    #del b
    print typeof(b)
    print typeof(a)


In this example `b` is inferred as 'Python object' and not
`float[::1]`, is that correct?

-- 
vitja.


More information about the cython-devel mailing list