Skip to content

Commit 055ec71

Browse files
committed
Update f_executable to a PyObject *
1 parent fece1ae commit 055ec71

16 files changed

Lines changed: 54 additions & 61 deletions

Include/internal/pycore_interpframe.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ extern "C" {
1818
((int)((IF)->instr_ptr - _PyFrame_GetBytecode((IF))))
1919

2020
static inline PyCodeObject *_PyFrame_GetCode(_PyInterpreterFrame *f) {
21-
assert(!PyStackRef_IsNull(f->f_executable));
22-
PyObject *executable = PyStackRef_AsPyObjectBorrow(f->f_executable);
23-
assert(PyCode_Check(executable));
24-
return (PyCodeObject *)executable;
21+
assert(f->f_executable != NULL);
22+
assert(PyCode_Check(f->f_executable));
23+
return (PyCodeObject *)f->f_executable;
2524
}
2625

2726
// Similar to _PyFrame_GetCode(), but return NULL if the frame is invalid or
@@ -36,15 +35,15 @@ _PyFrame_SafeGetCode(_PyInterpreterFrame *f)
3635
return NULL;
3736
}
3837

39-
if (PyStackRef_IsNull(f->f_executable)) {
38+
if (f->f_executable == NULL) {
4039
return NULL;
4140
}
4241
void *ptr;
4342
memcpy(&ptr, &f->f_executable, sizeof(f->f_executable));
4443
if (_PyMem_IsPtrFreed(ptr)) {
4544
return NULL;
4645
}
47-
PyObject *executable = PyStackRef_AsPyObjectBorrow(f->f_executable);
46+
PyObject *executable = f->f_executable;
4847
if (_PyObject_IsFreed(executable)) {
4948
return NULL;
5049
}
@@ -132,7 +131,7 @@ _PyFrame_NumSlotsForCodeObject(PyCodeObject *code)
132131

133132
static inline void _PyFrame_Copy(_PyInterpreterFrame *src, _PyInterpreterFrame *dest)
134133
{
135-
dest->f_executable = PyStackRef_Borrow(src->f_executable);
134+
dest->f_executable = src->f_executable;
136135
// Don't leave a dangling pointer to the old frame when creating generators
137136
// and coroutines:
138137
dest->previous = NULL;
@@ -166,7 +165,7 @@ _PyFrame_CopyForGenerators(_PyInterpreterFrame *old_frame, _PyInterpreterFrame *
166165
{
167166
_PyFrame_Copy(old_frame, gen_frame);
168167
gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
169-
gen_frame->f_executable = PyStackRef_MakeHeapSafe(gen_frame->f_executable);
168+
Py_INCREF(gen_frame->f_executable);
170169
}
171170

172171
#ifdef Py_GIL_DISABLED
@@ -200,7 +199,7 @@ _PyFrame_Initialize(
200199
{
201200
frame->previous = previous;
202201
frame->f_funcobj = func;
203-
frame->f_executable = PyStackRef_FromPyObjectBorrow((PyObject *)code);
202+
frame->f_executable = (PyObject *)code;
204203
PyFunctionObject *func_obj = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(func);
205204
frame->f_builtins = func_obj->func_builtins;
206205
frame->f_globals = func_obj->func_globals;
@@ -433,7 +432,7 @@ _PyFrame_PushTrampolineUnchecked(PyThreadState *tstate, PyCodeObject *code, int
433432
assert(tstate->datastack_top < tstate->datastack_limit);
434433
frame->previous = previous;
435434
frame->f_funcobj = PyStackRef_None;
436-
frame->f_executable = PyStackRef_FromPyObjectBorrow((PyObject *)code);
435+
frame->f_executable = (PyObject *)code;
437436
#ifdef Py_DEBUG
438437
frame->f_builtins = NULL;
439438
frame->f_globals = NULL;

Include/internal/pycore_stackref.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,6 @@ PyStackRef_TYPE(_PyStackRef stackref) {
770770
STACKREF_CHECK_FUNC(Gen)
771771
STACKREF_CHECK_FUNC(Bool)
772772
STACKREF_CHECK_FUNC(ExceptionInstance)
773-
STACKREF_CHECK_FUNC(Code)
774773
STACKREF_CHECK_FUNC(Function)
775774

776775
static inline bool

Modules/_testinternalcapi/interpreter.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ Test_EvalFrame(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag)
8484
entry.frame.f_globals = (PyObject*)0xaaa3;
8585
entry.frame.f_builtins = (PyObject*)0xaaa4;
8686
#endif
87-
entry.frame.f_executable = PyStackRef_None;
87+
entry.frame.f_executable = NULL;
8888
entry.frame.instr_ptr = (_Py_CODEUNIT *)_Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR + 1;
8989
entry.frame.stackpointer = entry.stack;
9090
entry.frame.owner = FRAME_OWNED_BY_INTERPRETER;

Modules/_testinternalcapi/test_cases.c.h

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

Objects/frameobject.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1939,7 +1939,7 @@ frame_dealloc(PyObject *op)
19391939

19401940
/* Kill all local variables including specials, if we own them */
19411941
if (f->f_frame == frame && frame->owner == FRAME_OWNED_BY_FRAME_OBJECT) {
1942-
PyStackRef_CLEAR(frame->f_executable);
1942+
frame->f_executable = NULL;
19431943
PyStackRef_CLEAR(frame->f_funcobj);
19441944
Py_CLEAR(frame->f_locals);
19451945
_PyStackRef *locals = _PyFrame_GetLocalsArray(frame);

Objects/genobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ gen_traverse(PyObject *self, visitproc visit, void *arg)
9696
else {
9797
// We still need to visit the code object when the frame is cleared to
9898
// ensure that it's kept alive if the reference is deferred.
99-
_Py_VISIT_STACKREF(gen->gi_iframe.f_executable);
99+
Py_VISIT(gen->gi_iframe.f_executable);
100100
}
101101
/* No need to visit cr_origin, because it's just tuples/str/int, so can't
102102
participate in a reference cycle. */
@@ -231,7 +231,7 @@ gen_dealloc(PyObject *self)
231231
gen_clear_frame(gen);
232232
}
233233
assert(gen->gi_exc_state.exc_value == NULL);
234-
PyStackRef_CLEAR(gen->gi_iframe.f_executable);
234+
Py_CLEAR(gen->gi_iframe.f_executable);
235235
Py_CLEAR(gen->gi_name);
236236
Py_CLEAR(gen->gi_qualname);
237237

@@ -1105,7 +1105,7 @@ make_gen(PyTypeObject *type, PyFunctionObject *func)
11051105
gen->gi_weakreflist = NULL;
11061106
gen->gi_exc_state.exc_value = NULL;
11071107
gen->gi_exc_state.previous_item = NULL;
1108-
gen->gi_iframe.f_executable = PyStackRef_None;
1108+
gen->gi_iframe.f_executable = NULL;
11091109
assert(func->func_name != NULL);
11101110
gen->gi_name = Py_NewRef(func->func_name);
11111111
assert(func->func_qualname != NULL);

Python/bytecodes.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,7 +1870,7 @@ dummy_func(
18701870
/* We don't know which of these is relevant here, so keep them equal */
18711871
assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
18721872
#if TIER_ONE && defined(Py_DEBUG)
1873-
if (!PyStackRef_IsNone(frame->f_executable)) {
1873+
if (frame->f_executable != NULL) {
18741874
Py_ssize_t i = frame->instr_ptr - _PyFrame_GetBytecode(frame);
18751875
assert(i >= 0 && i <= INT_MAX);
18761876
int opcode = _Py_GetBaseCodeUnit(_PyFrame_GetCode(frame), (int)i).op.code;
@@ -6317,15 +6317,15 @@ dummy_func(
63176317
}
63186318

63196319
tier2 op(_GUARD_CODE_VERSION__PUSH_FRAME, (version/2 -- )) {
6320-
PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
6320+
PyObject *code = frame->f_executable;
63216321
assert(PyCode_Check(code));
63226322
if (((PyCodeObject *)code)->co_version != version) {
63236323
EXIT_IF(true);
63246324
}
63256325
}
63266326

63276327
tier2 op(_GUARD_CODE_VERSION_YIELD_VALUE, (version/2 -- )) {
6328-
PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
6328+
PyObject *code = frame->f_executable;
63296329
assert(PyCode_Check(code));
63306330
if (((PyCodeObject *)code)->co_version != version) {
63316331
frame->instr_ptr += 1 + INLINE_CACHE_ENTRIES_SEND;
@@ -6334,7 +6334,7 @@ dummy_func(
63346334
}
63356335

63366336
tier2 op(_GUARD_CODE_VERSION_RETURN_VALUE, (version/2 -- )) {
6337-
PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
6337+
PyObject *code = frame->f_executable;
63386338
assert(PyCode_Check(code));
63396339
if (((PyCodeObject *)code)->co_version != version) {
63406340
frame->instr_ptr += frame->return_offset;
@@ -6343,7 +6343,7 @@ dummy_func(
63436343
}
63446344

63456345
tier2 op(_GUARD_CODE_VERSION_RETURN_GENERATOR, (version/2 -- )) {
6346-
PyObject *code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
6346+
PyObject *code = frame->f_executable;
63476347
assert(PyCode_Check(code));
63486348
if (((PyCodeObject *)code)->co_version != version) {
63496349
frame->instr_ptr += frame->return_offset;
@@ -6637,14 +6637,14 @@ dummy_func(
66376637
}
66386638
tracer->prev_state.recorded_count = 0;
66396639
tracer->prev_state.instr = next_instr;
6640-
PyObject *prev_code = PyStackRef_AsPyObjectBorrow(frame->f_executable);
6640+
PyObject *prev_code = frame->f_executable;
66416641
if (tracer->prev_state.instr_code != (PyCodeObject *)prev_code) {
66426642
Py_SETREF(tracer->prev_state.instr_code, (PyCodeObject*)Py_NewRef((prev_code)));
66436643
}
66446644

66456645
tracer->prev_state.instr_frame = frame;
66466646
tracer->prev_state.instr_oparg = oparg;
6647-
tracer->prev_state.instr_stacklevel = PyStackRef_IsNone(frame->f_executable) ? 2 : STACK_LEVEL();
6647+
tracer->prev_state.instr_stacklevel = frame->f_executable == NULL ? 2 : STACK_LEVEL();
66486648
if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]
66496649
// Branch opcodes use the cache for branch history, not
66506650
// specialization counters. Don't reset it.

Python/ceval.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
12721272
entry.frame.f_globals = (PyObject*)0xaaa3;
12731273
entry.frame.f_builtins = (PyObject*)0xaaa4;
12741274
#endif
1275-
entry.frame.f_executable = PyStackRef_None;
1275+
entry.frame.f_executable = NULL;
12761276
entry.frame.instr_ptr = (_Py_CODEUNIT *)_Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS + 1;
12771277
entry.frame.stackpointer = entry.stack;
12781278
entry.frame.owner = FRAME_OWNED_BY_INTERPRETER;
@@ -1982,7 +1982,7 @@ clear_thread_frame(PyThreadState *tstate, _PyInterpreterFrame * frame)
19821982
tstate->datastack_top);
19831983
assert(frame->frame_obj == NULL || frame->frame_obj->f_frame == frame);
19841984
_PyFrame_ClearExceptCode(frame);
1985-
PyStackRef_CLEAR(frame->f_executable);
1985+
frame->f_executable = NULL;
19861986
_PyThreadState_PopFrame(tstate, frame);
19871987
}
19881988

Python/ceval.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ static void
248248
lltrace_resume_frame(_PyInterpreterFrame *frame)
249249
{
250250
PyObject *fobj = PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
251-
if (!PyStackRef_CodeCheck(frame->f_executable) ||
251+
if (!PyCode_Check(frame->f_executable) ||
252252
fobj == NULL ||
253253
!PyFunction_Check(fobj)
254254
) {

Python/executor_cases.c.h

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

0 commit comments

Comments
 (0)