[Python-checkins] CVS: python/dist/src/Python ceval.c,2.198,2.199

Paul Prescod python-dev@python.org
Wed, 30 Aug 2000 13:25:05 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory slayer.i.sourceforge.net:/tmp/cvs-serv17839

Modified Files:
	ceval.c 
Log Message:
Better error message with UnboundLocalError


Index: ceval.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/ceval.c,v
retrieving revision 2.198
retrieving revision 2.199
diff -C2 -r2.198 -r2.199
*** ceval.c	2000/08/29 04:56:13	2.198
--- ceval.c	2000/08/30 20:25:01	2.199
***************
*** 74,78 ****
--- 74,83 ----
  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 */
***************
*** 1397,1401 ****
  			}
  			if ((err = PyDict_DelItem(x, w)) != 0)
! 				PyErr_SetObject(PyExc_NameError, w);
  			break;
  
--- 1402,1407 ----
  			}
  			if ((err = PyDict_DelItem(x, w)) != 0)
! 				format_exc_check_arg(PyExc_NameError, 
! 							NAME_ERROR_MSG ,w);
  			break;
  
***************
*** 1472,1476 ****
  			w = GETNAMEV(oparg);
  			if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
! 				PyErr_SetObject(PyExc_NameError, w);
  			break;
  		
--- 1478,1483 ----
  			w = GETNAMEV(oparg);
  			if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
! 				format_exc_check_arg(
! 				    PyExc_NameError, NAME_ERROR_MSG ,w);
  			break;
  		
***************
*** 1494,1499 ****
  					x = PyDict_GetItem(f->f_builtins, w);
  					if (x == NULL) {
! 						PyErr_SetObject(
! 							PyExc_NameError, w);
  						break;
  					}
--- 1501,1507 ----
  					x = PyDict_GetItem(f->f_builtins, w);
  					if (x == NULL) {
! 						format_exc_check_arg(
! 							    PyExc_NameError, 
! 							    NAME_ERROR_MSG ,w);
  						break;
  					}
***************
*** 1510,1514 ****
  				x = PyDict_GetItem(f->f_builtins, w);
  				if (x == NULL) {
! 					PyErr_SetObject(PyExc_NameError, w);
  					break;
  				}
--- 1518,1524 ----
  				x = PyDict_GetItem(f->f_builtins, w);
  				if (x == NULL) {
! 					format_exc_check_arg(
! 						    PyExc_NameError, 
! 						    NAME_ERROR_MSG ,w);
  					break;
  				}
***************
*** 1521,1527 ****
  			x = GETLOCAL(oparg);
  			if (x == NULL) {
! 				PyErr_SetObject(PyExc_UnboundLocalError,
! 					   PyTuple_GetItem(co->co_varnames,
! 							oparg));
  				break;
  			}
--- 1531,1539 ----
  			x = GETLOCAL(oparg);
  			if (x == NULL) {
! 				format_exc_check_arg(
! 					PyExc_UnboundLocalError,
! 					UNBOUNDLOCAL_ERROR_MSG,
! 					PyTuple_GetItem(co->co_varnames, oparg)
! 					);
  				break;
  			}
***************
*** 1539,1545 ****
  			x = GETLOCAL(oparg);
  			if (x == NULL) {
! 				PyErr_SetObject(PyExc_UnboundLocalError,
! 					   PyTuple_GetItem(co->co_varnames,
! 							oparg));
  				break;
  			}
--- 1551,1559 ----
  			x = GETLOCAL(oparg);
  			if (x == NULL) {
! 				format_exc_check_arg(
! 					PyExc_UnboundLocalError,
! 					UNBOUNDLOCAL_ERROR_MSG,
! 					PyTuple_GetItem(co->co_varnames, oparg)
! 					);
  				break;
  			}
***************
*** 3064,3067 ****
--- 3078,3095 ----
  }
  
+ 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