Skip to content

Commit 7a4d046

Browse files
refactor common code to optimize_dict_known_hash
1 parent ea4ae79 commit 7a4d046

File tree

3 files changed

+35
-72
lines changed

3 files changed

+35
-72
lines changed

Python/optimizer_analysis.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,33 @@ optimize_to_bool(
348348
return 0;
349349
}
350350

351+
static void
352+
optimize_dict_known_hash(
353+
JitOptContext *ctx, _PyBloomFilter *dependencies, _PyUOpInstruction *this_instr,
354+
PyObject *sub, uint16_t opcode)
355+
{
356+
if (PyUnicode_CheckExact(sub) || PyLong_CheckExact(sub) || PyBytes_CheckExact(sub)
357+
|| PyFloat_CheckExact(sub) || PyComplex_CheckExact(sub)) {
358+
// PyObject_Hash can't fail on these types
359+
ADD_OP(opcode, 0, PyObject_Hash(sub));
360+
}
361+
else if (PyTuple_CheckExact(sub)) {
362+
// only use known hash variant when hash of tuple is already computed
363+
// since computing it can call arbitrary code
364+
Py_hash_t hash = ((PyTupleObject *)sub)->ob_hash;
365+
if (hash != -1) {
366+
ADD_OP(opcode, 0, hash);
367+
}
368+
}
369+
else if (Py_TYPE(sub)->tp_hash == PyBaseObject_Type.tp_hash) {
370+
// for user-defined objects which don't override tp_hash
371+
Py_hash_t hash = PyObject_Hash(sub);
372+
ADD_OP(opcode, 0, hash);
373+
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)Py_TYPE(sub));
374+
_Py_BloomFilter_Add(dependencies, Py_TYPE(sub));
375+
}
376+
}
377+
351378
static void
352379
eliminate_pop_guard(_PyUOpInstruction *this_instr, JitOptContext *ctx, bool exit)
353380
{

Python/optimizer_bytecodes.c

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -167,26 +167,8 @@ dummy_func(void) {
167167
op(_STORE_SUBSCR_DICT, (value, dict_st, sub -- st)) {
168168
PyObject *sub_o = sym_get_const(ctx, sub);
169169
if (sub_o != NULL) {
170-
if (PyUnicode_CheckExact(sub_o) || PyLong_CheckExact(sub_o) || PyBytes_CheckExact(sub_o)
171-
|| PyFloat_CheckExact(sub_o) || PyComplex_CheckExact(sub_o)) {
172-
// PyObject_Hash can't fail on these types
173-
ADD_OP(_STORE_SUBSCR_DICT_KNOWN_HASH, 0, PyObject_Hash(sub_o));
174-
}
175-
else if (PyTuple_CheckExact(sub_o)) {
176-
// only use known hash variant when hash of tuple is already computed
177-
// since computing it can call arbitrary code
178-
Py_hash_t hash = ((PyTupleObject *)sub_o)->ob_hash;
179-
if (hash != -1) {
180-
ADD_OP(_STORE_SUBSCR_DICT_KNOWN_HASH, 0, hash);
181-
}
182-
}
183-
else if (Py_TYPE(sub_o)->tp_hash == PyBaseObject_Type.tp_hash) {
184-
// for user-defined objects which don't override tp_hash
185-
Py_hash_t hash = PyObject_Hash(sub_o);
186-
ADD_OP(_STORE_SUBSCR_DICT_KNOWN_HASH, 0, hash);
187-
PyType_Watch(TYPE_WATCHER_ID, Py_TYPE(sub_o));
188-
_Py_BloomFilter_Add(dependencies, Py_TYPE(sub_o));
189-
}
170+
optimize_dict_known_hash(ctx, dependencies, this_instr,
171+
sub_o, _STORE_SUBSCR_DICT_KNOWN_HASH);
190172
}
191173
(void)value;
192174
st = dict_st;
@@ -507,26 +489,8 @@ dummy_func(void) {
507489
op(_BINARY_OP_SUBSCR_DICT, (dict_st, sub_st -- res, ds, ss)) {
508490
PyObject *sub = sym_get_const(ctx, sub_st);
509491
if (sub != NULL) {
510-
if (PyUnicode_CheckExact(sub) || PyLong_CheckExact(sub) || PyBytes_CheckExact(sub)
511-
|| PyFloat_CheckExact(sub) || PyComplex_CheckExact(sub)) {
512-
// PyObject_Hash can't fail on these types
513-
ADD_OP(_BINARY_OP_SUBSCR_DICT_KNOWN_HASH, 0, PyObject_Hash(sub));
514-
}
515-
else if (PyTuple_CheckExact(sub)) {
516-
// only use known hash variant when hash of tuple is already computed
517-
// since computing it can call arbitrary code
518-
Py_hash_t hash = ((PyTupleObject *)sub)->ob_hash;
519-
if (hash != -1) {
520-
ADD_OP(_BINARY_OP_SUBSCR_DICT_KNOWN_HASH, 0, hash);
521-
}
522-
}
523-
else if (Py_TYPE(sub)->tp_hash == PyBaseObject_Type.tp_hash) {
524-
// for user-defined objects which don't override tp_hash
525-
Py_hash_t hash = PyObject_Hash(sub);
526-
ADD_OP(_BINARY_OP_SUBSCR_DICT_KNOWN_HASH, 0, hash);
527-
PyType_Watch(TYPE_WATCHER_ID, Py_TYPE(sub));
528-
_Py_BloomFilter_Add(dependencies, Py_TYPE(sub));
529-
}
492+
optimize_dict_known_hash(ctx, dependencies, this_instr,
493+
sub, _BINARY_OP_SUBSCR_DICT_KNOWN_HASH);
530494
}
531495
res = sym_new_not_null(ctx);
532496
ds = dict_st;

Python/optimizer_cases.c.h

Lines changed: 4 additions & 32 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)