diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index d5c1dcc82a883d..5306134d32badc 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -110,7 +110,7 @@ void _PyFrame_Copy(_PyInterpreterFrame *src, _PyInterpreterFrame *dest); when frame is linked into the frame stack. */ static inline void -_PyFrame_InitializeSpecials( +_PyFrame_Initialize( _PyInterpreterFrame *frame, PyFunctionObject *func, PyObject *locals, PyCodeObject *code) { @@ -124,6 +124,10 @@ _PyFrame_InitializeSpecials( frame->prev_instr = _PyCode_CODE(code) - 1; frame->yield_offset = 0; frame->owner = FRAME_OWNED_BY_THREAD; + + for (int i = 0; i < code->co_nlocalsplus; i++) { + frame->localsplus[i] = NULL; + } } /* Gets the pointer to the locals array @@ -231,7 +235,7 @@ _PyFrame_PushUnchecked(PyThreadState *tstate, PyFunctionObject *func) _PyInterpreterFrame *new_frame = (_PyInterpreterFrame *)tstate->datastack_top; tstate->datastack_top += code->co_framesize; assert(tstate->datastack_top < tstate->datastack_limit); - _PyFrame_InitializeSpecials(new_frame, func, NULL, code); + _PyFrame_Initialize(new_frame, func, NULL, code); return new_frame; } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 8d7ee4b81eb7dc..a60a52593f30a0 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1011,12 +1011,9 @@ static void init_frame(_PyInterpreterFrame *frame, PyFunctionObject *func, PyObject *locals) { PyCodeObject *code = (PyCodeObject *)func->func_code; - _PyFrame_InitializeSpecials(frame, (PyFunctionObject*)Py_NewRef(func), - Py_XNewRef(locals), code); + _PyFrame_Initialize(frame, (PyFunctionObject*)Py_NewRef(func), + Py_XNewRef(locals), code); frame->previous = NULL; - for (Py_ssize_t i = 0; i < code->co_nlocalsplus; i++) { - frame->localsplus[i] = NULL; - } } PyFrameObject* diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 5f8871c4b3de4f..e8788be6bff9b8 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -457,9 +457,6 @@ dummy_func( STACK_SHRINK(2); new_frame->localsplus[0] = container; new_frame->localsplus[1] = sub; - for (int i = 2; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); DISPATCH_INLINED(new_frame); } @@ -1787,9 +1784,6 @@ dummy_func( int shrink_stack = !(oparg & 1); STACK_SHRINK(shrink_stack); new_frame->localsplus[0] = owner; - for (int i = 1; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH_INLINED(new_frame); } @@ -1823,9 +1817,6 @@ dummy_func( STACK_SHRINK(shrink_stack); new_frame->localsplus[0] = owner; new_frame->localsplus[1] = Py_NewRef(name); - for (int i = 2; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH_INLINED(new_frame); } @@ -2766,9 +2757,6 @@ dummy_func( for (int i = 0; i < argcount; i++) { new_frame->localsplus[i] = stack_pointer[i]; } - for (int i = argcount; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } STACK_SHRINK(2-is_meth); JUMPBY(INLINE_CACHE_ENTRIES_CALL); DISPATCH_INLINED(new_frame); @@ -2801,9 +2789,6 @@ dummy_func( i - minargs); new_frame->localsplus[i] = Py_NewRef(def); } - for (int i = code->co_argcount; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } STACK_SHRINK(2-is_meth); JUMPBY(INLINE_CACHE_ENTRIES_CALL); DISPATCH_INLINED(new_frame); diff --git a/Python/ceval.c b/Python/ceval.c index 54df1c512502eb..3e3386309d35b1 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1974,11 +1974,8 @@ _PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func, if (frame == NULL) { goto fail; } - _PyFrame_InitializeSpecials(frame, func, locals, code); + _PyFrame_Initialize(frame, func, locals, code); PyObject **localsarray = &frame->localsplus[0]; - for (int i = 0; i < code->co_nlocalsplus; i++) { - localsarray[i] = NULL; - } if (initialize_locals(tstate, func, localsarray, args, argcount, kwnames)) { assert(frame->owner != FRAME_OWNED_BY_GENERATOR); _PyEvalFrameClearAndPop(tstate, frame); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index fa1f941044e01b..efac98105b32d9 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -578,9 +578,6 @@ STACK_SHRINK(2); new_frame->localsplus[0] = container; new_frame->localsplus[1] = sub; - for (int i = 2; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); DISPATCH_INLINED(new_frame); } @@ -2027,9 +2024,6 @@ int shrink_stack = !(oparg & 1); STACK_SHRINK(shrink_stack); new_frame->localsplus[0] = owner; - for (int i = 1; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH_INLINED(new_frame); } @@ -2062,9 +2056,6 @@ STACK_SHRINK(shrink_stack); new_frame->localsplus[0] = owner; new_frame->localsplus[1] = Py_NewRef(name); - for (int i = 2; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH_INLINED(new_frame); } @@ -3121,9 +3112,6 @@ for (int i = 0; i < argcount; i++) { new_frame->localsplus[i] = stack_pointer[i]; } - for (int i = argcount; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } STACK_SHRINK(2-is_meth); JUMPBY(INLINE_CACHE_ENTRIES_CALL); DISPATCH_INLINED(new_frame); @@ -3155,9 +3143,6 @@ i - minargs); new_frame->localsplus[i] = Py_NewRef(def); } - for (int i = code->co_argcount; i < code->co_nlocalsplus; i++) { - new_frame->localsplus[i] = NULL; - } STACK_SHRINK(2-is_meth); JUMPBY(INLINE_CACHE_ENTRIES_CALL); DISPATCH_INLINED(new_frame);