https://github.com/python/cpython/commit/8cf5c4d89a526e5370f1d094885021b4792d4fff
commit: 8cf5c4d89a526e5370f1d094885021b4792d4fff
branch: main
author: Sam Gross <[email protected]>
committer: colesbury <[email protected]>
date: 2026-01-08T09:32:20-05:00
summary:
gh-142908: Don't use `DK_IS_UNICODE` in interpreter (gh-142909)
`DK_IS_UNICODE()` includes split keys and we don't want to specialize on
those accesses..
files:
M Python/bytecodes.c
M Python/executor_cases.c.h
M Python/generated_cases.c.h
M Python/specialize.c
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 300683a9402784..5e5e818b9d3f55 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1844,7 +1844,7 @@ dummy_func(
DEOPT_IF(!PyDict_CheckExact(dict));
PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
DEOPT_IF(FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) !=
version);
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
}
op(_LOAD_GLOBAL_MODULE, (version/1, unused/1, index/1 -- res))
@@ -1853,7 +1853,7 @@ dummy_func(
DEOPT_IF(!PyDict_CheckExact(dict));
PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
DEOPT_IF(FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) !=
version);
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
assert(index < DK_SIZE(keys));
PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
@@ -1873,7 +1873,7 @@ dummy_func(
DEOPT_IF(!PyDict_CheckExact(dict));
PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
DEOPT_IF(FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) !=
version);
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
DEOPT_IF(res_o == NULL);
@@ -2668,7 +2668,7 @@ dummy_func(
assert(PyDict_CheckExact((PyObject *)dict));
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
if (hint >= (size_t)dict->ma_keys->dk_nentries ||
- !DK_IS_UNICODE(dict->ma_keys)) {
+ dict->ma_keys->dk_kind != DICT_KEYS_UNICODE) {
UNLOCK_OBJECT(dict);
DEOPT_IF(true);
}
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index fb8a919336bcf4..36464764e4d5ad 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -7463,7 +7463,7 @@
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_JUMP_TARGET();
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
SET_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
@@ -7488,7 +7488,7 @@
SET_CURRENT_CACHED_VALUES(1);
JUMP_TO_JUMP_TARGET();
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
@@ -7517,7 +7517,7 @@
SET_CURRENT_CACHED_VALUES(2);
JUMP_TO_JUMP_TARGET();
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(2);
@@ -7550,7 +7550,7 @@
SET_CURRENT_CACHED_VALUES(3);
JUMP_TO_JUMP_TARGET();
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
_tos_cache2 = _stack_item_2;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
@@ -7577,7 +7577,7 @@
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_JUMP_TARGET();
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
assert(index < DK_SIZE(keys));
PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
@@ -7623,7 +7623,7 @@
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_JUMP_TARGET();
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
if (res_o == NULL) {
@@ -9768,7 +9768,7 @@
assert(PyDict_CheckExact((PyObject *)dict));
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
if (hint >= (size_t)dict->ma_keys->dk_nentries ||
- !DK_IS_UNICODE(dict->ma_keys)) {
+ dict->ma_keys->dk_kind != DICT_KEYS_UNICODE) {
UNLOCK_OBJECT(dict);
if (true) {
UOP_STAT_INC(uopcode, miss);
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 4de75b54c9e0a1..42058066cbd12d 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -9213,7 +9213,7 @@
assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
JUMP_TO_PREDICTED(LOAD_GLOBAL);
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
}
// _LOAD_GLOBAL_BUILTINS
{
@@ -9231,7 +9231,7 @@
assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
JUMP_TO_PREDICTED(LOAD_GLOBAL);
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
if (res_o == NULL) {
@@ -9297,7 +9297,7 @@
assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
JUMP_TO_PREDICTED(LOAD_GLOBAL);
}
- assert(DK_IS_UNICODE(keys));
+ assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
assert(index < DK_SIZE(keys));
PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
@@ -10989,7 +10989,7 @@
assert(PyDict_CheckExact((PyObject *)dict));
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
if (hint >= (size_t)dict->ma_keys->dk_nentries ||
- !DK_IS_UNICODE(dict->ma_keys)) {
+ dict->ma_keys->dk_kind != DICT_KEYS_UNICODE) {
UNLOCK_OBJECT(dict);
if (true) {
UPDATE_MISS_STATS(STORE_ATTR);
diff --git a/Python/specialize.c b/Python/specialize.c
index fee54695c7f3c6..80db7d01f38f1e 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -1285,7 +1285,7 @@ specialize_load_global_lock_held(
goto fail;
}
PyDictKeysObject * globals_keys = ((PyDictObject *)globals)->ma_keys;
- if (!DK_IS_UNICODE(globals_keys)) {
+ if (globals_keys->dk_kind != DICT_KEYS_UNICODE) {
SPECIALIZATION_FAIL(LOAD_GLOBAL,
SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
goto fail;
}
@@ -1320,7 +1320,7 @@ specialize_load_global_lock_held(
goto fail;
}
PyDictKeysObject * builtin_keys = ((PyDictObject *)builtins)->ma_keys;
- if (!DK_IS_UNICODE(builtin_keys)) {
+ if (builtin_keys->dk_kind != DICT_KEYS_UNICODE) {
SPECIALIZATION_FAIL(LOAD_GLOBAL,
SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT);
goto fail;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]