1# mode: run
2# tag: cpdef
3
4# This also makes a nice benchmark for the cpdef method call dispatching code.
5
6cdef class Ext:
7    """
8    >>> x = Ext()
9    >>> x.rec(10)
10    0
11    """
12    cpdef rec(self, int i):
13        return 0 if i < 0 else self.rec(i-1)
14
15
16class Py(Ext):
17    """
18    >>> p = Py()
19    >>> p.rec(10)
20    0
21    """
22    pass
23
24
25class Slots(Ext):
26    """
27    >>> s = Slots()
28    >>> s.rec(10)
29    0
30    """
31    __slots__ = ()
32
33
34class PyOverride(Ext):
35    """
36    >>> p = PyOverride()
37    >>> p.rec(10)
38    10
39    5
40    >>> p.rec(12)
41    12
42    11
43    10
44    5
45    """
46    def rec(self, i):
47        print(i)
48        return Ext.rec(self, i) if i > 10 else 5
49
50
51class SlotsOverride(Ext):
52    """
53    >>> s = SlotsOverride()
54    >>> s.rec(10)
55    10
56    6
57    >>> s.rec(12)
58    12
59    11
60    10
61    6
62    """
63    __slots__ = ()
64    def rec(self, i):
65        print(i)
66        return Ext.rec(self, i) if i > 10 else 6
67