Author: Armin Rigo <[email protected]>
Branch: py3.6
Changeset: r97768:234d0560480e
Date: 2019-10-14 07:58 +0200
http://bitbucket.org/pypy/pypy/changeset/234d0560480e/
Log: issue #3092
PyObject_GenericGetDict, PyObject_GenericSetDict
diff --git a/pypy/module/cpyext/dictobject.py b/pypy/module/cpyext/dictobject.py
--- a/pypy/module/cpyext/dictobject.py
+++ b/pypy/module/cpyext/dictobject.py
@@ -308,3 +308,5 @@
return 0
return 1
+#def PyObject_GenericGetDict(space, w_obj, context):
+# unlike CPython, you'll find this one in object.py together with ..SetDict
diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py
--- a/pypy/module/cpyext/object.py
+++ b/pypy/module/cpyext/object.py
@@ -444,3 +444,16 @@
del d[w_obj]
except KeyError:
pass
+
+@cpython_api([PyObject, rffi.VOIDP], PyObject)
+def PyObject_GenericGetDict(space, w_obj, context):
+ from pypy.interpreter.typedef import descr_get_dict
+ return descr_get_dict(space, w_obj)
+
+@cpython_api([PyObject, PyObject, rffi.VOIDP], rffi.INT_real, error=-1)
+def PyObject_GenericSetDict(space, w_obj, w_value, context):
+ from pypy.interpreter.typedef import descr_set_dict
+ if w_value is None:
+ raise oefmt(space.w_TypeError, "cannot delete __dict__")
+ descr_set_dict(space, w_obj, w_value)
+ return 0
diff --git a/pypy/module/cpyext/test/test_object.py
b/pypy/module/cpyext/test/test_object.py
--- a/pypy/module/cpyext/test/test_object.py
+++ b/pypy/module/cpyext/test/test_object.py
@@ -451,6 +451,31 @@
assert n == 1
module.leave(obj2)
+ def test_GenericGetSetDict(self):
+ module = self.import_extension('test_GenericGetSetDict', [
+ ('test1', 'METH_VARARGS',
+ """
+ PyObject *obj = PyTuple_GET_ITEM(args, 0);
+ PyObject *newdict = PyTuple_GET_ITEM(args, 1);
+
+ PyObject *olddict = PyObject_GenericGetDict(obj, NULL);
+ if (olddict == NULL)
+ return NULL;
+ int res = PyObject_GenericSetDict(obj, newdict, NULL);
+ if (res != 0)
+ return NULL;
+ return olddict;
+ """)])
+ class A:
+ pass
+ a = A()
+ a.x = 42
+ nd = {'y': 43}
+ d = module.test1(a, nd)
+ assert d == {'x': 42}
+ assert a.y == 43
+ assert a.__dict__ is nd
+
class AppTestPyBuffer_FillInfo(AppTestCpythonExtensionBase):
"""
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit