Mercurial > cpython-lru_cache-weakref
diff Python/ceval.c @ 14268:cd8b815cb196 legacy-trunk
Better error message with UnboundLocalError
| author | Paul Prescod <prescod@prescod.net> |
|---|---|
| date | Wed, 30 Aug 2000 20:25:01 +0000 |
| parents | 74f7f237f739 |
| children | b8b3f76ffd51 |
line wrap: on
line diff
--- a/Python/ceval.c Wed Aug 30 17:32:24 2000 +0000 +++ b/Python/ceval.c Wed Aug 30 20:25:01 2000 +0000 @@ -73,7 +73,12 @@ PyObject *, PyObject *, PyObject *); static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *); static void reset_exc_info(PyThreadState *); +static void format_exc_check_arg(PyObject *, char *, PyObject *); +#define NAME_ERROR_MSG \ + "There is no variable named '%s'" +#define UNBOUNDLOCAL_ERROR_MSG \ + "Local variable '%.200s' referenced before assignment" /* Dynamic execution profile */ #ifdef DYNAMIC_EXECUTION_PROFILE @@ -1396,7 +1401,8 @@ break; } if ((err = PyDict_DelItem(x, w)) != 0) - PyErr_SetObject(PyExc_NameError, w); + format_exc_check_arg(PyExc_NameError, + NAME_ERROR_MSG ,w); break; case UNPACK_SEQUENCE: @@ -1471,7 +1477,8 @@ case DELETE_GLOBAL: w = GETNAMEV(oparg); if ((err = PyDict_DelItem(f->f_globals, w)) != 0) - PyErr_SetObject(PyExc_NameError, w); + format_exc_check_arg( + PyExc_NameError, NAME_ERROR_MSG ,w); break; case LOAD_CONST: @@ -1493,8 +1500,9 @@ if (x == NULL) { x = PyDict_GetItem(f->f_builtins, w); if (x == NULL) { - PyErr_SetObject( - PyExc_NameError, w); + format_exc_check_arg( + PyExc_NameError, + NAME_ERROR_MSG ,w); break; } } @@ -1509,7 +1517,9 @@ if (x == NULL) { x = PyDict_GetItem(f->f_builtins, w); if (x == NULL) { - PyErr_SetObject(PyExc_NameError, w); + format_exc_check_arg( + PyExc_NameError, + NAME_ERROR_MSG ,w); break; } } @@ -1520,9 +1530,11 @@ case LOAD_FAST: x = GETLOCAL(oparg); if (x == NULL) { - PyErr_SetObject(PyExc_UnboundLocalError, - PyTuple_GetItem(co->co_varnames, - oparg)); + format_exc_check_arg( + PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, + PyTuple_GetItem(co->co_varnames, oparg) + ); break; } Py_INCREF(x); @@ -1538,9 +1550,11 @@ case DELETE_FAST: x = GETLOCAL(oparg); if (x == NULL) { - PyErr_SetObject(PyExc_UnboundLocalError, - PyTuple_GetItem(co->co_varnames, - oparg)); + format_exc_check_arg( + PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, + PyTuple_GetItem(co->co_varnames, oparg) + ); break; } SETLOCAL(oparg, NULL); @@ -3063,6 +3077,20 @@ return 0; } +static void +format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj) +{ + char *obj_str; + + if (!obj) + return; + + obj_str = PyString_AsString(obj); + if (!obj_str) + return; + + PyErr_Format(exc, format_str, obj_str); +} #ifdef DYNAMIC_EXECUTION_PROFILE
