Commit e15dce3d authored by Victor Stinner's avatar Victor Stinner

Close #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls

encreset() instead of decreset().
parent ebbb3b79
...@@ -458,7 +458,8 @@ define in order to be compatible with the Python codec registry. ...@@ -458,7 +458,8 @@ define in order to be compatible with the Python codec registry.
.. method:: reset() .. method:: reset()
Reset the encoder to the initial state. Reset the encoder to the initial state. The output is discarded: call
``.encode('', final=True)`` to reset the encoder and to get the output.
.. method:: IncrementalEncoder.getstate() .. method:: IncrementalEncoder.getstate()
......
...@@ -260,7 +260,8 @@ class TestStateful(unittest.TestCase): ...@@ -260,7 +260,8 @@ class TestStateful(unittest.TestCase):
text = '\u4E16\u4E16' text = '\u4E16\u4E16'
encoding = 'iso-2022-jp' encoding = 'iso-2022-jp'
expected = b'\x1b$B@$@$' expected = b'\x1b$B@$@$'
expected_reset = b'\x1b$B@$@$\x1b(B' reset = b'\x1b(B'
expected_reset = expected + reset
def test_encode(self): def test_encode(self):
self.assertEqual(self.text.encode(self.encoding), self.expected_reset) self.assertEqual(self.text.encode(self.encoding), self.expected_reset)
...@@ -271,6 +272,8 @@ class TestStateful(unittest.TestCase): ...@@ -271,6 +272,8 @@ class TestStateful(unittest.TestCase):
encoder.encode(char) encoder.encode(char)
for char in self.text) for char in self.text)
self.assertEqual(output, self.expected) self.assertEqual(output, self.expected)
self.assertEqual(encoder.encode('', final=True), self.reset)
self.assertEqual(encoder.encode('', final=True), b'')
def test_incrementalencoder_final(self): def test_incrementalencoder_final(self):
encoder = codecs.getincrementalencoder(self.encoding)() encoder = codecs.getincrementalencoder(self.encoding)()
...@@ -279,12 +282,14 @@ class TestStateful(unittest.TestCase): ...@@ -279,12 +282,14 @@ class TestStateful(unittest.TestCase):
encoder.encode(char, index == last_index) encoder.encode(char, index == last_index)
for index, char in enumerate(self.text)) for index, char in enumerate(self.text))
self.assertEqual(output, self.expected_reset) self.assertEqual(output, self.expected_reset)
self.assertEqual(encoder.encode('', final=True), b'')
class TestHZStateful(TestStateful): class TestHZStateful(TestStateful):
text = '\u804a\u804a' text = '\u804a\u804a'
encoding = 'hz' encoding = 'hz'
expected = b'~{ADAD' expected = b'~{ADAD'
expected_reset = b'~{ADAD~}' reset = b'~}'
expected_reset = expected + reset
def test_main(): def test_main():
support.run_unittest(__name__) support.run_unittest(__name__)
......
...@@ -177,6 +177,9 @@ Core and Builtins ...@@ -177,6 +177,9 @@ Core and Builtins
Library Library
------- -------
- Issue #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls
encreset() instead of decreset().
- Issue #12218: Removed wsgiref.egg-info. - Issue #12218: Removed wsgiref.egg-info.
- Issue #12196: Add pipe2() to the os module. - Issue #12196: Add pipe2() to the os module.
......
...@@ -901,11 +901,17 @@ mbiencoder_encode(MultibyteIncrementalEncoderObject *self, ...@@ -901,11 +901,17 @@ mbiencoder_encode(MultibyteIncrementalEncoderObject *self,
static PyObject * static PyObject *
mbiencoder_reset(MultibyteIncrementalEncoderObject *self) mbiencoder_reset(MultibyteIncrementalEncoderObject *self)
{ {
if (self->codec->decreset != NULL && /* Longest output: 4 bytes (b'\x0F\x1F(B') with ISO 2022 */
self->codec->decreset(&self->state, self->codec->config) != 0) unsigned char buffer[4], *outbuf;
Py_ssize_t r;
if (self->codec->encreset != NULL) {
outbuf = buffer;
r = self->codec->encreset(&self->state, self->codec->config,
&outbuf, sizeof(buffer));
if (r != 0)
return NULL; return NULL;
}
self->pendingsize = 0; self->pendingsize = 0;
Py_RETURN_NONE; Py_RETURN_NONE;
} }
......
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