diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2013-11-15 11:47:37 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2013-11-15 11:47:37 (GMT) |
commit | c4c2580d43880ac2013aff5e72674bae379c99a4 (patch) | |
tree | a9a4ab0cc66adf2b1542a33153541e03c230987c | |
parent | 91d2c5674a059dcf8820fb7585c03b5491449605 (diff) | |
download | cpython-c4c2580d43880ac2013aff5e72674bae379c99a4.zip cpython-c4c2580d43880ac2013aff5e72674bae379c99a4.tar.gz cpython-c4c2580d43880ac2013aff5e72674bae379c99a4.tar.bz2 |
Close 19609: narrow scope of codec exc chaining
-rw-r--r-- | Lib/test/test_codecs.py | 37 | ||||
-rw-r--r-- | Python/codecs.c | 10 |
2 files changed, 32 insertions, 15 deletions
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index f43ac3a..235a91a 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -2435,22 +2435,22 @@ class ExceptionChainingTest(unittest.TestCase): self.check_wrapped(RuntimeError(msg), msg) @contextlib.contextmanager - def assertNotWrapped(self, operation, exc_type, msg): + def assertNotWrapped(self, operation, exc_type, msg_re, msg=None): + if msg is None: + msg = msg_re with self.assertRaisesRegex(exc_type, msg) as caught: yield caught - actual_msg = str(caught.exception) - self.assertNotIn(operation, actual_msg) - self.assertNotIn(self.codec_name, actual_msg) + self.assertEqual(str(caught.exception), msg) - def check_not_wrapped(self, obj_to_raise, msg): + def check_not_wrapped(self, obj_to_raise, msg_re, msg=None): self.set_codec(obj_to_raise) - with self.assertNotWrapped("encoding", RuntimeError, msg): + with self.assertNotWrapped("encoding", RuntimeError, msg_re, msg): "str input".encode(self.codec_name) - with self.assertNotWrapped("encoding", RuntimeError, msg): + with self.assertNotWrapped("encoding", RuntimeError, msg_re, msg): codecs.encode("str input", self.codec_name) - with self.assertNotWrapped("decoding", RuntimeError, msg): + with self.assertNotWrapped("decoding", RuntimeError, msg_re, msg): b"bytes input".decode(self.codec_name) - with self.assertNotWrapped("decoding", RuntimeError, msg): + with self.assertNotWrapped("decoding", RuntimeError, msg_re, msg): codecs.decode(b"bytes input", self.codec_name) def test_init_override_is_not_wrapped(self): @@ -2475,8 +2475,23 @@ class ExceptionChainingTest(unittest.TestCase): self.check_not_wrapped(RuntimeError(1), "1") def test_multiple_args_is_not_wrapped(self): - msg = "\('a', 'b', 'c'\)" - self.check_not_wrapped(RuntimeError('a', 'b', 'c'), msg) + msg_re = "\('a', 'b', 'c'\)" + msg = "('a', 'b', 'c')" + self.check_not_wrapped(RuntimeError('a', 'b', 'c'), msg_re, msg) + + # http://bugs.python.org/issue19609 + def test_codec_lookup_failure_not_wrapped(self): + msg = "unknown encoding: %s" % self.codec_name + # The initial codec lookup should not be wrapped + with self.assertNotWrapped("encoding", LookupError, msg): + "str input".encode(self.codec_name) + with self.assertNotWrapped("encoding", LookupError, msg): + codecs.encode("str input", self.codec_name) + with self.assertNotWrapped("decoding", LookupError, msg): + b"bytes input".decode(self.codec_name) + with self.assertNotWrapped("decoding", LookupError, msg): + codecs.decode(b"bytes input", self.codec_name) + @unittest.skipUnless(sys.platform == 'win32', diff --git a/Python/codecs.c b/Python/codecs.c index e2edc26..fe0cab4 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -370,8 +370,10 @@ PyObject *PyCodec_Encode(PyObject *object, goto onError; result = PyEval_CallObject(encoder, args); - if (result == NULL) + if (result == NULL) { + wrap_codec_error("encoding", encoding); goto onError; + } if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 2) { @@ -392,7 +394,6 @@ PyObject *PyCodec_Encode(PyObject *object, Py_XDECREF(result); Py_XDECREF(args); Py_XDECREF(encoder); - wrap_codec_error("encoding", encoding); return NULL; } @@ -418,8 +419,10 @@ PyObject *PyCodec_Decode(PyObject *object, goto onError; result = PyEval_CallObject(decoder,args); - if (result == NULL) + if (result == NULL) { + wrap_codec_error("decoding", encoding); goto onError; + } if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 2) { PyErr_SetString(PyExc_TypeError, @@ -439,7 +442,6 @@ PyObject *PyCodec_Decode(PyObject *object, Py_XDECREF(args); Py_XDECREF(decoder); Py_XDECREF(result); - wrap_codec_error("decoding", encoding); return NULL; } |