Author: Armin Rigo <[email protected]>
Branch:
Changeset: r90746:7d81a8c7bdae
Date: 2017-03-18 16:20 +0100
http://bitbucket.org/pypy/pypy/changeset/7d81a8c7bdae/
Log: Issue #2504: PyClass_New() can be called with NULL as its first
argument
diff --git a/pypy/module/cpyext/classobject.py
b/pypy/module/cpyext/classobject.py
--- a/pypy/module/cpyext/classobject.py
+++ b/pypy/module/cpyext/classobject.py
@@ -39,6 +39,8 @@
@cpython_api([PyObject, PyObject, PyObject], PyObject)
def PyClass_New(space, w_bases, w_dict, w_name):
+ if w_bases is None:
+ w_bases = space.newtuple([])
w_classobj = space.gettypefor(W_ClassObject)
return space.call_function(w_classobj,
w_name, w_bases, w_dict)
diff --git a/pypy/module/cpyext/test/test_classobject.py
b/pypy/module/cpyext/test/test_classobject.py
--- a/pypy/module/cpyext/test/test_classobject.py
+++ b/pypy/module/cpyext/test/test_classobject.py
@@ -77,3 +77,15 @@
class C:
pass
assert module.get_classtype() is type(C)
+
+ def test_pyclass_new_no_bases(self):
+ module = self.import_extension('foo', [
+ ("new_foo", "METH_O",
+ """
+ return PyClass_New(NULL, PyDict_New(), args);
+ """)])
+ FooClass = module.new_foo("FooClass")
+ class Cls1:
+ pass
+ assert type(FooClass) is type(Cls1)
+ assert FooClass.__bases__ == Cls1.__bases__
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit