summaryrefslogtreecommitdiff
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2023-02-01 13:12:49 -0800
committerGitHub <noreply@github.com>2023-02-01 13:12:49 -0800
commitae9b38f4241a7d62ec4e9b775d4436d762b11fb3 (patch)
treeb6796e203f66e47414b9867f145319fabee8effe /Python/bytecodes.c
parenteda60916bc88f8af736790ffd52381e8bb83ae83 (diff)
downloadcpython-git-ae9b38f4241a7d62ec4e9b775d4436d762b11fb3.tar.gz
gh-98831: Modernize the LOAD_GLOBAL family (#101502)
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c57
1 files changed, 19 insertions, 38 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 105bd95be0..fb41c8387c 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1068,8 +1068,13 @@ dummy_func(
}
}
- // error: LOAD_GLOBAL has irregular stack effect
- inst(LOAD_GLOBAL) {
+ family(load_global, INLINE_CACHE_ENTRIES_LOAD_GLOBAL) = {
+ LOAD_GLOBAL,
+ LOAD_GLOBAL_MODULE,
+ LOAD_GLOBAL_BUILTIN,
+ };
+
+ inst(LOAD_GLOBAL, (unused/1, unused/1, unused/2, unused/1 -- null if (oparg & 1), v)) {
#if ENABLE_SPECIALIZATION
_PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -1082,10 +1087,7 @@ dummy_func(
STAT_INC(LOAD_GLOBAL, deferred);
DECREMENT_ADAPTIVE_COUNTER(cache->counter);
#endif /* ENABLE_SPECIALIZATION */
- int push_null = oparg & 1;
- PEEK(0) = NULL;
PyObject *name = GETITEM(names, oparg>>1);
- PyObject *v;
if (PyDict_CheckExact(GLOBALS())
&& PyDict_CheckExact(BUILTINS()))
{
@@ -1099,7 +1101,7 @@ dummy_func(
format_exc_check_arg(tstate, PyExc_NameError,
NAME_ERROR_MSG, name);
}
- goto error;
+ ERROR_IF(true, error);
}
Py_INCREF(v);
}
@@ -1109,9 +1111,7 @@ dummy_func(
/* namespace 1: globals */
v = PyObject_GetItem(GLOBALS(), name);
if (v == NULL) {
- if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
- goto error;
- }
+ ERROR_IF(!_PyErr_ExceptionMatches(tstate, PyExc_KeyError), error);
_PyErr_Clear(tstate);
/* namespace 2: builtins */
@@ -1122,58 +1122,42 @@ dummy_func(
tstate, PyExc_NameError,
NAME_ERROR_MSG, name);
}
- goto error;
+ ERROR_IF(true, error);
}
}
}
- /* Skip over inline cache */
- JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
- STACK_GROW(push_null);
- PUSH(v);
+ null = NULL;
}
- // error: LOAD_GLOBAL has irregular stack effect
- inst(LOAD_GLOBAL_MODULE) {
+ inst(LOAD_GLOBAL_MODULE, (unused/1, index/1, version/2, unused/1 -- null if (oparg & 1), res)) {
assert(cframe.use_tracing == 0);
DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL);
PyDictObject *dict = (PyDictObject *)GLOBALS();
- _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr;
- uint32_t version = read_u32(cache->module_keys_version);
DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL);
assert(DK_IS_UNICODE(dict->ma_keys));
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
- PyObject *res = entries[cache->index].me_value;
+ res = entries[index].me_value;
DEOPT_IF(res == NULL, LOAD_GLOBAL);
- int push_null = oparg & 1;
- PEEK(0) = NULL;
- JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
+ Py_INCREF(res);
STAT_INC(LOAD_GLOBAL, hit);
- STACK_GROW(push_null+1);
- SET_TOP(Py_NewRef(res));
+ null = NULL;
}
- // error: LOAD_GLOBAL has irregular stack effect
- inst(LOAD_GLOBAL_BUILTIN) {
+ inst(LOAD_GLOBAL_BUILTIN, (unused/1, index/1, mod_version/2, bltn_version/1 -- null if (oparg & 1), res)) {
assert(cframe.use_tracing == 0);
DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL);
DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL);
PyDictObject *mdict = (PyDictObject *)GLOBALS();
PyDictObject *bdict = (PyDictObject *)BUILTINS();
- _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr;
- uint32_t mod_version = read_u32(cache->module_keys_version);
- uint16_t bltn_version = cache->builtin_keys_version;
DEOPT_IF(mdict->ma_keys->dk_version != mod_version, LOAD_GLOBAL);
DEOPT_IF(bdict->ma_keys->dk_version != bltn_version, LOAD_GLOBAL);
assert(DK_IS_UNICODE(bdict->ma_keys));
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(bdict->ma_keys);
- PyObject *res = entries[cache->index].me_value;
+ res = entries[index].me_value;
DEOPT_IF(res == NULL, LOAD_GLOBAL);
- int push_null = oparg & 1;
- PEEK(0) = NULL;
- JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
+ Py_INCREF(res);
STAT_INC(LOAD_GLOBAL, hit);
- STACK_GROW(push_null+1);
- SET_TOP(Py_NewRef(res));
+ null = NULL;
}
inst(DELETE_FAST, (--)) {
@@ -3212,9 +3196,6 @@ family(call, INLINE_CACHE_ENTRIES_CALL) = {
family(for_iter, INLINE_CACHE_ENTRIES_FOR_ITER) = {
FOR_ITER, FOR_ITER_LIST,
FOR_ITER_RANGE };
-family(load_global, INLINE_CACHE_ENTRIES_LOAD_GLOBAL) = {
- LOAD_GLOBAL, LOAD_GLOBAL_BUILTIN,
- LOAD_GLOBAL_MODULE };
family(store_fast) = { STORE_FAST, STORE_FAST__LOAD_FAST, STORE_FAST__STORE_FAST };
family(unpack_sequence, INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE) = {
UNPACK_SEQUENCE, UNPACK_SEQUENCE_LIST,