cython
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)
100
11"""
12cpdef rec(self, int i):
13return 0 if i < 0 else self.rec(i-1)
14
15
16class Py(Ext):
17"""
18>>> p = Py()
19>>> p.rec(10)
200
21"""
22pass
23
24
25class Slots(Ext):
26"""
27>>> s = Slots()
28>>> s.rec(10)
290
30"""
31__slots__ = ()
32
33
34class PyOverride(Ext):
35"""
36>>> p = PyOverride()
37>>> p.rec(10)
3810
395
40>>> p.rec(12)
4112
4211
4310
445
45"""
46def rec(self, i):
47print(i)
48return Ext.rec(self, i) if i > 10 else 5
49
50
51class SlotsOverride(Ext):
52"""
53>>> s = SlotsOverride()
54>>> s.rec(10)
5510
566
57>>> s.rec(12)
5812
5911
6010
616
62"""
63__slots__ = ()
64def rec(self, i):
65print(i)
66return Ext.rec(self, i) if i > 10 else 6
67