[Cython] CF based type inference

mark florisson markflorisson88 at gmail.com
Tue May 21 15:45:29 CEST 2013


On 21 May 2013 14:41, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>
>
>
> 2013/5/21 mark florisson <markflorisson88 at gmail.com>
>>
>> On 21 May 2013 14:14, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>> >
>> >
>> >
>> > 2013/5/21 mark florisson <markflorisson88 at gmail.com>
>> >>
>> >> On 21 May 2013 11:26, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>> >> > Hi!
>> >> >
>> >> > Recently I've started work on new type inference engine. Now it's
>> >> > almost
>> >> > ready and I want to discuss it.
>> >> >
>> >> > It works like this: first infer type for each assignment then for
>> >> > whole
>> >> > entry. It has some advantages over previous algorithm:
>> >> >  - it handles assignment cycles, see test_swap() for example
>> >> >  - it can infer type using info about assignments on the whole entry:
>> >> >
>> >> > a = 1
>> >> > b = a
>> >> > a = "str"
>> >> >
>> >> > a is python object and b is integer.
>> >> >
>> >> > Here are testcases that show some new cases it can solve:
>> >> >
>> >> >
>> >> > https://github.com/vitek/cython/blob/_type_inference_new/tests/run/type_inference_new.pyx
>> >> >
>> >> > Here is branch for it
>> >> > https://github.com/vitek/cython/tree/_type_inference_new
>> >> >
>> >> > --
>> >> > vitja.
>> >> >
>> >> > _______________________________________________
>> >> > cython-devel mailing list
>> >> > cython-devel at python.org
>> >> > http://mail.python.org/mailman/listinfo/cython-devel
>> >> >
>> >>
>> >> Hey Vitja,
>> >>
>> >> Cool! How do you want to handle variable merge at control flow joins?
>> >> Would you promote (backwards incompatible), use a union type, or
>> >> object? E.g. what does this result in:
>> >>
>> >>     x = 0
>> >>     for i in range(N):
>> >>         x += 0.2 * i
>> >>     print typeof(x)
>> >
>> >
>> > Hi Mark,
>> >
>> > Nothing changed in your example old algorithm was able to handle this
>> > "simple" kind of cycles as well as new one:
>> >
>> > def foo(int N):
>> >     x = 0
>> >     for i in range(N):
>> >         x += 0.2 * i
>> >     print typeof(x)
>> >
>> > So this function (not that N is an integer here) will print 'dobule'.
>> >
>> > With new algorithm we can go further:
>> >
>> > def foo(int N):
>> >     x = 1
>> >     y = 0
>> >     for i in range(N):
>> >         x = x * 0.1 + y * 0.2
>> >         y = x * 0.3 + y * 0.4
>> >     print typeof(x), typeof(y)
>> >
>> > Here both x and y will be inferred as double
>> >
>>
>> Ok, so I assume it promotes the incoming types (all reaching
>> definitions)? If N == 0, then when using objects you get an int,
>> otherwise a double. What happens when the reaching types cannot be
>> promoted together? Do you fall back to object?
>
>
> Can you provide example please? And yes if type cannot be inferred it
> fallback to object.
>

Sure, e.g.

    if cond:
        x = 2
    else:
        x = "hello"
    use(x)

A tricky one is this:

    try:
        x = f() # let's say 'double'
        x = g() # let's say 'string'
    finally:
        print typeof(x) # what does this print if 'f' can raise an exception?

>
> --
> vitja.
>
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> http://mail.python.org/mailman/listinfo/cython-devel
>


More information about the cython-devel mailing list