[pypy-commit] pypy default: Issue #2222: test and fix

arigo pypy.commits at gmail.com
Sun Jan 3 12:32:13 EST 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r81533:a7b303390e51
Date: 2016-01-03 18:31 +0100
http://bitbucket.org/pypy/pypy/changeset/a7b303390e51/

Log:	Issue #2222: test and fix

diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -97,6 +97,17 @@
 
     def __init__(self, buffer, offset, size):
         self.readonly = buffer.readonly
+        if isinstance(buffer, SubBuffer):     # don't nest them
+            # we want a view (offset, size) over a view
+            # (buffer.offset, buffer.size) over buffer.buffer
+            at_most = buffer.size - offset
+            if size > at_most:
+                if at_most < 0:
+                    at_most = 0
+                size = at_most
+            offset += buffer.offset
+            buffer = buffer.buffer
+        #
         self.buffer = buffer
         self.offset = offset
         self.size = size
diff --git a/rpython/rlib/test/test_buffer.py b/rpython/rlib/test/test_buffer.py
--- a/rpython/rlib/test/test_buffer.py
+++ b/rpython/rlib/test/test_buffer.py
@@ -45,3 +45,9 @@
     ssbuf = SubBuffer(sbuf, 3, 2)
     assert ssbuf.getslice(0, 2, 1, 2) == 'ld'
     assert ssbuf.as_str_and_offset_maybe() == ('hello world', 9)
+
+def test_repeated_subbuffer():
+    buf = StringBuffer('x' * 10000)
+    for i in range(9999, 9, -1):
+        buf = SubBuffer(buf, 1, i)
+    assert buf.getlength() == 10


More information about the pypy-commit mailing list