[pypy-commit] pypy ffi-backend: (fijal, arigo) fix

arigo noreply at buildbot.pypy.org
Sun Jun 24 19:18:49 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55808:456a41f95ce2
Date: 2012-06-24 19:02 +0200
http://bitbucket.org/pypy/pypy/changeset/456a41f95ce2/

Log:	(fijal, arigo) fix

diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -854,14 +854,20 @@
                                   op.result)
 
     def rewrite_op_raw_store(self, op):
-        assert op.args[3].concretetype == op.args[1].value
-        kind = getkind(op.args[3].concretetype)[0]
-        size = llmemory.sizeof(op.args[1].value)
-        c_size = Constant(size, lltype.Signed)
+        T = op.args[2].concretetype
+        kind = getkind(T)[0]
+        c_size = Constant(rffi.sizeof(T), lltype.Signed)
         return SpaceOperation('raw_store_%s' % kind,
-                              [op.args[0], c_size, op.args[2], op.args[3]],
+                              [op.args[0], op.args[1], c_size, op.args[2]],
                               None)
 
+    def rewrite_op_raw_load(self, op):
+        T = op.result.concretetype
+        kind = getkind(T)[0]
+        c_size = Constant(rffi.sizeof(T), lltype.Signed)
+        return SpaceOperation('raw_load_%s' % kind,
+                              [op.args[0], op.args[1], c_size], op.result)
+
     def _rewrite_equality(self, op, opname):
         arg0, arg1 = op.args
         if isinstance(arg0, Constant) and not arg0.value:
diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -860,12 +860,27 @@
 
 def test_raw_store():
     v_storage = varoftype(llmemory.Address)
-    v_typ = varoftype(lltype.Void)
     v_index = varoftype(lltype.Signed)
     v_item = varoftype(lltype.Signed) # for example
-    op = SpaceOperation('raw_store', [v_storage, v_typ, v_index, v_item])
+    op = SpaceOperation('raw_store', [v_storage, v_index, v_item], None)
     op1 = Transformer(FakeCPU()).rewrite_operation(op)
-    assert op1.opname == 'raw_store'
+    assert op1.opname == 'raw_store_i'
+    assert op1.args[0] == v_storage
+    assert op1.args[1] == v_index
+    assert op1.args[2].value == rffi.sizeof(lltype.Signed)
+    assert op1.args[3] == v_item
+
+def test_raw_load():
+    v_storage = varoftype(llmemory.Address)
+    v_index = varoftype(lltype.Signed)
+    v_res = varoftype(lltype.Signed) # for example
+    op = SpaceOperation('raw_load', [v_storage, v_index], v_res)
+    op1 = Transformer(FakeCPU()).rewrite_operation(op)
+    assert op1.opname == 'raw_load_i'
+    assert op1.args[0] == v_storage
+    assert op1.args[1] == v_index
+    assert op1.args[2].value == rffi.sizeof(lltype.Signed)
+    assert op1.result == v_res
 
 def test_promote_1():
     v1 = varoftype(lltype.Signed)
diff --git a/pypy/jit/metainterp/test/test_rawmem.py b/pypy/jit/metainterp/test/test_rawmem.py
--- a/pypy/jit/metainterp/test/test_rawmem.py
+++ b/pypy/jit/metainterp/test/test_rawmem.py
@@ -1,7 +1,7 @@
 from pypy.jit.metainterp.test.support import LLJitMixin
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rlib.rawstorage import (alloc_raw_storage, raw_storage_setitem,
-                                  free_raw_storage)
+                                  free_raw_storage, raw_storage_getitem)
 
 class TestJITRawMem(LLJitMixin):
     def test_cast_void_ptr(self):
@@ -36,9 +36,10 @@
         def f():
             p = alloc_raw_storage(15)
             raw_storage_setitem(p, 3, 24)
+            res = raw_storage_getitem(lltype.Signed, p, 3)
             free_raw_storage(p)
-            return 42
+            return res
         res = self.interp_operations(f, [])
-        assert res == 42
+        assert res == 24
         self.check_operations_history({'call': 2, 'guard_no_exception': 1,
                                        'finish': 1})


More information about the pypy-commit mailing list