Author: Tyler Wade <way...@gmail.com>
Branch: fix-bytearray-complexity
Changeset: r71880:cfdc8b7369aa
Date: 2014-06-02 10:35 -0500
http://bitbucket.org/pypy/pypy/changeset/cfdc8b7369aa/

Log:    Buffer.__getlen__ needs an assert >= 0

diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -13,7 +13,9 @@
         raise NotImplementedError
 
     def __len__(self):
-        return self.getlength()
+        res = self.getlength()
+        assert res >= 0
+        return res
 
     def as_str(self):
         "Returns an interp-level string with the whole content of the buffer."
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
@@ -1,4 +1,6 @@
 from rpython.rlib.buffer import *
+from rpython.annotator.annrpython import RPythonAnnotator
+from rpython.annotator.model import SomeInteger
 
 
 def test_string_buffer():
@@ -11,3 +13,22 @@
     assert buf.getslice(1, 6, 1, 5) == buf[1:6]
     assert buf.getslice(1, 6, 2, 3) == 'el '
     assert buf.as_str() == 'hello world'
+
+
+
+def test_len_nonneg():
+    # This test needs a buffer subclass whose getlength() isn't guaranteed to
+    # return a non-neg integer.
+    class DummyBuffer(Buffer):
+        def __init__(self, s):
+            self.size = s
+
+        def getlength(self):
+            return self.size
+    def func(n):
+        buf = DummyBuffer(n)
+        return len(buf)
+
+    a = RPythonAnnotator()
+    s = a.build_types(func, [int])
+    assert s == SomeInteger(nonneg=True)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to