diff options
author | Armin Rigo <arigo@tunes.org> | 2016-01-04 16:40:34 +0100 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2016-01-04 16:40:34 +0100 |
commit | 5026423437a26b7170f5c89059dcb8c749f221a8 (patch) | |
tree | 50191dfdaf40e85cd06d40e295deff1a80f8d050 | |
parent | Issue #2222: test and fix (diff) | |
download | pypy-5026423437a26b7170f5c89059dcb8c749f221a8.tar.gz pypy-5026423437a26b7170f5c89059dcb8c749f221a8.tar.bz2 pypy-5026423437a26b7170f5c89059dcb8c749f221a8.zip |
Test and fix
-rw-r--r-- | rpython/rlib/buffer.py | 7 | ||||
-rw-r--r-- | rpython/rlib/test/test_buffer.py | 13 |
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) |