Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3.5 Changeset: r92521:45380b7b402f Date: 2017-09-30 00:42 +0200 http://bitbucket.org/pypy/pypy/changeset/45380b7b402f/
Log: hg merge default diff --git a/pypy/doc/release-v5.9.0.rst b/pypy/doc/release-v5.9.0.rst --- a/pypy/doc/release-v5.9.0.rst +++ b/pypy/doc/release-v5.9.0.rst @@ -148,8 +148,7 @@ * Issue 2590_: fix the bounds in the GC when allocating a lot of objects with finalizers * Replace magical NOT RPYTHON comment with a decorator * Implement ``socket.sendmsg()``/``.recvmsg()`` for py3.5 - * Reduce excessive ``memory_pressure`` for ``_SSLContext`` objects and add - ``memory_pressure`` for ``_SSLSocket`` objects + * Add ``memory_pressure`` for ``_SSLSocket`` objects * Degredations diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -669,6 +669,10 @@ 'PySlice_Type': 'space.gettypeobject(W_SliceObject.typedef)', 'PyStaticMethod_Type': 'space.gettypeobject(StaticMethod.typedef)', 'PyCFunction_Type': 'space.gettypeobject(cpyext.methodobject.W_PyCFunctionObject.typedef)', + 'PyClassMethodDescr_Type': 'space.gettypeobject(cpyext.methodobject.W_PyCClassMethodObject.typedef)', + 'PyGetSetDescr_Type': 'space.gettypeobject(cpyext.typeobject.W_GetSetPropertyEx.typedef)', + 'PyMemberDescr_Type': 'space.gettypeobject(cpyext.typeobject.W_MemberDescr.typedef)', + 'PyMethodDescr_Type': 'space.gettypeobject(cpyext.methodobject.W_PyCMethodObject.typedef)', 'PyWrapperDescr_Type': 'space.gettypeobject(cpyext.methodobject.W_PyCWrapperObject.typedef)', 'PyInstanceMethod_Type': 'space.gettypeobject(cpyext.classobject.InstanceMethod.typedef)', }.items(): diff --git a/pypy/module/cpyext/test/test_typeobject.py b/pypy/module/cpyext/test/test_typeobject.py --- a/pypy/module/cpyext/test/test_typeobject.py +++ b/pypy/module/cpyext/test/test_typeobject.py @@ -1362,6 +1362,11 @@ assert B() == 42 + # aaaaa even more hackiness + class C(A): + pass + C(42) # assert is not aborting + class AppTestHashable(AppTestCpythonExtensionBase): def test_unhashable(self): diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py --- a/pypy/objspace/std/typeobject.py +++ b/pypy/objspace/std/typeobject.py @@ -682,14 +682,30 @@ # it can fail if self.__base__ happens not to be the first base. # from pypy.module.cpyext.methodobject import W_PyCFunctionObject + + if isinstance(w_newdescr, W_PyCFunctionObject): + return self._really_hack_which_new_to_call(w_newtype, w_newdescr) + else: + return w_newtype, w_newdescr + + def _really_hack_which_new_to_call(self, w_newtype, w_newdescr): + # This logic is moved in yet another helper function that + # is recursive. We call this only if we see a + # W_PyCFunctionObject. That's a performance optimization + # because in the common case, we won't call any function that + # contains the stack checks. + from pypy.module.cpyext.methodobject import W_PyCFunctionObject from pypy.module.cpyext.typeobject import is_tp_new_wrapper if (isinstance(w_newdescr, W_PyCFunctionObject) and + w_newtype is not self and is_tp_new_wrapper(self.space, w_newdescr.ml)): w_bestbase = find_best_base(self.bases_w) - return w_bestbase.lookup_where('__new__') - else: - return w_newtype, w_newdescr + if w_bestbase is not None: + w_newtype, w_newdescr = w_bestbase.lookup_where('__new__') + return w_bestbase._really_hack_which_new_to_call(w_newtype, + w_newdescr) + return w_newtype, w_newdescr def descr_repr(self, space): w_mod = self.get_module() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit