Fix SF Bug 564931: compile() traceback must include filename.
diff --git a/Include/parsetok.h b/Include/parsetok.h
index bfe9f8f..ad337bd 100644
--- a/Include/parsetok.h
+++ b/Include/parsetok.h
@@ -32,6 +32,10 @@
 						 int, char *, char *,
 						 perrdetail *, int);
 
+extern DL_IMPORT(node *) PyParser_ParseStringFlagsFilename(char *,
+					      char *,
+					      grammar *, int,
+                                              perrdetail *, int);
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index 3a79288..33cf15c 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -45,6 +45,10 @@
 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);
 
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 3801cac..c063855 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -22,6 +22,15 @@
 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"
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index 472b0f5..cd3887d 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -27,9 +27,18 @@
 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 @@
 	}
 
 	if (Py_TabcheckFlag || Py_VerboseFlag) {
-		tok->filename = "<string>";
+		tok->filename = filename ? filename : "<string>";
 		tok->altwarning = (tok->filename != NULL);
 		if (Py_TabcheckFlag >= 2)
 			tok->alterror++;
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index ec8291c..88367ae 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -1134,7 +1134,9 @@
 {
 	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 @@
 {
 	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 @@
 	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