summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-03-03 15:17:18 (GMT)
committerGitHub <noreply@github.com>2022-03-03 15:17:18 (GMT)
commitb35603532b52e25c91929177191c44c1deb2f765 (patch)
tree592cd09949afa7a0bef75b544243a8005de42009
parent10117f1d8cb49ce95493555c06050faf636ccee7 (diff)
downloadcpython-b35603532b52e25c91929177191c44c1deb2f765.zip
cpython-b35603532b52e25c91929177191c44c1deb2f765.tar.gz
cpython-b35603532b52e25c91929177191c44c1deb2f765.tar.bz2
Move check for str-only keys in LOAD_GLOBAL specializations to specialization time. (GH-31659)
-rw-r--r--Python/ceval.c21
-rw-r--r--Python/specialize.c8
2 files changed, 14 insertions, 15 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index e47e052..c86b744 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1595,19 +1595,6 @@ is_method(PyObject **stack_pointer, int args) {
return PEEK(args+2) != NULL;
}
-static PyObject*
-dictkeys_get_value_by_index(PyDictKeysObject *dk, int index)
-{
- if (DK_IS_UNICODE(dk)) {
- PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(dk) + index;
- return ep->me_value;
- }
- else {
- PyDictKeyEntry *ep = DK_ENTRIES(dk) + index;
- return ep->me_value;
- }
-}
-
#define KWNAMES_LEN() \
(call_shape.kwnames == NULL ? 0 : ((int)PyTuple_GET_SIZE(call_shape.kwnames)))
@@ -3043,7 +3030,9 @@ handle_eval_breaker:
_PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr;
uint32_t version = read32(&cache->module_keys_version);
DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL);
- PyObject *res = dictkeys_get_value_by_index(dict->ma_keys, cache->index);
+ assert(DK_IS_UNICODE(dict->ma_keys));
+ PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
+ PyObject *res = entries[cache->index].me_value;
DEOPT_IF(res == NULL, LOAD_GLOBAL);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
STAT_INC(LOAD_GLOBAL, hit);
@@ -3063,7 +3052,9 @@ handle_eval_breaker:
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);
- PyObject *res = dictkeys_get_value_by_index(bdict->ma_keys, cache->index);
+ assert(DK_IS_UNICODE(bdict->ma_keys));
+ PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(bdict->ma_keys);
+ PyObject *res = entries[cache->index].me_value;
DEOPT_IF(res == NULL, LOAD_GLOBAL);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
STAT_INC(LOAD_GLOBAL, hit);
diff --git a/Python/specialize.c b/Python/specialize.c
index 5486b5b..6762582 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -1219,6 +1219,10 @@ _Py_Specialize_LoadGlobal(
goto fail;
}
PyDictKeysObject * globals_keys = ((PyDictObject *)globals)->ma_keys;
+ if (!DK_IS_UNICODE(globals_keys)) {
+ SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
+ goto fail;
+ }
Py_ssize_t index = _PyDictKeys_StringLookup(globals_keys, name);
if (index == DKIX_ERROR) {
SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
@@ -1241,6 +1245,10 @@ _Py_Specialize_LoadGlobal(
goto fail;
}
PyDictKeysObject * builtin_keys = ((PyDictObject *)builtins)->ma_keys;
+ if (!DK_IS_UNICODE(builtin_keys)) {
+ SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
+ goto fail;
+ }
index = _PyDictKeys_StringLookup(builtin_keys, name);
if (index == DKIX_ERROR) {
SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);