Author: Antonio Cuni <anto.c...@gmail.com>
Branch: faster-rstruct-2
Changeset: r91258:4be2157b169f
Date: 2017-05-11 18:30 +0200
http://bitbucket.org/pypy/pypy/changeset/4be2157b169f/

Log:    WIP: start to implement llop.gc_store_indexed; still missing
        implementation in the C backend and the JIT

diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -397,6 +397,7 @@
     'raw_store':            LLOp(canrun=True),
     'bare_raw_store':       LLOp(),
     'gc_load_indexed':      LLOp(sideeffects=False, canrun=True),
+    'gc_store_indexed':     LLOp(canrun=True),
     'track_alloc_start':    LLOp(),
     'track_alloc_stop':     LLOp(),
     'adr_add':              LLOp(canfold=True),
diff --git a/rpython/rtyper/lltypesystem/opimpl.py 
b/rpython/rtyper/lltypesystem/opimpl.py
--- a/rpython/rtyper/lltypesystem/opimpl.py
+++ b/rpython/rtyper/lltypesystem/opimpl.py
@@ -728,6 +728,17 @@
     return p[0]
 op_gc_load_indexed.need_result_type = True
 
+def op_gc_store_indexed(p, index, scale, base_ofs, newvalue):
+    # 'base_ofs' should be a CompositeOffset(..., ArrayItemsOffset).
+    # 'scale' should be a llmemory.sizeof().
+    from rpython.rtyper.lltypesystem import rffi
+    TVAL = lltype.typeOf(newvalue)
+    ofs = base_ofs + scale * index
+    if isinstance(ofs, int):
+        return op_raw_store(p, ofs, newvalue)
+    p = rffi.cast(rffi.CArrayPtr(TVAL), llmemory.cast_ptr_to_adr(p) + ofs)
+    p[0] = newvalue
+
 def op_likely(x):
     assert isinstance(x, bool)
     return x
diff --git a/rpython/rtyper/test/test_llop.py b/rpython/rtyper/test/test_llop.py
--- a/rpython/rtyper/test/test_llop.py
+++ b/rpython/rtyper/test/test_llop.py
@@ -5,6 +5,9 @@
 from rpython.rtyper.lltypesystem.rstr import STR
 from rpython.rtyper.annlowlevel import llstr
 from rpython.rlib.rarithmetic import r_singlefloat
+from rpython.rlib.rgc import (resizable_list_supporting_raw_ptr,
+                              ll_for_resizable_list)
+
 
 def str_gc_load(TYPE, buf, offset):
     base_ofs = (llmemory.offsetof(STR, 'chars') +
@@ -14,6 +17,19 @@
     return llop.gc_load_indexed(TYPE, lls, offset,
                                 scale_factor, base_ofs)
 
+
+def list_gc_store(TYPE, lst, offset, value):
+    value = lltype.cast_primitive(TYPE, value)
+    ll_data = ll_for_resizable_list(lst)
+    ll_items = ll_data.items
+    LIST = lltype.typeOf(ll_data).TO # rlist.LIST_OF(lltype.Char)
+    base_ofs = llmemory.itemoffsetof(LIST.items.TO, 0)
+    scale_factor = llmemory.sizeof(lltype.Char)
+    return llop.gc_store_indexed(lltype.Void, ll_items, offset,
+                                 scale_factor, base_ofs, value)
+
+
+
 class BaseLLOpTest(object):
     
     def test_gc_load_indexed(self):
@@ -27,6 +43,14 @@
         val = self.gc_load_from_string(rffi.INT, buf, 12)
         assert val == 0x12345678
 
+    def test_gc_store_indexed(self):
+        expected = struct.pack('i', 0x12345678)
+        n = len(expected)
+        lst = resizable_list_supporting_raw_ptr(['\x00']*n)
+        list_gc_store(rffi.INT, lst, 0, 0x12345678)
+        buf = ''.join(lst)
+        assert buf == expected
+
 
 class TestDirect(BaseLLOpTest):
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to