]> granicus.if.org Git - python/commitdiff
Close #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls
authorVictor Stinner <victor.stinner@haypocalc.com>
Mon, 30 May 2011 20:56:00 +0000 (22:56 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Mon, 30 May 2011 20:56:00 +0000 (22:56 +0200)
encreset() instead of decreset().

Doc/library/codecs.rst
Lib/test/test_multibytecodec.py
Misc/NEWS
Modules/cjkcodecs/multibytecodec.c

index 4d5058ea383f6325a46ef3d21f9197fefcafa393..90bd0dd0f8feef46fa964ed3aec6ce1124518b4a 100644 (file)
@@ -458,7 +458,8 @@ define in order to be compatible with the Python codec registry.
 
    .. 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()
index 86c68dcd9a6f2856ce7c5f75001d16a608cd12b9..44480723baf1fa149f45ed108959edd11b64938a 100644 (file)
@@ -260,7 +260,8 @@ class TestStateful(unittest.TestCase):
     text = '\u4E16\u4E16'
     encoding = 'iso-2022-jp'
     expected = b'\x1b$B@$@$'
-    expected_reset = b'\x1b$B@$@$\x1b(B'
+    reset = b'\x1b(B'
+    expected_reset = expected + reset
 
     def test_encode(self):
         self.assertEqual(self.text.encode(self.encoding), self.expected_reset)
@@ -271,6 +272,8 @@ class TestStateful(unittest.TestCase):
             encoder.encode(char)
             for char in self.text)
         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):
         encoder = codecs.getincrementalencoder(self.encoding)()
@@ -279,12 +282,14 @@ class TestStateful(unittest.TestCase):
             encoder.encode(char, index == last_index)
             for index, char in enumerate(self.text))
         self.assertEqual(output, self.expected_reset)
+        self.assertEqual(encoder.encode('', final=True), b'')
 
 class TestHZStateful(TestStateful):
     text = '\u804a\u804a'
     encoding = 'hz'
     expected = b'~{ADAD'
-    expected_reset = b'~{ADAD~}'
+    reset = b'~}'
+    expected_reset = expected + reset
 
 def test_main():
     support.run_unittest(__name__)
index 785761cc1703255b4e3204cce7fee0ec3f97e5c0..e5e5aa9e50ce78f5338ee3bde0c21e247cd6d318 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -177,9 +177,12 @@ Core and Builtins
 Library
 -------
 
+- Issue #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls
+  encreset() instead of decreset().
+
 - Issue #12218: Removed wsgiref.egg-info.
 
-- Issue #12196: Add pipe2() to the os module. 
+- Issue #12196: Add pipe2() to the os module.
 
 - Issue #985064: Make plistlib more resilient to faulty input plists.
   Patch by Mher Movsisyan.
index bb8176f70267c4a7e87ee39cbb6cc23d6d20da60..1b37845285f2ce248ae8901cf0d0701cac37ff7d 100644 (file)
@@ -901,11 +901,17 @@ mbiencoder_encode(MultibyteIncrementalEncoderObject *self,
 static PyObject *
 mbiencoder_reset(MultibyteIncrementalEncoderObject *self)
 {
-    if (self->codec->decreset != NULL &&
-        self->codec->decreset(&self->state, self->codec->config) != 0)
-        return NULL;
+    /* Longest output: 4 bytes (b'\x0F\x1F(B') with ISO 2022 */
+    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;
+    }
     self->pendingsize = 0;
-
     Py_RETURN_NONE;
 }