Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6b17abf

Browse files
author
Thomas Heller
committed
Fix SF Bug 564931: compile() traceback must include filename.
1 parent 4254cbd commit 6b17abf

5 files changed

Lines changed: 55 additions & 4 deletions

File tree

Include/parsetok.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ extern DL_IMPORT(node *) PyParser_ParseFileFlags(FILE *, char *, grammar *,
3232
int, char *, char *,
3333
perrdetail *, int);
3434

35+
extern DL_IMPORT(node *) PyParser_ParseStringFlagsFilename(char *,
36+
char *,
37+
grammar *, int,
38+
perrdetail *, int);
3539
#ifdef __cplusplus
3640
}
3741
#endif

Include/pythonrun.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ DL_IMPORT(int) PyRun_InteractiveLoopFlags(FILE *, char *, PyCompilerFlags *);
4545
DL_IMPORT(struct _node *) PyParser_SimpleParseString(char *, int);
4646
DL_IMPORT(struct _node *) PyParser_SimpleParseFile(FILE *, char *, int);
4747
DL_IMPORT(struct _node *) PyParser_SimpleParseStringFlags(char *, int, int);
48+
DL_IMPORT(struct _node *) PyParser_SimpleParseStringFlagsFilename(char *,
49+
char *,
50+
int,
51+
int);
4852
DL_IMPORT(struct _node *) PyParser_SimpleParseFileFlags(FILE *, char *,
4953
int, int);
5054

Lib/test/test_compile.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@
2222
except SyntaxError:
2323
pass
2424

25+
if verbose:
26+
print "compiling string with syntax error"
27+
28+
try:
29+
compile("1+*3", "filename", "exec")
30+
except SyntaxError, detail:
31+
if not detail.filename == "filename":
32+
raise TestFailed, "expected 'filename', got %r" % detail.filename
33+
2534
try:
2635
exec 'def f(a = 0, a = 1): pass'
2736
raise TestFailed, "duplicate keyword arguments"

Parser/parsetok.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,27 @@ PyParser_ParseString(char *s, grammar *g, int start, perrdetail *err_ret)
2626
node *
2727
PyParser_ParseStringFlags(char *s, grammar *g, int start,
2828
perrdetail *err_ret, int flags)
29+
{
30+
return PyParser_ParseStringFlagsFilename(s, NULL,
31+
g, start, err_ret, 0);
32+
}
33+
34+
node *
35+
PyParser_ParseStringFlagsFilename(char *s, char *filename,
36+
grammar *g, int start,
37+
perrdetail *err_ret, int flags)
2938
{
3039
struct tok_state *tok;
3140

32-
initerr(err_ret, NULL);
41+
initerr(err_ret, filename);
3342

3443
if ((tok = PyTokenizer_FromString(s)) == NULL) {
3544
err_ret->error = E_NOMEM;
3645
return NULL;
3746
}
3847

3948
if (Py_TabcheckFlag || Py_VerboseFlag) {
40-
tok->filename = "<string>";
49+
tok->filename = filename ? filename : "<string>";
4150
tok->altwarning = (tok->filename != NULL);
4251
if (Py_TabcheckFlag >= 2)
4352
tok->alterror++;

Python/pythonrun.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,7 +1134,9 @@ Py_CompileStringFlags(char *str, char *filename, int start,
11341134
{
11351135
node *n;
11361136
PyCodeObject *co;
1137-
n = PyParser_SimpleParseStringFlags(str, start, PARSER_FLAGS(flags));
1137+
1138+
n = PyParser_SimpleParseStringFlagsFilename(str, filename, start,
1139+
PARSER_FLAGS(flags));
11381140
if (n == NULL)
11391141
return NULL;
11401142
co = PyNode_CompileFlags(n, filename, flags);
@@ -1147,7 +1149,8 @@ Py_SymtableString(char *str, char *filename, int start)
11471149
{
11481150
node *n;
11491151
struct symtable *st;
1150-
n = PyParser_SimpleParseString(str, start);
1152+
n = PyParser_SimpleParseStringFlagsFilename(str, filename,
1153+
start, 0);
11511154
if (n == NULL)
11521155
return NULL;
11531156
st = PyNode_CompileSymtable(n, filename);
@@ -1195,6 +1198,28 @@ PyParser_SimpleParseString(char *str, int start)
11951198
return PyParser_SimpleParseStringFlags(str, start, 0);
11961199
}
11971200

1201+
node *
1202+
PyParser_SimpleParseStringFlagsFilename(char *str, char *filename,
1203+
int start, int flags)
1204+
{
1205+
node *n;
1206+
perrdetail err;
1207+
1208+
n = PyParser_ParseStringFlagsFilename(str, filename,
1209+
&_PyParser_Grammar,
1210+
start, &err, flags);
1211+
if (n == NULL)
1212+
err_input(&err);
1213+
return n;
1214+
}
1215+
1216+
node *
1217+
PyParser_SimpleParseStringFilename(char *str, char *filename, int start)
1218+
{
1219+
return PyParser_SimpleParseStringFlagsFilename(str, filename,
1220+
start, 0);
1221+
}
1222+
11981223
/* Set the error appropriate to the given input error code (see errcode.h) */
11991224

12001225
static void

0 commit comments

Comments
 (0)