Author: Ronan Lamy <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit