[pypy-commit] pypy default: cpyext: Fix the signature of PyMember_GetOne, it takes a const char*
amauryfa
pypy.commits at gmail.com
Tue Apr 12 07:46:42 EDT 2016
Author: Amaury Forgeot d'Arc <amauryfa at 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'
- at cpython_api([PyObject, lltype.Ptr(PyMemberDef)], PyObject, header=_HEADER)
+ at 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
- at cpython_api([PyObject, lltype.Ptr(PyMemberDef), PyObject], rffi.INT_real,
+ at 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
More information about the pypy-commit
mailing list