aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2016-01-04 16:40:34 +0100
committerArmin Rigo <arigo@tunes.org>2016-01-04 16:40:34 +0100
commit5026423437a26b7170f5c89059dcb8c749f221a8 (patch)
tree50191dfdaf40e85cd06d40e295deff1a80f8d050
parentIssue #2222: test and fix (diff)
downloadpypy-5026423437a26b7170f5c89059dcb8c749f221a8.tar.gz
pypy-5026423437a26b7170f5c89059dcb8c749f221a8.tar.bz2
pypy-5026423437a26b7170f5c89059dcb8c749f221a8.zip
Test and fix
-rw-r--r--rpython/rlib/buffer.py7
-rw-r--r--rpython/rlib/test/test_buffer.py13
2 files changed, 17 insertions, 3 deletions
diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
index de7de001bd..43ff368219 100644
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -99,9 +99,10 @@ class SubBuffer(Buffer):
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:
+ # (buffer.offset, buffer.size) over buffer.buffer.
+ # Note that either '.size' can be -1 to mean 'up to the end'.
+ at_most = buffer.getlength() - offset
+ if size > at_most or size < 0:
if at_most < 0:
at_most = 0
size = at_most
diff --git a/rpython/rlib/test/test_buffer.py b/rpython/rlib/test/test_buffer.py
index 0cc66aaabe..1361cbc9d6 100644
--- a/rpython/rlib/test/test_buffer.py
+++ b/rpython/rlib/test/test_buffer.py
@@ -45,6 +45,19 @@ def test_as_str_and_offset_maybe():
ssbuf = SubBuffer(sbuf, 3, 2)
assert ssbuf.getslice(0, 2, 1, 2) == 'ld'
assert ssbuf.as_str_and_offset_maybe() == ('hello world', 9)
+ #
+ ss2buf = SubBuffer(sbuf, 1, -1)
+ assert ss2buf.as_str() == 'orld'
+ assert ss2buf.getlength() == 4
+ ss3buf = SubBuffer(ss2buf, 1, -1)
+ assert ss3buf.as_str() == 'rld'
+ assert ss3buf.getlength() == 3
+ #
+ ss4buf = SubBuffer(buf, 3, 4)
+ assert ss4buf.as_str() == 'lo w'
+ ss5buf = SubBuffer(ss4buf, 1, -1)
+ assert ss5buf.as_str() == 'o w'
+ assert ss5buf.getlength() == 3
def test_repeated_subbuffer():
buf = StringBuffer('x' * 10000)