[Python-checkins] r68077 - sandbox/trunk/io-c/_textio.c

antoine.pitrou python-checkins at python.org
Tue Dec 30 19:47:22 CET 2008


Author: antoine.pitrou
Date: Tue Dec 30 19:47:20 2008
New Revision: 68077
Log:
Another patch by Amaury.
Modified:
 sandbox/trunk/io-c/_textio.c
Modified: sandbox/trunk/io-c/_textio.c
==============================================================================
--- sandbox/trunk/io-c/_textio.c	(original)
+++ sandbox/trunk/io-c/_textio.c	Tue Dec 30 19:47:20 2008
@@ -258,7 +258,7 @@
 if (!PyArg_Parse(state, "(OK)", &buffer, &flag))
 return NULL;
 
- self->pendingcr = flag & 1;
+ self->pendingcr = (int) flag & 1;
 flag >>= 1;
 
 return PyObject_CallMethod(self->decoder, "setstate", "((OK))", buffer, flag);
@@ -652,6 +652,8 @@
 avail = (PyUnicode_GET_SIZE(self->decoded_chars)
 - self->decoded_chars_used);
 
+ assert(avail >= 0);
+
 if (n < 0 || n > avail)
 n = avail;
 
@@ -1011,7 +1013,7 @@
 TextIOWrapper_parseCookie(CookieStruct *cookie, PyObject *cookieObj)
 {
 char buffer[sizeof(CookieStruct)];
- static int one = 1;
+ int one = 1;
 PyLongObject *cookieLong = (PyLongObject *)PyNumber_Long(cookieObj);
 if (cookieLong == NULL)
 return -1;
@@ -1055,7 +1057,7 @@
 TextIOWrapper_buildCookie(CookieStruct *cookie)
 {
 char buffer[sizeof(CookieStruct)];
- static int one = 1;
+ int one = 1;
 
 if (!IS_LITTLE_ENDIAN) {
 *(Py_off_t*)(buffer +
@@ -1323,6 +1325,7 @@
 "((yi))", "", cookie.dec_flags);
 if (res == NULL)
 goto fail;
+ Py_DECREF(res);
 
 /* Feed the decoder one byte at a time. As we go, note the
 * nearest "safe start point" before the current location
@@ -1339,7 +1342,7 @@
 int dec_flags;
 
 PyObject *decoded = PyObject_CallMethod(
- self->decoder, "decode", "y#", &input, 1);
+ self->decoder, "decode", "y#", input, 1);
 if (decoded == NULL)
 goto fail;
 assert (PyUnicode_Check(decoded));
@@ -1348,7 +1351,7 @@
 
 cookie.bytes_to_feed += 1;
 
- state = PyObject_CallMethod(self->decoder, "getstate", "NULL");
+ state = PyObject_CallMethod(self->decoder, "getstate", NULL);
 if (state == NULL)
 goto fail;
 if (!PyArg_Parse(state, "(y#i)", &dec_buffer, &dec_buffer_len, &dec_flags)) {
@@ -1357,7 +1360,7 @@
 }
 Py_DECREF(state);
 
- if (dec_buffer_len == 0) {
+ if (dec_buffer_len == 0 && chars_decoded <= chars_to_skip) {
 /* Decoder buffer is empty, so this is a safe start point. */
 cookie.start_pos += cookie.bytes_to_feed;
 chars_to_skip -= chars_decoded;
@@ -1367,8 +1370,9 @@
 }
 if (chars_decoded >= chars_to_skip)
 break;
+ input++;
 }
- if (chars_decoded < chars_to_skip) {
+ if (input == input_end) {
 /* We didn't get enough decoded data; signal EOF to get more. */
 PyObject *decoded = PyObject_CallMethod(
 self->decoder, "decode", "yi", "", /* final = */ 1);


More information about the Python-checkins mailing list

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