summaryrefslogtreecommitdiff
path: root/Objects/frameobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/frameobject.c')
-rw-r--r--Objects/frameobject.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 2af69597c3..00d6888ff2 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -397,9 +397,7 @@ first_line_not_before(int *lines, int len, int line)
static void
frame_stack_pop(PyFrameObject *f)
{
- assert(f->f_frame->stackdepth > 0);
- f->f_frame->stackdepth--;
- PyObject *v = f->f_frame->stack[f->f_frame->stackdepth];
+ PyObject *v = _PyFrame_StackPop(f->f_frame);
Py_DECREF(v);
}
@@ -633,14 +631,10 @@ frame_dealloc(PyFrameObject *f)
Py_CLEAR(frame->f_builtins);
Py_CLEAR(frame->f_locals);
PyObject **locals = _PyFrame_GetLocalsArray(frame);
- for (int i = 0; i < co->co_nlocalsplus; i++) {
+ for (int i = 0; i < frame->stacktop; i++) {
Py_CLEAR(locals[i]);
}
- /* stack */
- for (int i = 0; i < frame->stackdepth; i++) {
- Py_CLEAR(frame->stack[i]);
- }
- PyMem_Free(locals);
+ PyMem_Free(frame);
}
Py_CLEAR(f->f_back);
Py_CLEAR(f->f_trace);
@@ -686,17 +680,13 @@ frame_tp_clear(PyFrameObject *f)
Py_CLEAR(f->f_trace);
- /* locals */
+ /* locals and stack */
PyObject **locals = _PyFrame_GetLocalsArray(f->f_frame);
- for (int i = 0; i < f->f_frame->nlocalsplus; i++) {
+ assert(f->f_frame->stacktop >= 0);
+ for (int i = 0; i < f->f_frame->stacktop; i++) {
Py_CLEAR(locals[i]);
}
-
- /* stack */
- for (int i = 0; i < f->f_frame->stackdepth; i++) {
- Py_CLEAR(f->f_frame->stack[i]);
- }
- f->f_frame->stackdepth = 0;
+ f->f_frame->stacktop = 0;
return 0;
}