mirror of
https://github.com/python/cpython.git
synced 2025-08-23 02:04:56 +00:00
gh-119821: Support non-dict globals in LOAD_FROM_DICT_OR_GLOBALS (#119822)
Support non-dict globals in LOAD_FROM_DICT_OR_GLOBALS The implementation basically copies LOAD_GLOBAL. Possibly it could be deduplicated, but that seems like it may get hairy since the two operations have different operands. This is important to fix in 3.14 for PEP 649, but it's a bug in earlier versions too, and we should backport to 3.13 and 3.12 if possible.
This commit is contained in:
parent
2237946af0
commit
80a4e38994
8 changed files with 76 additions and 58 deletions
30
Python/executor_cases.c.h
generated
30
Python/executor_cases.c.h
generated
|
@ -1405,35 +1405,7 @@
|
|||
break;
|
||||
}
|
||||
|
||||
case _LOAD_FROM_DICT_OR_GLOBALS: {
|
||||
PyObject *mod_or_class_dict;
|
||||
PyObject *v;
|
||||
oparg = CURRENT_OPARG();
|
||||
mod_or_class_dict = stack_pointer[-1];
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) {
|
||||
JUMP_TO_ERROR();
|
||||
}
|
||||
if (v == NULL) {
|
||||
if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
|
||||
JUMP_TO_ERROR();
|
||||
}
|
||||
if (v == NULL) {
|
||||
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
||||
JUMP_TO_ERROR();
|
||||
}
|
||||
if (v == NULL) {
|
||||
_PyEval_FormatExcCheckArg(
|
||||
tstate, PyExc_NameError,
|
||||
NAME_ERROR_MSG, name);
|
||||
JUMP_TO_ERROR();
|
||||
}
|
||||
}
|
||||
}
|
||||
Py_DECREF(mod_or_class_dict);
|
||||
stack_pointer[-1] = v;
|
||||
break;
|
||||
}
|
||||
/* _LOAD_FROM_DICT_OR_GLOBALS is not a viable micro-op for tier 2 because it has both popping and not-popping errors */
|
||||
|
||||
/* _LOAD_NAME is not a viable micro-op for tier 2 because it has both popping and not-popping errors */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue