Author: Ronan Lamy <[email protected]>
Branch: unicode-utf8
Changeset: r93131:031e80f0a68e
Date: 2017-11-23 05:14 +0000
http://bitbucket.org/pypy/pypy/changeset/031e80f0a68e/
Log: Refactor interp_textio.py a little
diff --git a/pypy/module/_io/interp_stringio.py
b/pypy/module/_io/interp_stringio.py
--- a/pypy/module/_io/interp_stringio.py
+++ b/pypy/module/_io/interp_stringio.py
@@ -184,9 +184,7 @@
start,
end
)
- if endpos >= 0:
- endpos += start
- else:
+ if endpos < 0:
endpos = end
assert endpos >= 0
self.pos = endpos
diff --git a/pypy/module/_io/interp_textio.py b/pypy/module/_io/interp_textio.py
--- a/pypy/module/_io/interp_textio.py
+++ b/pypy/module/_io/interp_textio.py
@@ -224,30 +224,28 @@
def _find_line_ending(self, line, start, end):
size = end - start
if self.readtranslate:
-
# Newlines are already translated, only search for \n
pos = line.find('\n', start, end)
if pos >= 0:
- return pos - start + 1, 0
+ return pos + 1, 0
else:
return -1, size
elif self.readuniversal:
# Universal newline search. Find any of \r, \r\n, \n
# The decoder ensures that \r\n are not split in two pieces
- i = 0
+ i = start
while True:
- # Fast path for non-control chars. The loop always ends
- # since the Py_UNICODE storage is NUL-terminated.
- while i < size and line[start + i] > '\r':
+ # Fast path for non-control chars.
+ while i < end and line[i] > '\r':
i += 1
- if i >= size:
+ if i >= end:
return -1, size
- ch = line[start + i]
+ ch = line[i]
i += 1
if ch == '\n':
return i, 0
if ch == '\r':
- if line[start + i] == '\n':
+ if line[i] == '\n':
return i + 1, 0
else:
return i, 0
@@ -255,7 +253,7 @@
# Non-universal mode.
pos = line.find(self.readnl, start, end)
if pos >= 0:
- return pos - start + len(self.readnl), 0
+ return pos + len(self.readnl), 0
else:
pos = line.find(self.readnl[0], start, end)
if pos >= 0:
@@ -520,8 +518,13 @@
# _____________________________________________________________
# read methods
- def _set_decoded_chars(self, chars):
- self.decoded_chars = chars
+ def _unset_decoded(self):
+ self.decoded_chars = None
+ self.decoded_chars_used = 0
+
+ def _set_decoded(self, space, w_decoded):
+ check_decoded(space, w_decoded)
+ self.decoded_chars = space.utf8_w(w_decoded)
self.decoded_chars_used = 0
def _get_decoded_chars(self, size):
@@ -580,8 +583,7 @@
eof = space.len_w(w_input) == 0
w_decoded = space.call_method(self.w_decoder, "decode",
w_input, space.newbool(eof))
- check_decoded(space, w_decoded)
- self._set_decoded_chars(space.utf8_w(w_decoded))
+ self._set_decoded(space, w_decoded)
if space.len_w(w_decoded) > 0:
eof = False
@@ -671,7 +673,7 @@
raise
if not has_data:
# end of file
- self._set_decoded_chars(None)
+ self._unset_decoded()
self.snapshot = None
start = endpos = offset_to_buffer = 0
break
@@ -690,7 +692,6 @@
line_len = len(line)
endpos, consumed = self._find_line_ending(line, start, line_len)
if endpos >= 0:
- endpos += start
if limit >= 0 and endpos >= start + limit - chunked:
endpos = start + limit - chunked
assert endpos >= 0
@@ -716,7 +717,7 @@
remaining = line[endpos:]
line = None
# We have consumed the buffer
- self._set_decoded_chars(None)
+ self._unset_decoded()
if line:
# Our line ends in the current buffer
@@ -867,7 +868,7 @@
raise oefmt(space.w_IOError,
"can't do nonzero end-relative seeks")
space.call_method(self, "flush")
- self._set_decoded_chars(None)
+ self._unset_decoded()
self.snapshot = None
if self.w_decoder:
space.call_method(self.w_decoder, "reset")
@@ -892,7 +893,7 @@
# Seek back to the safe start point
space.call_method(self.w_buffer, "seek",
space.newint(cookie.start_pos))
- self._set_decoded_chars(None)
+ self._unset_decoded()
self.snapshot = None
# Restore the decoder to its state from the safe start point.
@@ -913,8 +914,7 @@
w_decoded = space.call_method(self.w_decoder, "decode",
w_chunk,
space.newbool(bool(cookie.need_eof)))
- check_decoded(space, w_decoded)
- self._set_decoded_chars(space.unicode_w(w_decoded))
+ self._set_decoded(space, w_decoded)
# Skip chars_to_skip of the decoded characters
if len(self.decoded_chars) < cookie.chars_to_skip:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit