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

Reply via email to