[pypy-commit] pypy cpyext-ext: add protective hack to work around PyString_Type missing a ob_type reference, give up writing a test to properly fix it

mattip pypy.commits at gmail.com
Tue Jan 5 16:19:19 EST 2016


Author: mattip <matti.picus at gmail.com>
Branch: cpyext-ext
Changeset: r81595:d32637ebd6d9
Date: 2016-01-05 01:11 +0200
http://bitbucket.org/pypy/pypy/changeset/d32637ebd6d9/

Log:	add protective hack to work around PyString_Type missing a ob_type
	reference, give up writing a test to properly fix it

diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -514,7 +514,7 @@
     pto.c_tp_basicsize = -1 # hopefully this makes malloc bail out
     pto.c_tp_itemsize = 0
     # uninitialized fields:
-    # c_tp_print, c_tp_getattr, c_tp_setattr
+    # c_tp_print
     # XXX implement
     # c_tp_compare and the following fields (see http://docs.python.org/c-api/typeobj.html )
     w_base = best_base(space, w_type.bases_w)
@@ -605,9 +605,14 @@
 
     finish_type_1(space, py_type)
 
-    w_metatype = from_ref(space, rffi.cast(PyObject, py_type.c_ob_type))
+    if py_type.c_ob_type:
+        w_metatype = from_ref(space, rffi.cast(PyObject, py_type.c_ob_type))
+    else: 
+        # Somehow the tp_base type is created with no ob_type, notably
+        # PyString_Type and PyBaseString_Type
+        # While this is a hack, cpython does it as well.
+        w_metatype = space.w_type
 
-    assert w_metatype # XXX in numpy initmultiarray, py_type.c_ob_type is 0
     w_obj = space.allocate_instance(W_PyCTypeObject, w_metatype)
     track_reference(space, py_obj, w_obj)
     w_obj.__init__(space, py_type)


More information about the pypy-commit mailing list