From d1f9942ae399c765c1bee392658fc0f56f963ec5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 16 Jul 2013 21:41:43 +0200 Subject: Issue #18408: Fix cjkcodecs decoders, add a new MBERR_EXCEPTION constant to notify exceptions raised by the _PyUnicodeWriter API --- Modules/cjkcodecs/cjkcodecs.h | 4 ++-- Modules/cjkcodecs/multibytecodec.c | 2 ++ Modules/cjkcodecs/multibytecodec.h | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index 18cc02f..9e92db2 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -130,7 +130,7 @@ static const struct dbcs_map *mapping_list; #define OUTCHAR(c) \ do { \ if (_PyUnicodeWriter_WriteChar(writer, (c)) < 0) \ - return MBERR_TOOSMALL; \ + return MBERR_EXCEPTION; \ } while (0) #define OUTCHAR2(c1, c2) \ @@ -138,7 +138,7 @@ static const struct dbcs_map *mapping_list; Py_UCS4 _c1 = (c1); \ Py_UCS4 _c2 = (c2); \ if (_PyUnicodeWriter_Prepare(writer, 2, Py_MAX(_c1, c2)) < 0) \ - return MBERR_TOOSMALL; \ + return MBERR_EXCEPTION; \ PyUnicode_WRITE(writer->kind, writer->data, writer->pos, _c1); \ PyUnicode_WRITE(writer->kind, writer->data, writer->pos + 1, _c2); \ writer->pos += 2; \ diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 2a29b7d..3c5173f 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -384,6 +384,8 @@ multibytecodec_decerror(MultibyteCodec *codec, PyErr_SetString(PyExc_RuntimeError, "internal codec error"); return -1; + case MBERR_EXCEPTION: + return -1; default: PyErr_SetString(PyExc_RuntimeError, "unknown runtime error"); diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index 3050aeb..7cde8e3 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -112,6 +112,7 @@ typedef struct { #define MBERR_TOOSMALL (-1) /* insufficient output buffer space */ #define MBERR_TOOFEW (-2) /* incomplete input buffer */ #define MBERR_INTERNAL (-3) /* internal runtime error */ +#define MBERR_EXCEPTION (-4) /* an exception has been raised */ #define ERROR_STRICT (PyObject *)(1) #define ERROR_IGNORE (PyObject *)(2) -- cgit v0.12