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
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:
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:
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;
}
}
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;
}
}
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);
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);
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