[pypy-commit] pypy faster-rstruct-2: implement MutableStringBuffer.typed_write

antocuni pypy.commits at gmail.com
Fri May 12 12:22:07 EDT 2017


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: faster-rstruct-2
Changeset: r91268:77c4134d96d9
Date: 2017-05-12 17:36 +0200
http://bitbucket.org/pypy/pypy/changeset/77c4134d96d9/

Log:	implement MutableStringBuffer.typed_write

diff --git a/rpython/rlib/mutbuffer.py b/rpython/rlib/mutbuffer.py
--- a/rpython/rlib/mutbuffer.py
+++ b/rpython/rlib/mutbuffer.py
@@ -1,7 +1,8 @@
-from rpython.rtyper.lltypesystem import lltype
+from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.rtyper.lltypesystem.lloperation import llop
 from rpython.rtyper.lltypesystem.rstr import STR, mallocstr
 from rpython.rtyper.annlowlevel import llstr, hlstr
+from rpython.rlib.objectmodel import specialize
 from rpython.rlib.buffer import Buffer
 
 class MutableStringBuffer(Buffer):
@@ -48,3 +49,12 @@
     def setzeros(self, index, count):
         for i in range(index, index+count):
             self.setitem(i, '\x00')
+
+    @specialize.ll_and_arg(1)
+    def typed_write(self, TP, byte_offset, value):
+        base_ofs = (llmemory.offsetof(STR, 'chars') +
+                    llmemory.itemoffsetof(STR.chars, 0))
+        scale_factor = llmemory.sizeof(lltype.Char)
+        value = lltype.cast_primitive(TP, value)
+        llop.gc_store_indexed(lltype.Void, self.ll_val, byte_offset, value,
+                              scale_factor, base_ofs)
diff --git a/rpython/rlib/test/test_mutbuffer.py b/rpython/rlib/test/test_mutbuffer.py
--- a/rpython/rlib/test/test_mutbuffer.py
+++ b/rpython/rlib/test/test_mutbuffer.py
@@ -1,4 +1,6 @@
 import pytest
+import struct
+from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rlib.mutbuffer import MutableStringBuffer
 
 class TestMutableStringBuffer(object):
@@ -28,3 +30,13 @@
         buf.setslice(0, 'ABCDEFGH')
         buf.setzeros(2, 3)
         assert buf.finish() == 'AB\x00\x00\x00FGH'
+
+    def test_typed_write(self):
+        expected = struct.pack('ifqd', 0x1234, 123.456, 0x12345678, 789.123)
+        buf = MutableStringBuffer(24)
+        buf.typed_write(rffi.INT, 0, 0x1234)
+        buf.typed_write(rffi.FLOAT, 4, 123.456)
+        buf.typed_write(rffi.LONGLONG, 8, 0x12345678)
+        buf.typed_write(rffi.DOUBLE, 16, 789.123)
+        s = buf.finish()
+        assert s == expected


More information about the pypy-commit mailing list