[Python-checkins] cpython: Use _PyObject_CallMethodIdObjArgs() in _ctypes

victor.stinner python-checkins at python.org
Fri Dec 9 10:31:39 EST 2016


https://hg.python.org/cpython/rev/ceb22b8f6d32
changeset: 105550:ceb22b8f6d32
user: Victor Stinner <victor.stinner at gmail.com>
date: Fri Dec 09 15:18:31 2016 +0100
summary:
 Use _PyObject_CallMethodIdObjArgs() in _ctypes
Issue #28915: Replace _PyObject_CallMethodId() with
_PyObject_CallMethodIdObjArgs() in unpickle(). _PyObject_CallMethodIdObjArgs()
avoids the creation of a temporary tuple and doesn't have to parse a format
string.
Replace _PyObject_CallMethodId() with _PyObject_GetAttrId()+PyObject_Call() for
the second call since it requires to "unpack" a tuple.
Add also a check in the type of the second parameter (state): it must be a
tuple.
files:
 Modules/_ctypes/callproc.c | 34 ++++++++++++++++---------
 1 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1631,25 +1631,33 @@
 static PyObject *
 unpickle(PyObject *self, PyObject *args)
 {
- PyObject *typ;
- PyObject *state;
- PyObject *result;
- PyObject *tmp;
+ PyObject *typ, *state, *meth, *obj, *result;
 _Py_IDENTIFIER(__new__);
 _Py_IDENTIFIER(__setstate__);
 
- if (!PyArg_ParseTuple(args, "OO", &typ, &state))
+ if (!PyArg_ParseTuple(args, "OO!", &typ, &PyTuple_Type, &state))
 return NULL;
- result = _PyObject_CallMethodId(typ, &PyId___new__, "O", typ);
- if (result == NULL)
+ obj = _PyObject_CallMethodIdObjArgs(typ, &PyId___new__, typ, NULL);
+ if (obj == NULL)
 return NULL;
- tmp = _PyObject_CallMethodId(result, &PyId___setstate__, "O", state);
- if (tmp == NULL) {
- Py_DECREF(result);
- return NULL;
+
+ meth = _PyObject_GetAttrId(obj, &PyId___setstate__);
+ if (meth == NULL) {
+ goto error;
 }
- Py_DECREF(tmp);
- return result;
+
+ result = PyObject_Call(meth, state, NULL);
+ Py_DECREF(meth);
+ if (result == NULL) {
+ goto error;
+ }
+ Py_DECREF(result);
+
+ return obj;
+
+error:
+ Py_DECREF(obj);
+ return NULL;
 }
 
 static PyObject *
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /