Skip to content

Commit 61cfbae

Browse files
committed
Replicate some of the work done in remove_globals into optimizer_bytecodes.c.
First step to removing remove_globals.
1 parent 5809b25 commit 61cfbae

File tree

11 files changed

+489
-83
lines changed

11 files changed

+489
-83
lines changed

Include/internal/pycore_dict.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ extern uint32_t _PyDict_GetKeysVersionForCurrentState(
104104
extern size_t _PyDict_KeysSize(PyDictKeysObject *keys);
105105

106106
extern void _PyDictKeys_DecRef(PyDictKeysObject *keys);
107+
extern void _PyDictKeys_IncRef(PyDictKeysObject *keys);
107108

108109
/* _Py_dict_lookup() returns index of entry which can be used like DK_ENTRIES(dk)[index].
109110
* -1 when no entry found, -3 when compare raises error.

Include/internal/pycore_optimizer.h

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ typedef enum _JitSymType {
197197
JIT_SYM_KNOWN_CLASS_TAG = 6,
198198
JIT_SYM_KNOWN_VALUE_TAG = 7,
199199
JIT_SYM_TUPLE_TAG = 8,
200+
JIT_SYM_FUNCTION_TAG = 9,
201+
JIT_SYM_DICT_KEYS_TAG = 10,
200202
} JitSymType;
201203

202204
typedef struct _jit_opt_known_class {
@@ -223,24 +225,38 @@ typedef struct _jit_opt_tuple {
223225
uint16_t items[MAX_SYMBOLIC_TUPLE_SIZE];
224226
} JitOptTuple;
225227

228+
typedef struct _jit_opt_function {
229+
uint8_t tag;
230+
uint16_t arg_count;
231+
uint32_t version;
232+
PyCodeObject *code;
233+
} JitOptFunction;
234+
235+
typedef struct _jit_opt_dict_keys {
236+
PyDictObject *dict;
237+
} JitOptDictKeys;
238+
226239
typedef union _jit_opt_symbol {
227240
uint8_t tag;
228241
JitOptKnownClass cls;
229242
JitOptKnownValue value;
230243
JitOptKnownVersion version;
231244
JitOptTuple tuple;
245+
JitOptFunction function;
246+
JitOptDictKeys keys;
232247
} JitOptSymbol;
233248

234-
235-
236249
struct _Py_UOpsAbstractFrame {
237250
// Max stacklen
238251
int stack_len;
239252
int locals_len;
240-
253+
PyFunctionObject *function;
241254
JitOptSymbol **stack_pointer;
242255
JitOptSymbol **stack;
243256
JitOptSymbol **locals;
257+
bool function_checked;
258+
bool builtins_watched;
259+
bool globals_watched;
244260
};
245261

246262
typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame;
@@ -285,6 +301,7 @@ extern void _Py_uop_sym_set_null(JitOptContext *ctx, JitOptSymbol *sym);
285301
extern void _Py_uop_sym_set_non_null(JitOptContext *ctx, JitOptSymbol *sym);
286302
extern void _Py_uop_sym_set_type(JitOptContext *ctx, JitOptSymbol *sym, PyTypeObject *typ);
287303
extern bool _Py_uop_sym_set_type_version(JitOptContext *ctx, JitOptSymbol *sym, unsigned int version);
304+
extern void _Py_uop_sym_set_function_version(JitOptContext *ctx, JitOptSymbol *sym, uint32_t version);
288305
extern void _Py_uop_sym_set_const(JitOptContext *ctx, JitOptSymbol *sym, PyObject *const_val);
289306
extern bool _Py_uop_sym_is_bottom(JitOptSymbol *sym);
290307
extern int _Py_uop_sym_truthiness(JitOptSymbol *sym);
@@ -293,6 +310,8 @@ extern bool _Py_uop_sym_is_immortal(JitOptSymbol *sym);
293310
extern JitOptSymbol *_Py_uop_sym_new_tuple(JitOptContext *ctx, int size, JitOptSymbol **args);
294311
extern JitOptSymbol *_Py_uop_sym_tuple_getitem(JitOptContext *ctx, JitOptSymbol *sym, int item);
295312
extern int _Py_uop_sym_tuple_length(JitOptSymbol *sym);
313+
extern JitOptSymbol *_Py_uop_sym_new_dict_keys(JitOptContext *ctx, PyObject *dict);
314+
extern PyDictKeysObject *_Py_uop_sym_get_dict_keys(JitOptSymbol *sym);
296315

297316
extern void _Py_uop_abstractcontext_init(JitOptContext *ctx);
298317
extern void _Py_uop_abstractcontext_fini(JitOptContext *ctx);

Include/internal/pycore_uop_ids.h

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

Include/internal/pycore_uop_metadata.h

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

Objects/dictobject.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7506,6 +7506,12 @@ _PyDictKeys_DecRef(PyDictKeysObject *keys)
75067506
dictkeys_decref(interp, keys, false);
75077507
}
75087508

7509+
void
7510+
_PyDictKeys_IncRef(PyDictKeysObject *keys)
7511+
{
7512+
dictkeys_incref(keys);
7513+
}
7514+
75097515
static inline uint32_t
75107516
get_next_dict_keys_version(PyInterpreterState *interp)
75117517
{

Python/bytecodes.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5064,6 +5064,10 @@ dummy_func(
50645064
null = PyStackRef_NULL;
50655065
}
50665066

5067+
tier2 op(_LOAD_DICT_KEYS, (ptr/4 -- keys: PyDictKeysObject *)) {
5068+
keys = (PyDictKeysObject *)ptr;
5069+
}
5070+
50675071
tier2 op(_CHECK_FUNCTION, (func_version/2 -- )) {
50685072
assert(PyStackRef_FunctionCheck(frame->f_funcobj));
50695073
PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
@@ -5086,7 +5090,15 @@ dummy_func(
50865090
DEOPT_IF(res_o == NULL);
50875091
Py_INCREF(res_o);
50885092
res = PyStackRef_FromPyObjectSteal(res_o);
5089-
}
5093+
}
5094+
5095+
tier2 op(_REPLACE_DICT_KEYS_WITH_CONST, (ptr/4, keys -- value)) {
5096+
value = PyStackRef_FromPyObjectNew(ptr);
5097+
}
5098+
5099+
tier2 op(_REPLACE_DICT_KEYS_WITH_CONST_IMMORTAL, (ptr/4, keys -- value)) {
5100+
value = PyStackRef_FromPyObjectImmortal(ptr);
5101+
}
50905102

50915103
tier2 op(_LOAD_ATTR_MODULE, (index/1, owner -- attr)) {
50925104
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);

Python/executor_cases.c.h

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

0 commit comments

Comments
 (0)