X Tutup
Skip to content

Commit bb86bf4

Browse files
bpo-35444: Unify and optimize the helper for getting a builtin object. (pythonGH-11047)
This speeds up pickling of some iterators. This fixes also error handling in pickling methods when fail to look up builtin "getattr".
1 parent 7cf3d8e commit bb86bf4

21 files changed

+68
-72
lines changed

Include/ceval.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void);
4848
PyAPI_FUNC(PyObject *) PyEval_GetLocals(void);
4949
PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void);
5050

51+
#ifndef Py_LIMITED_API
52+
/* Helper to look up a builtin object */
53+
PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *);
5154
/* Look at the current frame's (if any) code's co_flags, and turn on
5255
the corresponding compiler flags in cf->cf_flags. Return 1 if any
5356
flag was set, else return 0. */
54-
#ifndef Py_LIMITED_API
5557
PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf);
5658
#endif
5759

Include/cpython/object.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,6 @@ PyAPI_FUNC(int)
330330
_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *,
331331
PyObject *, PyObject *);
332332

333-
/* Helper to look up a builtin object */
334-
PyAPI_FUNC(PyObject *) _PyObject_GetBuiltin(const char *name);
335-
336333
#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0)
337334

338335
static inline void _Py_Dealloc_inline(PyObject *op)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed error handling in pickling methods when fail to look up builtin
2+
"getattr". Sped up pickling iterators.

Modules/_pickle.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,19 +209,15 @@ _Pickle_ClearState(PickleState *st)
209209
static int
210210
_Pickle_InitState(PickleState *st)
211211
{
212-
PyObject *builtins;
213212
PyObject *copyreg = NULL;
214213
PyObject *compat_pickle = NULL;
215214
PyObject *codecs = NULL;
216215
PyObject *functools = NULL;
216+
_Py_IDENTIFIER(getattr);
217217

218-
builtins = PyEval_GetBuiltins();
219-
if (builtins == NULL)
220-
goto error;
221-
st->getattr = PyDict_GetItemString(builtins, "getattr");
218+
st->getattr = _PyEval_GetBuiltinId(&PyId_getattr);
222219
if (st->getattr == NULL)
223220
goto error;
224-
Py_INCREF(st->getattr);
225221

226222
copyreg = PyImport_ImportModule("copyreg");
227223
if (!copyreg)

Modules/arraymodule.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2943,7 +2943,8 @@ static PyObject *
29432943
array_arrayiterator___reduce___impl(arrayiterobject *self)
29442944
/*[clinic end generated code: output=7898a52e8e66e016 input=a062ea1e9951417a]*/
29452945
{
2946-
PyObject *func = _PyObject_GetBuiltin("iter");
2946+
_Py_IDENTIFIER(iter);
2947+
PyObject *func = _PyEval_GetBuiltinId(&PyId_iter);
29472948
if (self->ao == NULL) {
29482949
return Py_BuildValue("N(())", func);
29492950
}

Modules/itertoolsmodule.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,9 @@ _grouper_next(_grouperobject *igo)
368368
static PyObject *
369369
_grouper_reduce(_grouperobject *lz, PyObject *Py_UNUSED(ignored))
370370
{
371+
_Py_IDENTIFIER(iter);
371372
if (((groupbyobject *)lz->parent)->currgrouper != lz) {
372-
return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
373+
return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
373374
}
374375
return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->parent, lz->tgtkey);
375376
}

Objects/bytearrayobject.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,11 +2358,12 @@ PyDoc_STRVAR(length_hint_doc,
23582358
static PyObject *
23592359
bytearrayiter_reduce(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
23602360
{
2361+
_Py_IDENTIFIER(iter);
23612362
if (it->it_seq != NULL) {
2362-
return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
2363+
return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter),
23632364
it->it_seq, it->it_index);
23642365
} else {
2365-
return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
2366+
return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
23662367
}
23672368
}
23682369

Objects/bytesobject.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3089,11 +3089,12 @@ PyDoc_STRVAR(length_hint_doc,
30893089
static PyObject *
30903090
striter_reduce(striterobject *it, PyObject *Py_UNUSED(ignored))
30913091
{
3092+
_Py_IDENTIFIER(iter);
30923093
if (it->it_seq != NULL) {
3093-
return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
3094+
return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter),
30943095
it->it_seq, it->it_index);
30953096
} else {
3096-
return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
3097+
return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
30973098
}
30983099
}
30993100

Objects/classobject.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,18 +78,15 @@ method_reduce(PyMethodObject *im, PyObject *Py_UNUSED(ignored))
7878
{
7979
PyObject *self = PyMethod_GET_SELF(im);
8080
PyObject *func = PyMethod_GET_FUNCTION(im);
81-
PyObject *builtins;
82-
PyObject *getattr;
8381
PyObject *funcname;
8482
_Py_IDENTIFIER(getattr);
8583

8684
funcname = _PyObject_GetAttrId(func, &PyId___name__);
8785
if (funcname == NULL) {
8886
return NULL;
8987
}
90-
builtins = PyEval_GetBuiltins();
91-
getattr = _PyDict_GetItemId(builtins, &PyId_getattr);
92-
return Py_BuildValue("O(ON)", getattr, self, funcname);
88+
return Py_BuildValue("N(ON)", _PyEval_GetBuiltinId(&PyId_getattr),
89+
self, funcname);
9390
}
9491

9592
static PyMethodDef method_methods[] = {

Objects/descrobject.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -452,14 +452,9 @@ descr_get_qualname(PyDescrObject *descr, void *Py_UNUSED(ignored))
452452
static PyObject *
453453
descr_reduce(PyDescrObject *descr, PyObject *Py_UNUSED(ignored))
454454
{
455-
PyObject *builtins;
456-
PyObject *getattr;
457455
_Py_IDENTIFIER(getattr);
458-
459-
builtins = PyEval_GetBuiltins();
460-
getattr = _PyDict_GetItemId(builtins, &PyId_getattr);
461-
return Py_BuildValue("O(OO)", getattr, PyDescr_TYPE(descr),
462-
PyDescr_NAME(descr));
456+
return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr),
457+
PyDescr_TYPE(descr), PyDescr_NAME(descr));
463458
}
464459

465460
static PyMethodDef descr_methods[] = {
@@ -1087,13 +1082,9 @@ wrapper_repr(wrapperobject *wp)
10871082
static PyObject *
10881083
wrapper_reduce(wrapperobject *wp, PyObject *Py_UNUSED(ignored))
10891084
{
1090-
PyObject *builtins;
1091-
PyObject *getattr;
10921085
_Py_IDENTIFIER(getattr);
1093-
1094-
builtins = PyEval_GetBuiltins();
1095-
getattr = _PyDict_GetItemId(builtins, &PyId_getattr);
1096-
return Py_BuildValue("O(OO)", getattr, wp->self, PyDescr_NAME(wp->descr));
1086+
return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr),
1087+
wp->self, PyDescr_NAME(wp->descr));
10971088
}
10981089

10991090
static PyMethodDef wrapper_methods[] = {

0 commit comments

Comments
 (0)
X Tutup