Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3.5 Changeset: r94279:ab173e2698f9 Date: 2018-04-08 17:26 +0100 http://bitbucket.org/pypy/pypy/changeset/ab173e2698f9/
Log: Refactor W_TextIOWrapper.read_w and .readline_w to ensure that the expensive calls to ._check_closed() get jitted (issue #2790). 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 @@ -715,15 +715,20 @@ self._writeflush(space) if size < 0: - # Read everything - w_bytes = space.call_method(self.w_buffer, "read") - w_decoded = space.call_method(self.w_decoder, "decode", w_bytes, space.w_True) - check_decoded(space, w_decoded) - w_result = space.newunicode(self.decoded.get_chars(-1)) - w_final = space.add(w_result, w_decoded) - self.snapshot = None - return w_final + return self._read_all(space) + else: + return self._read(space, size) + def _read_all(self, space): + w_bytes = space.call_method(self.w_buffer, "read") + w_decoded = space.call_method(self.w_decoder, "decode", w_bytes, space.w_True) + check_decoded(space, w_decoded) + w_result = space.newunicode(self.decoded.get_chars(-1)) + w_final = space.add(w_result, w_decoded) + self.snapshot = None + return w_final + + def _read(self, space, size): remaining = size builder = UnicodeBuilder(size) @@ -737,6 +742,7 @@ return space.newunicode(builder.build()) + def _scan_line_ending(self, limit): if self.readuniversal: return self.decoded.find_newline_universal(limit) @@ -756,8 +762,11 @@ self._check_attached(space) self._check_closed(space) self._writeflush(space) + limit = convert_size(space, w_limit) + return space.newunicode(self._readline(space, limit)) - limit = convert_size(space, w_limit) + def _readline(self, space, limit): + # This is a separate function so that readline_w() can be jitted. remnant = None builder = UnicodeBuilder() while True: @@ -805,8 +814,7 @@ # We have consumed the buffer self.decoded.reset() - result = builder.build() - return space.newunicode(result) + return builder.build() # _____________________________________________________________ # write methods _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit