[Python-checkins] cpython: Close #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls

victor.stinner python-checkins at python.org
Mon May 30 22:57:32 CEST 2011


http://hg.python.org/cpython/rev/61aaec67b521
changeset: 70528:61aaec67b521
user: Victor Stinner <victor.stinner at haypocalc.com>
date: Mon May 30 22:56:00 2011 +0200
summary:
 Close #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls
encreset() instead of decreset().
files:
 Doc/library/codecs.rst | 3 ++-
 Lib/test/test_multibytecodec.py | 9 +++++++--
 Misc/NEWS | 5 ++++-
 Modules/cjkcodecs/multibytecodec.c | 14 ++++++++++----
 4 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst
--- a/Doc/library/codecs.rst
+++ b/Doc/library/codecs.rst
@@ -458,7 +458,8 @@
 
 .. 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()
diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py
--- a/Lib/test/test_multibytecodec.py
+++ b/Lib/test/test_multibytecodec.py
@@ -260,7 +260,8 @@
 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 @@
 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 @@
 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__)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -177,9 +177,12 @@
 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.
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -901,11 +901,17 @@
 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;
 }
 
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /