Commit eb0e4666 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 c7ed06e8
......@@ -10,6 +10,9 @@ Bugs fixed
* Set iteration was broken in non-CPython since 0.28.
* Overriding cpdef methods did not work in Python subclasses with slots.
(Github issue #1771)
0.28.2 (2018-04-13)
===================
......
......@@ -4337,7 +4337,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