Skip to content

Commit b356035

Browse files
authored
Move check for str-only keys in LOAD_GLOBAL specializations to specialization time. (GH-31659)
1 parent 10117f1 commit b356035

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

Python/ceval.c

+6-15
Original file line numberDiff line numberDiff line change
@@ -1595,19 +1595,6 @@ is_method(PyObject **stack_pointer, int args) {
15951595
return PEEK(args+2) != NULL;
15961596
}
15971597

1598-
static PyObject*
1599-
dictkeys_get_value_by_index(PyDictKeysObject *dk, int index)
1600-
{
1601-
if (DK_IS_UNICODE(dk)) {
1602-
PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(dk) + index;
1603-
return ep->me_value;
1604-
}
1605-
else {
1606-
PyDictKeyEntry *ep = DK_ENTRIES(dk) + index;
1607-
return ep->me_value;
1608-
}
1609-
}
1610-
16111598
#define KWNAMES_LEN() \
16121599
(call_shape.kwnames == NULL ? 0 : ((int)PyTuple_GET_SIZE(call_shape.kwnames)))
16131600

@@ -3043,7 +3030,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
30433030
_PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr;
30443031
uint32_t version = read32(&cache->module_keys_version);
30453032
DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL);
3046-
PyObject *res = dictkeys_get_value_by_index(dict->ma_keys, cache->index);
3033+
assert(DK_IS_UNICODE(dict->ma_keys));
3034+
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
3035+
PyObject *res = entries[cache->index].me_value;
30473036
DEOPT_IF(res == NULL, LOAD_GLOBAL);
30483037
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
30493038
STAT_INC(LOAD_GLOBAL, hit);
@@ -3063,7 +3052,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
30633052
uint16_t bltn_version = cache->builtin_keys_version;
30643053
DEOPT_IF(mdict->ma_keys->dk_version != mod_version, LOAD_GLOBAL);
30653054
DEOPT_IF(bdict->ma_keys->dk_version != bltn_version, LOAD_GLOBAL);
3066-
PyObject *res = dictkeys_get_value_by_index(bdict->ma_keys, cache->index);
3055+
assert(DK_IS_UNICODE(bdict->ma_keys));
3056+
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(bdict->ma_keys);
3057+
PyObject *res = entries[cache->index].me_value;
30673058
DEOPT_IF(res == NULL, LOAD_GLOBAL);
30683059
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
30693060
STAT_INC(LOAD_GLOBAL, hit);

Python/specialize.c

+8
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,10 @@ _Py_Specialize_LoadGlobal(
12191219
goto fail;
12201220
}
12211221
PyDictKeysObject * globals_keys = ((PyDictObject *)globals)->ma_keys;
1222+
if (!DK_IS_UNICODE(globals_keys)) {
1223+
SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
1224+
goto fail;
1225+
}
12221226
Py_ssize_t index = _PyDictKeys_StringLookup(globals_keys, name);
12231227
if (index == DKIX_ERROR) {
12241228
SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
@@ -1241,6 +1245,10 @@ _Py_Specialize_LoadGlobal(
12411245
goto fail;
12421246
}
12431247
PyDictKeysObject * builtin_keys = ((PyDictObject *)builtins)->ma_keys;
1248+
if (!DK_IS_UNICODE(builtin_keys)) {
1249+
SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
1250+
goto fail;
1251+
}
12441252
index = _PyDictKeys_StringLookup(builtin_keys, name);
12451253
if (index == DKIX_ERROR) {
12461254
SPECIALIZATION_FAIL(LOAD_GLOBAL, SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);

0 commit comments

Comments
 (0)