Author: Armin Rigo <ar...@tunes.org>
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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to