Bug #889500, fix line number on SyntaxWarning for global declarations.

This commit is contained in:
Neal Norwitz 2005-12-19 04:27:42 +00:00
parent a3bdc2c2a5
commit 5d0ad50f5a
2 changed files with 12 additions and 7 deletions

View File

@ -12,6 +12,8 @@ What's New in Python 2.5 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- Bug #889500, fix line number on SyntaxWarning for global declarations.
- Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter. - Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter.
- Support for converting hex strings to floats no longer works. - Support for converting hex strings to floats no longer works.

View File

@ -4,13 +4,16 @@
#include "symtable.h" #include "symtable.h"
#include "structmember.h" #include "structmember.h"
/* two error strings used for warnings */ /* error strings used for warnings */
#define GLOBAL_AFTER_ASSIGN \ #define GLOBAL_AFTER_ASSIGN \
"name '%.400s' is assigned to before global declaration" "name '%.400s' is assigned to before global declaration"
#define GLOBAL_AFTER_USE \ #define GLOBAL_AFTER_USE \
"name '%.400s' is used prior to global declaration" "name '%.400s' is used prior to global declaration"
#define IMPORT_STAR_WARNING "import * only allowed at module level"
PySTEntryObject * PySTEntryObject *
PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block, PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block,
void *key, int lineno) void *key, int lineno)
@ -152,7 +155,7 @@ PyTypeObject PySTEntry_Type = {
}; };
static int symtable_analyze(struct symtable *st); static int symtable_analyze(struct symtable *st);
static int symtable_warn(struct symtable *st, char *msg); static int symtable_warn(struct symtable *st, char *msg, int lineno);
static int symtable_enter_block(struct symtable *st, identifier name, static int symtable_enter_block(struct symtable *st, identifier name,
_Py_block_ty block, void *ast, int lineno); _Py_block_ty block, void *ast, int lineno);
static int symtable_exit_block(struct symtable *st, void *ast); static int symtable_exit_block(struct symtable *st, void *ast);
@ -686,10 +689,10 @@ symtable_analyze(struct symtable *st)
static int static int
symtable_warn(struct symtable *st, char *msg) symtable_warn(struct symtable *st, char *msg, int lineno)
{ {
if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename, if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
st->st_cur->ste_lineno, NULL, NULL) < 0) { lineno, NULL, NULL) < 0) {
if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
PyErr_SetString(PyExc_SyntaxError, msg); PyErr_SetString(PyExc_SyntaxError, msg);
PyErr_SyntaxLocation(st->st_filename, PyErr_SyntaxLocation(st->st_filename,
@ -1028,7 +1031,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
PyOS_snprintf(buf, sizeof(buf), PyOS_snprintf(buf, sizeof(buf),
GLOBAL_AFTER_USE, GLOBAL_AFTER_USE,
c_name); c_name);
if (!symtable_warn(st, buf)) if (!symtable_warn(st, buf, s->lineno))
return 0; return 0;
} }
if (!symtable_add_def(st, name, DEF_GLOBAL)) if (!symtable_add_def(st, name, DEF_GLOBAL))
@ -1277,8 +1280,8 @@ symtable_visit_alias(struct symtable *st, alias_ty a)
} }
else { else {
if (st->st_cur->ste_type != ModuleBlock) { if (st->st_cur->ste_type != ModuleBlock) {
if (!symtable_warn(st, int lineno = st->st_cur->ste_lineno;
"import * only allowed at module level")) { if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
Py_DECREF(store_name); Py_DECREF(store_name);
return 0; return 0;
} }