[Cython] non-virtual methods

Stefan Behnel stefan_ml at behnel.de
Thu Aug 25 20:58:03 CEST 2011

Vitja Makarov, 25.08.2011 20:32:
> 2011/8/25 Stefan Behnel<stefan_ml at behnel.de>:
>> Vitja Makarov, 25.08.2011 18:11:
>>> 2011/8/24 Stefan Behnel:
>>>> Vitja Makarov, 24.08.2011 21:17:
>>>>> I tried final classes:
>>>>> 2. In this example foo call is done through virtual table
>>>>> cimport cython
>>>>> @cython.final
>>>>> cdef class Foo:
>>>>>      cdef foo(self):
>>>>>          print 'haha'
>>>>> def test():
>>>>>      cdef Foo a = Foo()
>>>>>      a.foo()
>>>>>    __pyx_t_1 = ((struct __pyx_vtabstruct_3yyy_Foo
>>>>> *)__pyx_v_a->__pyx_vtab)->foo(__pyx_v_a); if (unlikely(!__pyx_t_1))
>>>>> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno =
>>>>> __LINE__; goto __pyx_L1_error;}
>>>> Right, this is not implemented yet. Feel free to do so. Also see
>>>> http://trac.cython.org/cython_trac/ticket/474
>>>>> 3. I can't use final decorator for methods (error reported)
>>>> http://trac.cython.org/cython_trac/ticket/586
>>> What is the prefered syntax keyword inline or final decorator?
>> "final" is the right option here.
>> They are orthogonal concepts. Only because you declare a method "final" does
>> not mean you want to inline it, and just because you declare it "inline"
>> does not (necessarily) mean that you cannot override it. Admittedly, the
>> semantics of an overridable inline method may turn out to be somewhat
>> obscure and error prone, so I think it's a good idea to let "inline" imply
>> "final". But not the other way round.
> But both inline and final methods should bypass vtab, right?

Yes. But in the "final" case, it's always clear which method implementation 
to use - it's not overridable, so there is only one choice. In the "inline" 
case, it could still be overridable and we may have a subtype of the 
declared type in our hands at runtime, thus choosing the wrong method at 
compile time. That's why only the "final" case is safe.

Note that I'm only talking about the semantics of the qualifier themselves 
here. If we allow "inline" methods, I think we should force them to be 
"final" as well. But that's a practical choice, not a semantic implication.

> Also I'm not sure about C inline qualifier here.

That's what "inline" requests.

> I see three options:
>   - non-virtual: bypass vtab
>   - final: non-virtual, non-overridable

How would you want to bypass the vtable in the "non-virtual" case if the 
method is overridable?

>   - inline: non-virtual, C inline qualifier is used



More information about the cython-devel mailing list