Commit c4c2580d authored by Nick Coghlan's avatar Nick Coghlan

Close 19609: narrow scope of codec exc chaining

parent 91d2c567
...@@ -2435,22 +2435,22 @@ class ExceptionChainingTest(unittest.TestCase): ...@@ -2435,22 +2435,22 @@ class ExceptionChainingTest(unittest.TestCase):
self.check_wrapped(RuntimeError(msg), msg) self.check_wrapped(RuntimeError(msg), msg)
@contextlib.contextmanager @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: with self.assertRaisesRegex(exc_type, msg) as caught:
yield caught yield caught
actual_msg = str(caught.exception) self.assertEqual(str(caught.exception), msg)
self.assertNotIn(operation, actual_msg)
self.assertNotIn(self.codec_name, actual_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) 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) "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) 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) 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) codecs.decode(b"bytes input", self.codec_name)
def test_init_override_is_not_wrapped(self): def test_init_override_is_not_wrapped(self):
...@@ -2475,8 +2475,23 @@ class ExceptionChainingTest(unittest.TestCase): ...@@ -2475,8 +2475,23 @@ class ExceptionChainingTest(unittest.TestCase):
self.check_not_wrapped(RuntimeError(1), "1") self.check_not_wrapped(RuntimeError(1), "1")
def test_multiple_args_is_not_wrapped(self): def test_multiple_args_is_not_wrapped(self):
msg = "\('a', 'b', 'c'\)" msg_re = "\('a', 'b', 'c'\)"
self.check_not_wrapped(RuntimeError('a', 'b', 'c'), msg) 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', @unittest.skipUnless(sys.platform == 'win32',
......
...@@ -370,8 +370,10 @@ PyObject *PyCodec_Encode(PyObject *object, ...@@ -370,8 +370,10 @@ PyObject *PyCodec_Encode(PyObject *object,
goto onError; goto onError;
result = PyEval_CallObject(encoder, args); result = PyEval_CallObject(encoder, args);
if (result == NULL) if (result == NULL) {
wrap_codec_error("encoding", encoding);
goto onError; goto onError;
}
if (!PyTuple_Check(result) || if (!PyTuple_Check(result) ||
PyTuple_GET_SIZE(result) != 2) { PyTuple_GET_SIZE(result) != 2) {
...@@ -392,7 +394,6 @@ PyObject *PyCodec_Encode(PyObject *object, ...@@ -392,7 +394,6 @@ PyObject *PyCodec_Encode(PyObject *object,
Py_XDECREF(result); Py_XDECREF(result);
Py_XDECREF(args); Py_XDECREF(args);
Py_XDECREF(encoder); Py_XDECREF(encoder);
wrap_codec_error("encoding", encoding);
return NULL; return NULL;
} }
...@@ -418,8 +419,10 @@ PyObject *PyCodec_Decode(PyObject *object, ...@@ -418,8 +419,10 @@ PyObject *PyCodec_Decode(PyObject *object,
goto onError; goto onError;
result = PyEval_CallObject(decoder,args); result = PyEval_CallObject(decoder,args);
if (result == NULL) if (result == NULL) {
wrap_codec_error("decoding", encoding);
goto onError; goto onError;
}
if (!PyTuple_Check(result) || if (!PyTuple_Check(result) ||
PyTuple_GET_SIZE(result) != 2) { PyTuple_GET_SIZE(result) != 2) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
...@@ -439,7 +442,6 @@ PyObject *PyCodec_Decode(PyObject *object, ...@@ -439,7 +442,6 @@ PyObject *PyCodec_Decode(PyObject *object,
Py_XDECREF(args); Py_XDECREF(args);
Py_XDECREF(decoder); Py_XDECREF(decoder);
Py_XDECREF(result); Py_XDECREF(result);
wrap_codec_error("decoding", encoding);
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment