Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bde6ff7

Browse files
committed
Vladimir Marangozov' performance hack: copy f_builtins from ancestor
if the globals are the same. Also, when creating a dummy builtins dictionary, add "None" to it, just to be kind.
1 parent 3da3fce commit bde6ff7

1 file changed

Lines changed: 14 additions & 3 deletions

File tree

Objects/frameobject.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,16 @@ PyFrame_New(tstate, code, globals, locals)
164164
PyErr_BadInternalCall();
165165
return NULL;
166166
}
167-
builtins = PyDict_GetItem(globals, builtin_object);
168-
if (builtins != NULL && PyModule_Check(builtins))
169-
builtins = PyModule_GetDict(builtins);
167+
if (back == NULL || back->f_globals != globals) {
168+
builtins = PyDict_GetItem(globals, builtin_object);
169+
if (builtins != NULL && PyModule_Check(builtins))
170+
builtins = PyModule_GetDict(builtins);
171+
}
172+
else {
173+
/* If we share the globals, we share the builtins.
174+
Save a lookup and a call. */
175+
builtins = back->f_builtins;
176+
}
170177
if (builtins != NULL && !PyDict_Check(builtins))
171178
builtins = NULL;
172179
if (free_list == NULL) {
@@ -194,9 +201,13 @@ PyFrame_New(tstate, code, globals, locals)
194201
_Py_NewReference(f);
195202
}
196203
if (builtins == NULL) {
204+
/* No builtins! Make up a minimal one. */
197205
builtins = PyDict_New();
198206
if (builtins == NULL)
199207
return NULL;
208+
/* Give them 'None', at least. */
209+
if (PyDict_SetItemString(builtins, "None", Py_None) < 0)
210+
return NULL;
200211
}
201212
else
202213
Py_XINCREF(builtins);

0 commit comments

Comments
 (0)