[Python-checkins] bpo-45256: Don't track the exact depth of each `InterpreterFrame` (GH-30372)
markshannon
webhook-mailer at python.org
Wed Jan 5 06:30:34 EST 2022
https://github.com/python/cpython/commit/332e6b972567debfa9d8f3f9a4a966c7ad15eec9
commit: 332e6b972567debfa9d8f3f9a4a966c7ad15eec9
branch: main
author: Brandt Bucher <brandt at python.org>
committer: markshannon <mark at hotpy.org>
date: 2022-01-05T11:30:26Z
summary:
bpo-45256: Don't track the exact depth of each `InterpreterFrame` (GH-30372)
files:
M Include/internal/pycore_frame.h
M Lib/test/test_sys.py
M Python/ceval.c
M Tools/gdb/libpython.py
diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h
index 8eca39d1ab250..42df51f635615 100644
--- a/Include/internal/pycore_frame.h
+++ b/Include/internal/pycore_frame.h
@@ -4,6 +4,8 @@
extern "C" {
#endif
+#include <stdbool.h>
+
/* runtime lifecycle */
@@ -44,7 +46,7 @@ typedef struct _interpreter_frame {
int f_lasti; /* Last instruction if called */
int stacktop; /* Offset of TOS from localsplus */
PyFrameState f_state; /* What state the frame is in */
- int depth; /* Depth of the frame in a ceval loop */
+ bool is_entry; // Whether this is the "root" frame for the current CFrame.
PyObject *localsplus[1];
} InterpreterFrame;
@@ -101,7 +103,7 @@ _PyFrame_InitializeSpecials(
frame->generator = NULL;
frame->f_lasti = -1;
frame->f_state = FRAME_CREATED;
- frame->depth = 0;
+ frame->is_entry = false;
}
/* Gets the pointer to the locals array
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index 96075cf3b3473..38771d427da7b 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -1323,7 +1323,7 @@ class C(object): pass
def func():
return sys._getframe()
x = func()
- check(x, size('3Pi3c8P2iciP'))
+ check(x, size('3Pi3c8P2ic?P'))
# function
def func(): pass
check(func, size('14Pi'))
@@ -1340,7 +1340,7 @@ def bar(cls):
check(bar, size('PP'))
# generator
def get_gen(): yield 1
- check(get_gen(), size('P2P4P4c8P2iciP'))
+ check(get_gen(), size('P2P4P4c8P2ic?P'))
# iterator
check(iter('abc'), size('lP'))
# callable-iterator
diff --git a/Python/ceval.c b/Python/ceval.c
index 953876f6226b9..b4ac9ec848f77 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1683,7 +1683,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
cframe.previous = prev_cframe;
tstate->cframe = &cframe;
- assert(frame->depth == 0);
+ frame->is_entry = true;
/* Push frame */
frame->previous = prev_cframe->current_frame;
cframe.current_frame = frame;
@@ -2310,7 +2310,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
_PyFrame_SetStackPointer(frame, stack_pointer);
new_frame->previous = frame;
frame = cframe.current_frame = new_frame;
- new_frame->depth = frame->depth + 1;
goto start_frame;
}
@@ -2475,7 +2474,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
TRACE_FUNCTION_EXIT();
DTRACE_FUNCTION_EXIT();
_Py_LeaveRecursiveCall(tstate);
- if (frame->depth) {
+ if (!frame->is_entry) {
frame = cframe.current_frame = pop_frame(tstate, frame);
_PyFrame_StackPush(frame, retval);
goto resume_frame;
@@ -2625,7 +2624,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
}
TARGET(SEND) {
- assert(frame->depth == 0);
+ assert(frame->is_entry);
assert(STACK_LEVEL() >= 2);
PyObject *v = POP();
PyObject *receiver = TOP();
@@ -2684,7 +2683,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
}
TARGET(YIELD_VALUE) {
- assert(frame->depth == 0);
+ assert(frame->is_entry);
PyObject *retval = POP();
if (frame->f_code->co_flags & CO_ASYNC_GENERATOR) {
@@ -4612,7 +4611,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
_PyFrame_SetStackPointer(frame, stack_pointer);
new_frame->previous = frame;
cframe.current_frame = frame = new_frame;
- new_frame->depth = frame->depth + 1;
goto start_frame;
}
}
@@ -4706,7 +4704,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
_PyFrame_SetStackPointer(frame, stack_pointer);
new_frame->previous = frame;
frame = cframe.current_frame = new_frame;
- new_frame->depth = frame->depth + 1;
goto start_frame;
}
@@ -5382,7 +5379,7 @@ MISS_WITH_OPARG_COUNTER(STORE_SUBSCR)
exit_unwind:
assert(_PyErr_Occurred(tstate));
_Py_LeaveRecursiveCall(tstate);
- if (frame->depth == 0) {
+ if (frame->is_entry) {
/* Restore previous cframe and exit */
tstate->cframe = cframe.previous;
tstate->cframe->use_tracing = cframe.use_tracing;
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
index a0a95e3fc63cb..e3d73bce6cfe5 100755
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -1044,8 +1044,8 @@ def _f_nlocalsplus(self):
def _f_lasti(self):
return self._f_special("f_lasti", int_from_int)
- def depth(self):
- return self._f_special("depth", int_from_int)
+ def is_entry(self):
+ return self._f_special("is_entry", bool)
def previous(self):
return self._f_special("previous", PyFramePtr)
@@ -1860,7 +1860,7 @@ def print_summary(self):
line = interp_frame.current_line()
if line is not None:
sys.stdout.write(' %s\n' % line.strip())
- if interp_frame.depth() == 0:
+ if interp_frame.is_entry():
break
else:
sys.stdout.write('#%i (unable to read python frame information)\n' % self.get_index())
@@ -1883,7 +1883,7 @@ def print_traceback(self):
line = interp_frame.current_line()
if line is not None:
sys.stdout.write(' %s\n' % line.strip())
- if interp_frame.depth() == 0:
+ if interp_frame.is_entry():
break
else:
sys.stdout.write(' (unable to read python frame information)\n')
@@ -2147,7 +2147,7 @@ def invoke(self, args, from_tty):
% (pyop_name.proxyval(set()),
pyop_value.get_truncated_repr(MAX_OUTPUT_LEN)))
- if pyop_frame.depth() == 0:
+ if pyop_frame.is_entry():
break
pyop_frame = pyop_frame.previous()
More information about the Python-checkins
mailing list