From 1de2683cc549ff0d4171ac42037f097d1f0411cf Mon Sep 17 00:00:00 2001 From: Tapeline Date: Thu, 18 Sep 2025 01:15:14 +0500 Subject: [PATCH 1/3] Add clearer message when deleting builtins with del --- Lib/test/test_scope.py | 24 +++++++++++++++++++ ...-09-18-01-13-22.gh-issue-138890.x2QKfy.rst | 1 + Python/bytecodes.c | 23 +++++++++++------- Python/ceval_macros.h | 1 + Python/executor_cases.c.h | 23 +++++++++++------- Python/generated_cases.c.h | 23 +++++++++++------- 6 files changed, 71 insertions(+), 24 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py index 520fbc1b66237b..5f98baf1a58710 100644 --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -835,5 +835,29 @@ def g(self, __arg): with self.assertRaises(TypeError): closure(_MultiplyNested__arg=2) + def test_builtin_deletion_err_message(self): + with self.assertRaisesRegex( + NameError, "cannot delete builtin 'all'" + ): + del all + + def f(): + del all + + with self.assertRaisesRegex( + UnboundLocalError, "cannot delete builtin 'all'" + ): + f() + + def g(): + global all + del all + + with self.assertRaisesRegex( + NameError, "cannot delete builtin 'all'" + ): + g() + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst new file mode 100644 index 00000000000000..a11b96e9192d67 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst @@ -0,0 +1 @@ +Deleting builtin names with ``del`` now gives a clearer error message. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 6c3609d293890f..fcc8cb3fe075c9 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1577,9 +1577,10 @@ dummy_func( err = PyObject_DelItem(ns, name); // Can't use ERROR_IF here. if (err != 0) { - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - NAME_ERROR_MSG, - name); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : NAME_ERROR_MSG; + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, err_msg, name); ERROR_NO_POP(); } } @@ -1720,8 +1721,11 @@ dummy_func( ERROR_NO_POP(); } if (err == 0) { + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : NAME_ERROR_MSG; _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - NAME_ERROR_MSG, name); + err_msg, name); ERROR_NO_POP(); } } @@ -1888,10 +1892,13 @@ dummy_func( inst(DELETE_FAST, (--)) { _PyStackRef v = GETLOCAL(oparg); if (PyStackRef_IsNull(v)) { - _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, - UNBOUNDLOCAL_ERROR_MSG, - PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg) - ); + PyObject *name; + name = PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, + oparg); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : UNBOUNDLOCAL_ERROR_MSG; + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg); ERROR_IF(true); } _PyStackRef tmp = GETLOCAL(oparg); diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index 64ca7716fdbdee..59b3b9a12eff31 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -303,6 +303,7 @@ GETITEM(PyObject *v, Py_ssize_t i) { "cannot access free variable '%s' where it is not associated with a value" \ " in enclosing scope" #define NAME_ERROR_MSG "name '%.200s' is not defined" +#define CANNOT_DELETE_BUILTIN_ERROR_MSG "cannot delete builtin '%.200s'" // If a trace function sets a new f_lineno and // *then* raises, we use the destination when searching diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 1309c1317a6615..1023b58997ff61 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -2210,9 +2210,10 @@ stack_pointer = _PyFrame_GetStackPointer(frame); if (err != 0) { _PyFrame_SetStackPointer(frame, stack_pointer); - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - NAME_ERROR_MSG, - name); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : NAME_ERROR_MSG; + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, err_msg, name); stack_pointer = _PyFrame_GetStackPointer(frame); JUMP_TO_ERROR(); } @@ -2421,8 +2422,11 @@ } if (err == 0) { _PyFrame_SetStackPointer(frame, stack_pointer); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : NAME_ERROR_MSG; _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - NAME_ERROR_MSG, name); + err_msg, name); stack_pointer = _PyFrame_GetStackPointer(frame); JUMP_TO_ERROR(); } @@ -2588,11 +2592,14 @@ oparg = CURRENT_OPARG(); _PyStackRef v = GETLOCAL(oparg); if (PyStackRef_IsNull(v)) { + PyObject *name; _PyFrame_SetStackPointer(frame, stack_pointer); - _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, - UNBOUNDLOCAL_ERROR_MSG, - PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg) - ); + name = PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, + oparg); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : UNBOUNDLOCAL_ERROR_MSG; + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg, name); stack_pointer = _PyFrame_GetStackPointer(frame); JUMP_TO_ERROR(); } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index c1f6f5c85cdd88..d49f77f0bf22b0 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5192,11 +5192,14 @@ INSTRUCTION_STATS(DELETE_FAST); _PyStackRef v = GETLOCAL(oparg); if (PyStackRef_IsNull(v)) { + PyObject *name; _PyFrame_SetStackPointer(frame, stack_pointer); - _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, - UNBOUNDLOCAL_ERROR_MSG, - PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg) - ); + name = PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, + oparg); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : UNBOUNDLOCAL_ERROR_MSG; + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg, name); stack_pointer = _PyFrame_GetStackPointer(frame); JUMP_TO_LABEL(error); } @@ -5225,8 +5228,11 @@ } if (err == 0) { _PyFrame_SetStackPointer(frame, stack_pointer); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : NAME_ERROR_MSG; _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - NAME_ERROR_MSG, name); + err_msg, name); stack_pointer = _PyFrame_GetStackPointer(frame); JUMP_TO_LABEL(error); } @@ -5256,9 +5262,10 @@ stack_pointer = _PyFrame_GetStackPointer(frame); if (err != 0) { _PyFrame_SetStackPointer(frame, stack_pointer); - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - NAME_ERROR_MSG, - name); + const char *err_msg = PyMapping_HasKey(BUILTINS(), name) + ? CANNOT_DELETE_BUILTIN_ERROR_MSG + : NAME_ERROR_MSG; + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, err_msg, name); stack_pointer = _PyFrame_GetStackPointer(frame); JUMP_TO_LABEL(error); } From 8bf802d87caf7dbb84bc5e6c6023f025702febd0 Mon Sep 17 00:00:00 2001 From: Tapeline Date: Thu, 18 Sep 2025 01:28:48 +0500 Subject: [PATCH 2/3] Fix forgotten argument --- Python/bytecodes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index fcc8cb3fe075c9..6814ab8b19725b 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1898,7 +1898,7 @@ dummy_func( const char *err_msg = PyMapping_HasKey(BUILTINS(), name) ? CANNOT_DELETE_BUILTIN_ERROR_MSG : UNBOUNDLOCAL_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg); + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg, name); ERROR_IF(true); } _PyStackRef tmp = GETLOCAL(oparg); From 9c94cbe09182967c44e6c2e9031fea8af3cb492b Mon Sep 17 00:00:00 2001 From: Tapeline Date: Fri, 19 Sep 2025 17:29:49 +0500 Subject: [PATCH 3/3] Make some styling changes. Try to fit C code in reasonable width --- Lib/test/test_scope.py | 12 +--- ...-09-18-01-13-22.gh-issue-138890.x2QKfy.rst | 2 +- Python/bytecodes.c | 39 +++++++------ Python/executor_cases.c.h | 55 ++++++++++++------- Python/generated_cases.c.h | 55 ++++++++++++------- 5 files changed, 97 insertions(+), 66 deletions(-) diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py index 5f98baf1a58710..2e775911c0ae68 100644 --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -836,26 +836,20 @@ def g(self, __arg): closure(_MultiplyNested__arg=2) def test_builtin_deletion_err_message(self): - with self.assertRaisesRegex( - NameError, "cannot delete builtin 'all'" - ): + with self.assertRaisesRegex(NameError, "cannot delete builtin 'all'"): del all def f(): del all - with self.assertRaisesRegex( - UnboundLocalError, "cannot delete builtin 'all'" - ): + with self.assertRaisesRegex(UnboundLocalError, "cannot delete builtin 'all'"): f() def g(): global all del all - with self.assertRaisesRegex( - NameError, "cannot delete builtin 'all'" - ): + with self.assertRaisesRegex(NameError, "cannot delete builtin 'all'"): g() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst index a11b96e9192d67..a96ab13e5b4cb7 100644 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-18-01-13-22.gh-issue-138890.x2QKfy.rst @@ -1 +1 @@ -Deleting builtin names with ``del`` now gives a clearer error message. +Deleting built-in names with :keyword:`del` now gives a clearer error message. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 6814ab8b19725b..f1abb4cb1f5707 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1577,10 +1577,13 @@ dummy_func( err = PyObject_DelItem(ns, name); // Can't use ERROR_IF here. if (err != 0) { - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : NAME_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, err_msg, name); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + } else { + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + } ERROR_NO_POP(); } } @@ -1721,11 +1724,13 @@ dummy_func( ERROR_NO_POP(); } if (err == 0) { - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : NAME_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - err_msg, name); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + } else { + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + } ERROR_NO_POP(); } } @@ -1892,13 +1897,15 @@ dummy_func( inst(DELETE_FAST, (--)) { _PyStackRef v = GETLOCAL(oparg); if (PyStackRef_IsNull(v)) { - PyObject *name; - name = PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, - oparg); - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : UNBOUNDLOCAL_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg, name); + PyObject *localsplusnames = _PyFrame_GetCode(frame)->co_localsplusnames; + PyObject *name = PyTuple_GetItem(localsplusnames, oparg); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + } else { + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, name); + } ERROR_IF(true); } _PyStackRef tmp = GETLOCAL(oparg); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 1023b58997ff61..a981db32c0e250 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -2209,12 +2209,17 @@ err = PyObject_DelItem(ns, name); stack_pointer = _PyFrame_GetStackPointer(frame); if (err != 0) { - _PyFrame_SetStackPointer(frame, stack_pointer); - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : NAME_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, err_msg, name); - stack_pointer = _PyFrame_GetStackPointer(frame); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } else { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } JUMP_TO_ERROR(); } break; @@ -2421,13 +2426,17 @@ JUMP_TO_ERROR(); } if (err == 0) { - _PyFrame_SetStackPointer(frame, stack_pointer); - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : NAME_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - err_msg, name); - stack_pointer = _PyFrame_GetStackPointer(frame); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } else { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } JUMP_TO_ERROR(); } break; @@ -2592,15 +2601,21 @@ oparg = CURRENT_OPARG(); _PyStackRef v = GETLOCAL(oparg); if (PyStackRef_IsNull(v)) { - PyObject *name; + PyObject *localsplusnames = _PyFrame_GetCode(frame)->co_localsplusnames; _PyFrame_SetStackPointer(frame, stack_pointer); - name = PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, - oparg); - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : UNBOUNDLOCAL_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg, name); + PyObject *name = PyTuple_GetItem(localsplusnames, oparg); stack_pointer = _PyFrame_GetStackPointer(frame); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } else { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } JUMP_TO_ERROR(); } _PyStackRef tmp = GETLOCAL(oparg); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index d49f77f0bf22b0..34c378732ed05a 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5192,15 +5192,21 @@ INSTRUCTION_STATS(DELETE_FAST); _PyStackRef v = GETLOCAL(oparg); if (PyStackRef_IsNull(v)) { - PyObject *name; + PyObject *localsplusnames = _PyFrame_GetCode(frame)->co_localsplusnames; _PyFrame_SetStackPointer(frame, stack_pointer); - name = PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, - oparg); - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : UNBOUNDLOCAL_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, err_msg, name); + PyObject *name = PyTuple_GetItem(localsplusnames, oparg); stack_pointer = _PyFrame_GetStackPointer(frame); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } else { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } JUMP_TO_LABEL(error); } _PyStackRef tmp = GETLOCAL(oparg); @@ -5227,13 +5233,17 @@ JUMP_TO_LABEL(error); } if (err == 0) { - _PyFrame_SetStackPointer(frame, stack_pointer); - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : NAME_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, - err_msg, name); - stack_pointer = _PyFrame_GetStackPointer(frame); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } else { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } JUMP_TO_LABEL(error); } DISPATCH(); @@ -5261,12 +5271,17 @@ err = PyObject_DelItem(ns, name); stack_pointer = _PyFrame_GetStackPointer(frame); if (err != 0) { - _PyFrame_SetStackPointer(frame, stack_pointer); - const char *err_msg = PyMapping_HasKey(BUILTINS(), name) - ? CANNOT_DELETE_BUILTIN_ERROR_MSG - : NAME_ERROR_MSG; - _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, err_msg, name); - stack_pointer = _PyFrame_GetStackPointer(frame); + if (PyMapping_HasKeyWithError(BUILTINS(), name) == 1) { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + CANNOT_DELETE_BUILTIN_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } else { + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyEval_FormatExcCheckArg(tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + stack_pointer = _PyFrame_GetStackPointer(frame); + } JUMP_TO_LABEL(error); } DISPATCH();