Author: Ronan Lamy <ronan.l...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit