Commit 30e2346d authored by Stefan Behnel's avatar Stefan Behnel

Make cpdef methods overridable in Python classes with slots (which do not have a dict).

Closes #1771.
parent 616ad557
......@@ -28,6 +28,10 @@ Bugs fixed
* The directive ``language_level=3`` did not apply to the first token in the
source file. (Github issue #2230)
* Overriding cpdef methods did not work in Python subclasses with slots.
Note that this can have a performance impact on calls from Cython code.
(Github issue #1771)
Other changes
-------------
......
......@@ -4338,7 +4338,9 @@ class OverrideCheckNode(StatNode):
if self.py_func.is_module_scope:
code.putln("else {")
else:
code.putln("else if (unlikely(Py_TYPE(%s)->tp_dictoffset != 0)) {" % self_arg)
code.putln("else if (unlikely((Py_TYPE(%s)->tp_dictoffset != 0)"
" || (Py_TYPE(%s)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {" % (
self_arg, self_arg))
func_node_temp = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
self.func_node.set_cname(func_node_temp)
# need to get attribute manually--scope would return cdef method
......
# mode: run
# tag: cpdef
# ticket: gh-1771
cdef class BaseType:
"""
>>> BaseType().callmeth()
BaseType.meth
"""
def callmeth(self):
return self.meth()
cpdef meth(self):
print("BaseType.meth")
class PyClass(BaseType):
"""
>>> PyClass().callmeth()
PyClass.meth
"""
def meth(self):
print("PyClass.meth")
class PySlotsClass(BaseType):
"""
>>> PySlotsClass().callmeth()
PySlotsClass.meth
"""
__slots__ = []
def meth(self):
print("PySlotsClass.meth")
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment