]> granicus.if.org Git - python/commitdiff
Fix SF Bug 564931: compile() traceback must include filename.
authorThomas Heller <theller@ctypes.org>
Tue, 9 Jul 2002 09:23:27 +0000 (09:23 +0000)
committerThomas Heller <theller@ctypes.org>
Tue, 9 Jul 2002 09:23:27 +0000 (09:23 +0000)
Include/parsetok.h
Include/pythonrun.h
Lib/test/test_compile.py
Parser/parsetok.c
Python/pythonrun.c

index bfe9f8f494bd3a911d7e154acfcccf17bb329948..ad337bd2a897c8a114918085c6a344060106b601 100644 (file)
@@ -32,6 +32,10 @@ extern DL_IMPORT(node *) PyParser_ParseFileFlags(FILE *, char *, grammar *,
                                                 int, char *, char *,
                                                 perrdetail *, int);
 
+extern DL_IMPORT(node *) PyParser_ParseStringFlagsFilename(char *,
+                                             char *,
+                                             grammar *, int,
+                                              perrdetail *, int);
 #ifdef __cplusplus
 }
 #endif
index 3a79288ac044bbe68fa747792f68054d8e224cc9..33cf15c6cc90f471a1329035c782cfc62872ec47 100644 (file)
@@ -45,6 +45,10 @@ DL_IMPORT(int) PyRun_InteractiveLoopFlags(FILE *, char *, PyCompilerFlags *);
 DL_IMPORT(struct _node *) PyParser_SimpleParseString(char *, int);
 DL_IMPORT(struct _node *) PyParser_SimpleParseFile(FILE *, char *, int);
 DL_IMPORT(struct _node *) PyParser_SimpleParseStringFlags(char *, int, int);
+DL_IMPORT(struct _node *) PyParser_SimpleParseStringFlagsFilename(char *,
+                                                                 char *,
+                                                                 int,
+                                                                 int);
 DL_IMPORT(struct _node *) PyParser_SimpleParseFileFlags(FILE *, char *,
                                                        int, int);
 
index 3801cacd87f804b6409c0043bd2c846e69c0d0c9..c0638554310f281187b3cf59e0253ec1c1c7f8d7 100644 (file)
@@ -22,6 +22,15 @@ try:
 except SyntaxError:
     pass
 
+if verbose:
+    print "compiling string with syntax error"
+
+try:
+    compile("1+*3", "filename", "exec")
+except SyntaxError, detail:
+    if not detail.filename == "filename":
+        raise TestFailed, "expected 'filename', got %r" % detail.filename
+
 try:
     exec 'def f(a = 0, a = 1): pass'
     raise TestFailed, "duplicate keyword arguments"
index 472b0f5d53080576dee7266ac27dd8f5e6e6fae7..cd3887dff9cb5c8134391e80d5f36a3dc5fca883 100644 (file)
@@ -26,10 +26,19 @@ PyParser_ParseString(char *s, grammar *g, int start, perrdetail *err_ret)
 node *
 PyParser_ParseStringFlags(char *s, grammar *g, int start,
                          perrdetail *err_ret, int flags)
+{
+       return PyParser_ParseStringFlagsFilename(s, NULL,
+                                                g, start, err_ret, 0);
+}
+
+node *
+PyParser_ParseStringFlagsFilename(char *s, char *filename,
+                         grammar *g, int start,
+                         perrdetail *err_ret, int flags)
 {
        struct tok_state *tok;
 
-       initerr(err_ret, NULL);
+       initerr(err_ret, filename);
 
        if ((tok = PyTokenizer_FromString(s)) == NULL) {
                err_ret->error = E_NOMEM;
@@ -37,7 +46,7 @@ PyParser_ParseStringFlags(char *s, grammar *g, int start,
        }
 
        if (Py_TabcheckFlag || Py_VerboseFlag) {
-               tok->filename = "<string>";
+               tok->filename = filename ? filename : "<string>";
                tok->altwarning = (tok->filename != NULL);
                if (Py_TabcheckFlag >= 2)
                        tok->alterror++;
index ec8291c06b18449884e47bda7703637a929753dc..88367ae1f88e183b3d0be8a16c0df40cc823288d 100644 (file)
@@ -1134,7 +1134,9 @@ Py_CompileStringFlags(char *str, char *filename, int start,
 {
        node *n;
        PyCodeObject *co;
-       n = PyParser_SimpleParseStringFlags(str, start, PARSER_FLAGS(flags));
+
+       n = PyParser_SimpleParseStringFlagsFilename(str, filename, start,
+                                                   PARSER_FLAGS(flags));
        if (n == NULL)
                return NULL;
        co = PyNode_CompileFlags(n, filename, flags);
@@ -1147,7 +1149,8 @@ Py_SymtableString(char *str, char *filename, int start)
 {
        node *n;
        struct symtable *st;
-       n = PyParser_SimpleParseString(str, start);
+       n = PyParser_SimpleParseStringFlagsFilename(str, filename,
+                                                   start, 0);
        if (n == NULL)
                return NULL;
        st = PyNode_CompileSymtable(n, filename);
@@ -1195,6 +1198,28 @@ PyParser_SimpleParseString(char *str, int start)
        return PyParser_SimpleParseStringFlags(str, start, 0);
 }
 
+node *
+PyParser_SimpleParseStringFlagsFilename(char *str, char *filename,
+                                       int start, int flags)
+{
+       node *n;
+       perrdetail err;
+
+       n = PyParser_ParseStringFlagsFilename(str, filename, 
+                                             &_PyParser_Grammar,
+                                             start, &err, flags);
+       if (n == NULL)
+               err_input(&err);
+       return n;
+}
+
+node *
+PyParser_SimpleParseStringFilename(char *str, char *filename, int start)
+{
+       return PyParser_SimpleParseStringFlagsFilename(str, filename,
+                                                      start, 0);
+}
+
 /* Set the error appropriate to the given input error code (see errcode.h) */
 
 static void