[Python-checkins] python/dist/src/Python pythonrun.c,2.161.2.4,2.161.2.5
jhylton@users.sourceforge.net
jhylton@users.sourceforge.net
Fri, 30 Aug 2002 13:20:44 -0700
Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv11309/Python
Modified Files:
Tag: ast-branch
pythonrun.c
Log Message:
Interim repair to parser error handling.
I haven't fully debugged the problem, but it appears that the
perrdetail structure isn't always setup properly. Perhaps an error is
raised inside PyAST_FromNode() and err_input() gets called anyway. At
any rate, recode this routine so it is a bit more defensive. Delay
calling Py_BuildValue() until err->error has been inspected. If
err->error is garbage, exit right away. The previous code passed
err->garbage to Py_BuildValue() causing a segfault.
XXX Need to figure out what is actually going wrong.
Index: pythonrun.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/pythonrun.c,v
retrieving revision 2.161.2.4
retrieving revision 2.161.2.5
diff -C2 -d -r2.161.2.4 -r2.161.2.5
*** pythonrun.c 23 Aug 2002 18:13:27 -0000 2.161.2.4
--- pythonrun.c 30 Aug 2002 20:20:33 -0000 2.161.2.5
***************
*** 832,835 ****
--- 832,837 ----
}
PyErr_Fetch(&exception, &v, &tb);
+ if (exception == NULL)
+ return;
PyErr_NormalizeException(&exception, &v, &tb);
if (exception == NULL)
***************
*** 1096,1099 ****
--- 1098,1102 ----
node *n;
perrdetail err;
+ fprintf(stderr, "filename=%s\n", filename);
n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
ps1, ps2, &err, flags);
***************
*** 1155,1164 ****
char *msg = NULL;
errtype = PyExc_SyntaxError;
- v = Py_BuildValue("(ziiz)", err->filename,
- err->lineno, err->offset, err->text);
- if (err->text != NULL) {
- PyMem_DEL(err->text);
- err->text = NULL;
- }
switch (err->error) {
case E_SYNTAX:
--- 1158,1161 ----
***************
*** 1204,1211 ****
msg = "too many levels of indentation";
break;
! default:
! fprintf(stderr, "error=%d\n", err->error);
! msg = "unknown parsing error";
break;
}
w = Py_BuildValue("(sO)", msg, v);
--- 1201,1219 ----
msg = "too many levels of indentation";
break;
! default: {
! char buf[256];
! sprintf(buf, "unknown parsing error=%d\n", err->error);
! Py_FatalError(buf);
! /* If the error code is bogus, who knows what the state
! of the rest of err is.
! */
break;
+ }
+ }
+ v = Py_BuildValue("(ziiz)", err->filename,
+ err->lineno, err->offset, err->text);
+ if (err->text != NULL) {
+ PyMem_DEL(err->text);
+ err->text = NULL;
}
w = Py_BuildValue("(sO)", msg, v);