diff Python/compile.c @ 16428:6496844c4a42 legacy-trunk

Fix symbol table pass to generation SyntaxError exceptions that include the filename and line number.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Fri, 02 Feb 2001 20:01:10 +0000
parents aa844711463a
children 9d625303f914
line wrap: on
line diff
--- a/Python/compile.c	Fri Feb 02 19:55:17 2001 +0000
+++ b/Python/compile.c	Fri Feb 02 20:01:10 2001 +0000
@@ -371,9 +371,38 @@
 /* Error message including line number */
 
 static void
+set_error_location(char *filename, int lineno)
+{
+	PyObject *exc, *v, *tb, *tmp;
+
+	/* add attributes for the line number and filename for the error */
+	PyErr_Fetch(&exc, &v, &tb);
+	PyErr_NormalizeException(&exc, &v, &tb);
+	tmp = PyInt_FromLong(lineno);
+	if (tmp == NULL)
+		PyErr_Clear();
+	else {
+		if (PyObject_SetAttrString(v, "lineno", tmp))
+			PyErr_Clear();
+		Py_DECREF(tmp);
+	}
+	if (filename != NULL) {
+		tmp = PyString_FromString(filename);
+		if (tmp == NULL)
+			PyErr_Clear();
+		else {
+			if (PyObject_SetAttrString(v, "filename", tmp))
+				PyErr_Clear();
+			Py_DECREF(tmp);
+		}
+	}
+	PyErr_Restore(exc, v, tb);
+}
+
+static void
 com_error(struct compiling *c, PyObject *exc, char *msg)
 {
-	PyObject *v, *tb, *tmp;
+	PyObject *v;
 	if (c == NULL) {
 		/* Error occurred via symtable call to
 		   is_constant_false */
@@ -392,28 +421,7 @@
 	PyErr_SetObject(exc, v);
 	Py_DECREF(v);
 
-	/* add attributes for the line number and filename for the error */
-	PyErr_Fetch(&exc, &v, &tb);
-	PyErr_NormalizeException(&exc, &v, &tb);
-	tmp = PyInt_FromLong(c->c_lineno);
-	if (tmp == NULL)
-		PyErr_Clear();
-	else {
-		if (PyObject_SetAttrString(v, "lineno", tmp))
-			PyErr_Clear();
-		Py_DECREF(tmp);
-	}
-	if (c->c_filename != NULL) {
-		tmp = PyString_FromString(c->c_filename);
-		if (tmp == NULL)
-			PyErr_Clear();
-		else {
-			if (PyObject_SetAttrString(v, "filename", tmp))
-				PyErr_Clear();
-			Py_DECREF(tmp);
-		}
-	}
-	PyErr_Restore(exc, v, tb);
+	set_error_location(c->c_filename, c->c_lineno);
 }
 
 
@@ -3804,6 +3812,7 @@
 	st = symtable_init(1);
 	if (st == NULL)
 		return NULL;
+	assert(st->st_symbols != NULL);
 	symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
 	if (st->st_errors > 0) {
 		PySymtable_Free(st);
@@ -3952,6 +3961,7 @@
 {
 	if ((c->c_symtable = symtable_init(0)) == NULL)
 		return -1;
+	c->c_symtable->st_filename = c->c_filename;
 	symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
 	if (c->c_symtable->st_errors > 0)
 		return -1;
@@ -4057,11 +4067,11 @@
 		else if (info & DEF_GLOBAL) {
 			if ((info & DEF_PARAM) 
 			    && (PyString_AS_STRING(name)[0] != '.')){
-				char buf[500];
-				sprintf(buf, 
-					"name '%.400s' is local and global",
-					PyString_AS_STRING(name));
-				com_error(c, PyExc_SyntaxError, buf);
+				PyErr_Format(PyExc_SyntaxError,
+				     "name '%.400s' is local and global",
+					     PyString_AS_STRING(name));
+				set_error_location(st->st_filename,
+						   st->st_cur_lineno);
 				goto fail;
 			}
 			if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
@@ -4119,13 +4129,12 @@
 		if (PyDict_GetItemString(st->st_cur, NOOPT) == NULL)
 			c->c_flags |= CO_OPTIMIZED;
 		else if (ncells || nfrees) {
-			char buf[256];
-			/* XXX need better error message */
-			sprintf(buf, 
+			PyErr_Format(PyExc_SyntaxError,
 				"function %.100s: may not use lexical scoping"
 				" and 'import *' or exec in same function",
 				PyString_AS_STRING(st->st_cur_name));
-			com_error(c, PyExc_SyntaxError, buf);
+			set_error_location(st->st_filename,
+					   st->st_cur_lineno);
 			return -1;
 		}
 	}
@@ -4148,6 +4157,7 @@
 		return NULL;
 	st->st_pass = 1;
 	st->st_keep = keep;
+	st->st_filename = NULL;
 	if ((st->st_stack = PyList_New(0)) == NULL)
 		goto fail;
 	if ((st->st_symbols = PyDict_New()) == NULL)
@@ -4160,6 +4170,7 @@
 		goto fail;
 	if (PyDict_SetItemString(st->st_symbols, TOP, d) < 0)
 		goto fail;
+	st->st_global = d;
 	Py_DECREF(d);
 	if (keep) {
 		if ((d = PyDict_New()) == NULL)
@@ -4167,7 +4178,6 @@
 		st->st_scopes = d;
 	} else 
 		st->st_scopes = NULL;
-	st->st_global = d; /* use ref borrowed from st->st_symbols */
 	st->st_cur = NULL;
 	st->st_cur_id = NULL;
 	st->st_cur_name = NULL;
@@ -4505,6 +4515,8 @@
 	    if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
 		    PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
 				 PyString_AsString(name));
+		    set_error_location(st->st_filename,
+				       st->st_cur_lineno);
 		    return -1;
 	    }
 	    val |= flag;
@@ -4844,6 +4856,8 @@
 			if (st->st_cur_type != TYPE_MODULE) {
 				PyErr_SetString(PyExc_SyntaxError,
 						ILLEGAL_IMPORT_STAR);
+				set_error_location(st->st_filename,
+						   n->n_lineno);
 				st->st_errors++;
 				return;
 			}