Author: Armin Rigo <ar...@tunes.org> Branch: cpyext-gc-support-2 Changeset: r81962:834fd655953d Date: 2016-01-27 00:26 +0100 http://bitbucket.org/pypy/pypy/changeset/834fd655953d/
Log: probably fixed by moving this part of the code later (this is part of an attempt at simplifying the bootstrapping logic in init_typeobject, will see how far this theory goes or if I need to really reproduce it again) 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 @@ -468,20 +468,13 @@ PyObject_Del.api_func.get_wrapper(space)) pto.c_tp_alloc = llhelper(PyType_GenericAlloc.api_func.functype, PyType_GenericAlloc.api_func.get_wrapper(space)) - if pto.c_tp_flags & Py_TPFLAGS_HEAPTYPE: - w_typename = space.getattr(w_type, space.wrap('__name__')) - heaptype = rffi.cast(PyHeapTypeObject, pto) - heaptype.c_ht_name = get_pyobj_and_incref(space, w_typename) - from pypy.module.cpyext.stringobject import PyString_AsString - pto.c_tp_name = PyString_AsString(space, heaptype.c_ht_name) - else: - pto.c_tp_name = rffi.str2charp(w_type.name) # uninitialized fields: # c_tp_print, c_tp_getattr, c_tp_setattr # 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) - pto.c_tp_base = rffi.cast(PyTypeObjectPtr, make_ref(space, w_base)) + py_base = get_pyobj_and_incref(space, w_base) + pto.c_tp_base = rffi.cast(PyTypeObjectPtr, py_base) finish_type_1(space, pto) finish_type_2(space, pto, w_type) @@ -496,6 +489,16 @@ if space.is_w(w_type, space.w_object): pto.c_tp_new = rffi.cast(newfunc, 1) update_all_slots(space, w_type, pto) + + if pto.c_tp_flags & Py_TPFLAGS_HEAPTYPE: + w_typename = space.getattr(w_type, space.wrap('__name__')) + heaptype = rffi.cast(PyHeapTypeObject, pto) + heaptype.c_ht_name = get_pyobj_and_incref(space, w_typename) + from pypy.module.cpyext.stringobject import PyString_AsString + pto.c_tp_name = PyString_AsString(space, heaptype.c_ht_name) + else: + pto.c_tp_name = rffi.str2charp(w_type.name) + pto.c_tp_flags |= Py_TPFLAGS_READY return pto @@ -562,8 +565,7 @@ if not py_type.c_tp_base: # borrowed reference, but w_object is unlikely to disappear - base = make_ref(space, space.w_object) - Py_DecRef(space, base) + base = as_pyobj(space, space.w_object) py_type.c_tp_base = rffi.cast(PyTypeObjectPtr, base) finish_type_1(space, py_type) @@ -597,7 +599,7 @@ bases = space.newtuple([]) else: bases = space.newtuple([from_ref(space, base_pyo)]) - pto.c_tp_bases = make_ref(space, bases) + pto.c_tp_bases = get_pyobj_and_incref(space, bases) def finish_type_2(space, pto, w_obj): """ _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit