[pypy-commit] pypy faster-rstruct-2: move setzeros into the base class rlib.buffer.Buffer, because it is used by rstruct to pack and needs to be available on all buffers

antocuni pypy.commits at gmail.com
Wed May 17 11:47:54 EDT 2017


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: faster-rstruct-2
Changeset: r91320:cce350f856ce
Date: 2017-05-17 11:48 +0200
http://bitbucket.org/pypy/pypy/changeset/cce350f856ce/

Log:	move setzeros into the base class rlib.buffer.Buffer, because it is
	used by rstruct to pack and needs to be available on all buffers

diff --git a/pypy/module/struct/test/test_struct.py b/pypy/module/struct/test/test_struct.py
--- a/pypy/module/struct/test/test_struct.py
+++ b/pypy/module/struct/test/test_struct.py
@@ -535,4 +535,9 @@
         buf = bytearray(len(expected))
         self.struct.pack_into("ii", buf, 0, 42, 43)
         assert buf == expected
-        
+
+    def test_pack_into_bytearray_padding(self):
+        expected = self.struct.pack("xxi", 42)
+        buf = bytearray(len(expected))
+        self.struct.pack_into("xxi", buf, 0, 42)
+        assert buf == expected
diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -80,6 +80,12 @@
         for i in range(len(string)):
             self.setitem(start + i, string[i])
 
+    @jit.look_inside_iff(lambda self, index, count:
+                         jit.isconstant(count) and count <= 8)
+    def setzeros(self, index, count):
+        for i in range(index, index+count):
+            self.setitem(i, '\x00')
+
     @specialize.ll_and_arg(1)
     def typed_read(self, TP, byte_offset):
         """
diff --git a/rpython/rlib/mutbuffer.py b/rpython/rlib/mutbuffer.py
--- a/rpython/rlib/mutbuffer.py
+++ b/rpython/rlib/mutbuffer.py
@@ -48,12 +48,6 @@
     def setitem(self, index, char):
         self.ll_val.chars[index] = char
 
-    @jit.look_inside_iff(lambda self, index, count:
-                         jit.isconstant(count) and count <= 8)
-    def setzeros(self, index, count):
-        for i in range(index, index+count):
-            self.setitem(i, '\x00')
-
     @staticmethod
     def _get_gc_data_offset():
         return (llmemory.offsetof(STR, 'chars') +
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
@@ -24,6 +24,10 @@
     def as_str(self):
         return rffi.charpsize2str(self._buf, self._n)
 
+    def setitem(self, i, char):
+        assert not self.readonly
+        self._buf[i] = char
+
     def __del__(self):
         lltype.free(self._buf, flavor='raw')
         self._buf = None
@@ -73,6 +77,13 @@
     assert addr[4] == b'o'
     assert addr[6] == b'w'
 
+def test_setzeros():
+    buf = MyRawBuffer('ABCDEFGH', readonly=False)
+    buf.setzeros(2, 3)
+    assert buf.as_str() == 'AB\x00\x00\x00FGH'
+
+    
+
 
 class BaseTypedReadTest:
 


More information about the pypy-commit mailing list