Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: Changeset: r83612:17abc9ee7546 Date: 2016-04-12 13:44 +0200 http://bitbucket.org/pypy/pypy/changeset/17abc9ee7546/
Log: cpyext: Fix the signature of PyMember_GetOne, it takes a const char* (even if everybody passes PyObject*) diff --git a/pypy/module/cpyext/structmember.py b/pypy/module/cpyext/structmember.py --- a/pypy/module/cpyext/structmember.py +++ b/pypy/module/cpyext/structmember.py @@ -2,7 +2,7 @@ from pypy.interpreter.typedef import TypeDef, GetSetProperty from rpython.rtyper.lltypesystem import rffi, lltype from pypy.module.cpyext.structmemberdefs import * -from pypy.module.cpyext.api import ADDR, PyObjectP, cpython_api +from pypy.module.cpyext.api import ADDR, PyObjectP, cpython_api, CONST_STRING from pypy.module.cpyext.intobject import PyInt_AsLong, PyInt_AsUnsignedLong from pypy.module.cpyext.pyerrors import PyErr_Occurred from pypy.module.cpyext.pyobject import PyObject, Py_DecRef, from_ref, make_ref @@ -34,7 +34,7 @@ _HEADER = 'pypy_structmember_decl.h' -@cpython_api([PyObject, lltype.Ptr(PyMemberDef)], PyObject, header=_HEADER) +@cpython_api([CONST_STRING, lltype.Ptr(PyMemberDef)], PyObject, header=_HEADER) def PyMember_GetOne(space, obj, w_member): addr = rffi.cast(ADDR, obj) addr += w_member.c_offset @@ -85,7 +85,7 @@ return w_result -@cpython_api([PyObject, lltype.Ptr(PyMemberDef), PyObject], rffi.INT_real, +@cpython_api([rffi.CCHARP, lltype.Ptr(PyMemberDef), PyObject], rffi.INT_real, error=-1, header=_HEADER) def PyMember_SetOne(space, obj, w_member, w_value): addr = rffi.cast(ADDR, obj) 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 @@ -271,17 +271,32 @@ def member_getter(self, space, w_self): assert isinstance(self, W_MemberDescr) check_descr(space, w_self, self.w_type) - return PyMember_GetOne(space, w_self, self.member) + pyref = make_ref(space, w_self) + try: + return PyMember_GetOne( + space, rffi.cast(rffi.CCHARP, pyref), self.member) + finally: + Py_DecRef(space, pyref) def member_delete(self, space, w_self): assert isinstance(self, W_MemberDescr) check_descr(space, w_self, self.w_type) - PyMember_SetOne(space, w_self, self.member, None) + pyref = make_ref(space, w_self) + try: + PyMember_SetOne( + space, rffi.cast(rffi.CCHARP, pyref), self.member, None) + finally: + Py_DecRef(space, pyref) def member_setter(self, space, w_self, w_value): assert isinstance(self, W_MemberDescr) check_descr(space, w_self, self.w_type) - PyMember_SetOne(space, w_self, self.member, w_value) + pyref = make_ref(space, w_self) + try: + PyMember_SetOne( + space, rffi.cast(rffi.CCHARP, pyref), self.member, w_value) + finally: + Py_DecRef(space, pyref) class W_PyCTypeObject(W_TypeObject): @jit.dont_look_inside _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit