summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/bltinmodule.c16
-rw-r--r--Python/ceval.c18
-rw-r--r--Python/pythonrun.c94
3 files changed, 112 insertions, 16 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index ec680d1..9a09c8c 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -373,7 +373,12 @@ builtin_compile(PyObject *self, PyObject *args)
"compile() arg 3 must be 'exec' or 'eval' or 'single'");
return NULL;
}
- return Py_CompileString(str, filename, start);
+ if (PyEval_GetNestedScopes()) {
+ PyCompilerFlags cf;
+ cf.cf_nested_scopes = 1;
+ return Py_CompileStringFlags(str, filename, start, &cf);
+ } else
+ return Py_CompileString(str, filename, start);
}
static char compile_doc[] =
@@ -808,7 +813,14 @@ builtin_execfile(PyObject *self, PyObject *args)
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}
- res = PyRun_FileEx(fp, filename, Py_file_input, globals, locals, 1);
+ if (PyEval_GetNestedScopes()) {
+ PyCompilerFlags cf;
+ cf.cf_nested_scopes = 1;
+ res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
+ locals, 1, &cf);
+ } else
+ res = PyRun_FileEx(fp, filename, Py_file_input, globals,
+ locals, 1);
return res;
}
diff --git a/Python/ceval.c b/Python/ceval.c
index 658ccb2..0905572 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3456,13 +3456,27 @@ exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
else if (PyFile_Check(prog)) {
FILE *fp = PyFile_AsFile(prog);
char *name = PyString_AsString(PyFile_Name(prog));
- v = PyRun_File(fp, name, Py_file_input, globals, locals);
+ if (PyEval_GetNestedScopes()) {
+ PyCompilerFlags cf;
+ cf.cf_nested_scopes = 1;
+ v = PyRun_FileFlags(fp, name, Py_file_input, globals,
+ locals, &cf);
+ } else {
+ v = PyRun_File(fp, name, Py_file_input, globals,
+ locals);
+ }
}
else {
char *str;
if (PyString_AsStringAndSize(prog, &str, NULL))
return -1;
- v = PyRun_String(str, Py_file_input, globals, locals);
+ if (PyEval_GetNestedScopes()) {
+ PyCompilerFlags cf;
+ cf.cf_nested_scopes = 1;
+ v = PyRun_StringFlags(str, Py_file_input, globals,
+ locals, &cf);
+ } else
+ v = PyRun_String(str, Py_file_input, globals, locals);
}
if (plain)
PyFrame_LocalsToFast(f, 0);
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index f7c2820..edb8a11 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -40,7 +40,8 @@ static PyObject *run_err_node(node *, char *, PyObject *, PyObject *,
PyCompilerFlags *);
static PyObject *run_node(node *, char *, PyObject *, PyObject *,
PyCompilerFlags *);
-static PyObject *run_pyc_file(FILE *, char *, PyObject *, PyObject *);
+static PyObject *run_pyc_file(FILE *, char *, PyObject *, PyObject *,
+ PyCompilerFlags *);
static void err_input(perrdetail *);
static void initsigs(void);
static void call_sys_exitfunc(void);
@@ -447,32 +448,54 @@ initsite(void)
int
PyRun_AnyFile(FILE *fp, char *filename)
{
- return PyRun_AnyFileEx(fp, filename, 0);
+ return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
+}
+
+int
+PyRun_AnyFileFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
+{
+ return PyRun_AnyFileExFlags(fp, filename, 0, flags);
}
int
PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
{
+ return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
+}
+
+int
+PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
+ PyCompilerFlags *flags)
+{
if (filename == NULL)
filename = "???";
if (Py_FdIsInteractive(fp, filename)) {
- int err = PyRun_InteractiveLoop(fp, filename);
+ int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
if (closeit)
fclose(fp);
return err;
}
else
- return PyRun_SimpleFileEx(fp, filename, closeit);
+ return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
}
int
PyRun_InteractiveLoop(FILE *fp, char *filename)
{
+ return PyRun_InteractiveLoopFlags(fp, filename, NULL);
+}
+
+int
+PyRun_InteractiveLoopFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
+{
PyObject *v;
int ret;
- PyCompilerFlags flags;
+ PyCompilerFlags local_flags;
- flags.cf_nested_scopes = 0;
+ if (flags == NULL) {
+ flags = &local_flags;
+ local_flags.cf_nested_scopes = 0;
+ }
v = PySys_GetObject("ps1");
if (v == NULL) {
PySys_SetObject("ps1", v = PyString_FromString(">>> "));
@@ -484,7 +507,7 @@ PyRun_InteractiveLoop(FILE *fp, char *filename)
Py_XDECREF(v);
}
for (;;) {
- ret = PyRun_InteractiveOneFlags(fp, filename, &flags);
+ ret = PyRun_InteractiveOneFlags(fp, filename, flags);
#ifdef Py_REF_DEBUG
fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
#endif
@@ -611,6 +634,13 @@ maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
int
PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
{
+ return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
+}
+
+int
+PyRun_SimpleFileExFlags(FILE *fp, char *filename, int closeit,
+ PyCompilerFlags *flags)
+{
PyObject *m, *d, *v;
char *ext;
@@ -630,9 +660,10 @@ PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
/* Turn on optimization if a .pyo file is given */
if (strcmp(ext, ".pyo") == 0)
Py_OptimizeFlag = 1;
- v = run_pyc_file(fp, filename, d, d);
+ v = run_pyc_file(fp, filename, d, d, flags);
} else {
- v = PyRun_FileEx(fp, filename, Py_file_input, d, d, closeit);
+ v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
+ closeit, flags);
}
if (v == NULL) {
PyErr_Print();
@@ -926,7 +957,7 @@ PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
PyObject *
PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
- PyObject *locals, int closeit)
+ PyObject *locals, int closeit)
{
node *n = PyParser_SimpleParseFile(fp, filename, start);
if (closeit)
@@ -934,6 +965,32 @@ PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
return run_err_node(n, filename, globals, locals, NULL);
}
+PyObject *
+PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
+ PyCompilerFlags *flags)
+{
+ return run_err_node(PyParser_SimpleParseString(str, start),
+ "<string>", globals, locals, flags);
+}
+
+PyObject *
+PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
+ PyObject *locals, PyCompilerFlags *flags)
+{
+ return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
+ flags);
+}
+
+PyObject *
+PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
+ PyObject *locals, int closeit, PyCompilerFlags *flags)
+{
+ node *n = PyParser_SimpleParseFile(fp, filename, start);
+ if (closeit)
+ fclose(fp);
+ return run_err_node(n, filename, globals, locals, flags);
+}
+
static PyObject *
run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags)
@@ -949,7 +1006,6 @@ run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
{
PyCodeObject *co;
PyObject *v;
- /* XXX pass sess->ss_nested_scopes to PyNode_Compile */
co = PyNode_CompileFlags(n, filename, flags);
PyNode_Free(n);
if (co == NULL)
@@ -960,7 +1016,8 @@ run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
}
static PyObject *
-run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals)
+run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
+ PyCompilerFlags *flags)
{
PyCodeObject *co;
PyObject *v;
@@ -984,6 +1041,12 @@ run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals)
}
co = (PyCodeObject *)v;
v = PyEval_EvalCode(co, globals, locals);
+ if (v && flags) {
+ if (co->co_flags & CO_NESTED)
+ flags->cf_nested_scopes = 1;
+ fprintf(stderr, "run_pyc_file: nested_scopes: %d\n",
+ flags->cf_nested_scopes);
+ }
Py_DECREF(co);
return v;
}
@@ -991,6 +1054,13 @@ run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals)
PyObject *
Py_CompileString(char *str, char *filename, int start)
{
+ return Py_CompileStringFlags(str, filename, start, NULL);
+}
+
+PyObject *
+Py_CompileStringFlags(char *str, char *filename, int start,
+ PyCompilerFlags *flags)
+{
node *n;
PyCodeObject *co;
n = PyParser_SimpleParseString(str, start);
b) + else: + self.fail("No exception raised") + + +# Disabled until context is implemented +# class TestContext(object): +# def test_instance_context_bare_raise(self): +# context = IndexError() +# try: +# try: +# raise context +# except: +# raise OSError() +# except OSError as e: +# self.assertEqual(e.__context__, context) +# else: +# self.fail("No exception raised") +# +# def test_class_context_bare_raise(self): +# context = IndexError +# try: +# try: +# raise context +# except: +# raise OSError() +# except OSError as e: +# self.assertNotEqual(e.__context__, context) +# self.failUnless(isinstance(e.__context__, context)) +# else: +# self.fail("No exception raised") + + +class TestRemovedFunctionality(unittest.TestCase): + def test_tuples(self): + try: + raise (IndexError, KeyError) # This should be a tuple! + except TypeError: + pass + else: + self.fail("No exception raised") + + def test_strings(self): + try: + raise "foo" + except TypeError: + pass + else: + self.fail("No exception raised") + + +def test_main(): + test_support.run_unittest(__name__) + + +if __name__ == "__main__": + unittest.main() +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Tests for the raise statement.""" + +from test import test_support +import sys +import types +import unittest + + +def get_tb(): + try: + raise OSError() + except: + return sys.exc_info()[2] + + +class TestRaise(unittest.TestCase): + def test_invalid_reraise(self): + try: + raise + except RuntimeError as e: + self.failUnless("No active exception" in str(e)) + else: + self.fail("No exception raised") + + def test_reraise(self): + try: + try: + raise IndexError() + except IndexError as e: + exc1 = e + raise + except IndexError as exc2: + self.failUnless(exc1 is exc2) + else: + self.fail("No exception raised") + + +class TestCause(unittest.TestCase): + def test_invalid_cause(self): + try: + raise IndexError from 5 + except TypeError as e: + self.failUnless("exception cause" in str(e)) + else: + self.fail("No exception raised") + + def test_class_cause(self): + try: + raise IndexError from KeyError + except IndexError as e: + self.failUnless(isinstance(e.__cause__, KeyError)) + else: + self.fail("No exception raised") + + def test_instance_cause(self): + cause = KeyError() + try: + raise IndexError from cause + except IndexError as e: + self.failUnless(e.__cause__ is cause) + else: + self.fail("No exception raised") + + +class TestTraceback(unittest.TestCase): + def test_sets_traceback(self): + try: + raise IndexError() + except IndexError as e: + self.failUnless(isinstance(e.__traceback__, types.TracebackType)) + else: + self.fail("No exception raised") + + def test_accepts_traceback(self): + tb = get_tb() + try: + raise IndexError().with_traceback(tb) + except IndexError as e: + self.assertNotEqual(e.__traceback__, tb) + self.assertEqual(e.__traceback__.tb_next, tb) + else: + self.fail("No exception raised") + + +# Disabled until context is implemented +# class TestContext(object): +# def test_instance_context_bare_raise(self): +# context = IndexError() +# try: +# try: +# raise context +# except: +# raise OSError() +# except OSError as e: +# self.assertEqual(e.__context__, context) +# else: +# self.fail("No exception raised") +# +# def test_class_context_bare_raise(self): +# context = IndexError +# try: +# try: +# raise context +# except: +# raise OSError() +# except OSError as e: +# self.assertNotEqual(e.__context__, context) +# self.failUnless(isinstance(e.__context__, context)) +# else: +# self.fail("No exception raised") + + +class TestRemovedFunctionality(unittest.TestCase): + def test_tuples(self): + try: + raise (IndexError, KeyError) # This should be a tuple! + except TypeError: + pass + else: + self.fail("No exception raised") + + def test_strings(self): + try: + raise "foo" + except TypeError: + pass + else: + self.fail("No exception raised") + + +def test_main(): + test_support.run_unittest(__name__) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 4297d22..546f7a8 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -460,6 +460,16 @@ leading to spurious errors. ... SyntaxError: can't assign to function call +Make sure that the old "raise X, Y[, Z]" form is gone: + >>> raise X, Y + Traceback (most recent call last): + ... + SyntaxError: invalid syntax + >>> raise X, Y, Z + Traceback (most recent call last): + ... + SyntaxError: invalid syntax + """ import re diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index d9adf02..e737047 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -119,11 +119,6 @@ class SysModuleTest(unittest.TestCase): # test that the exit machinery handles SystemExits properly import subprocess - # both unnormalized... - rc = subprocess.call([sys.executable, "-c", - "raise SystemExit, 46"]) - self.assertEqual(rc, 46) - # ... and normalized rc = subprocess.call([sys.executable, "-c", "raise SystemExit(47)"]) self.assertEqual(rc, 47) diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py index 3f1d358..4fc8fe9 100644 --- a/Lib/test/test_with.py +++ b/Lib/test/test_with.py @@ -87,7 +87,7 @@ class Nested(object): ex = sys.exc_info() self.entered = None if ex is not exc_info: - raise ex[0], ex[1], ex[2] + raise ex[0](ex[1]).with_traceback(ex[2]) class MockNested(Nested): diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index f38983f..58935b7 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -244,7 +244,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): def get_file(): return __file__ if __loader__.get_data("some.data") != b"some data": - raise AssertionError, "bad data"\n""" + raise AssertionError("bad data")\n""" pyc = make_pyc(compile(src, "", "exec"), NOW) files = {TESTMOD + pyc_ext: (NOW, pyc), "some.data": (NOW, "some data")} diff --git a/Lib/urllib.py b/Lib/urllib.py index 67f457d..a1e26f0 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -199,7 +199,7 @@ class URLopener: else: return getattr(self, name)(url, data) except socket.error as msg: - raise IOError, ('socket error', msg), sys