[Cython] non-virtual methods

Vitja Makarov vitja.makarov at gmail.com
Thu Aug 25 20:32:19 CEST 2011


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? Also I'm
not sure about C inline qualifier here.

I see three options:

 - non-virtual: bypass vtab
 - final: non-virtual, non-overridable
 - inline: non-virtual, C inline qualifier is used

-- 
vitja.


More information about the cython-devel mailing list