[pypy-commit] pypy ffi-backend: (arigo, fijal) change raw_load and raw_store to deal with byte offsets

fijal noreply at buildbot.pypy.org
Sun Jun 24 14:04:17 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: ffi-backend
Changeset: r55794:1240147fdc50
Date: 2012-06-24 14:03 +0200
http://bitbucket.org/pypy/pypy/changeset/1240147fdc50/

Log:	(arigo, fijal) change raw_load and raw_store to deal with byte
	offsets instead of the size of item

diff --git a/pypy/rpython/llinterp.py b/pypy/rpython/llinterp.py
--- a/pypy/rpython/llinterp.py
+++ b/pypy/rpython/llinterp.py
@@ -1003,14 +1003,16 @@
 
     def op_raw_load(self, addr, typ, offset):
         checkadr(addr)
-        value = getattr(addr, str(typ).lower())[offset]
+        assert offset.TYPE == typ
+        value = getattr(addr, str(typ).lower())[offset.repeat]
         assert lltype.typeOf(value) == typ
         return value
 
     def op_raw_store(self, addr, typ, offset, value):
         checkadr(addr)
         assert lltype.typeOf(value) == typ
-        getattr(addr, str(typ).lower())[offset] = value
+        assert offset.TYPE == typ
+        getattr(addr, str(typ).lower())[offset.repeat] = value
 
     def op_stack_malloc(self, size): # mmh
         raise NotImplementedError("backend only")
diff --git a/pypy/rpython/memory/gctransform/framework.py b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -1226,7 +1226,7 @@
                               resulttype=llmemory.Address)
         c_type = rmodel.inputconst(lltype.Void, llmemory.Address)
         for k,var in enumerate(livevars):
-            c_k = rmodel.inputconst(lltype.Signed, k)
+            c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr)
             v_adr = gen_cast(hop.llops, llmemory.Address, var)
             hop.genop("raw_store", [base_addr, c_type, c_k, v_adr])
         return livevars
@@ -1243,7 +1243,7 @@
             # for moving collectors, reload the roots into the local variables
             c_type = rmodel.inputconst(lltype.Void, llmemory.Address)
             for k,var in enumerate(livevars):
-                c_k = rmodel.inputconst(lltype.Signed, k)
+                c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr)
                 v_newaddr = hop.genop("raw_load", [base_addr, c_type, c_k],
                                       resulttype=llmemory.Address)
                 hop.genop("gc_reload_possibly_moved", [v_newaddr, var])
diff --git a/pypy/rpython/raddress.py b/pypy/rpython/raddress.py
--- a/pypy/rpython/raddress.py
+++ b/pypy/rpython/raddress.py
@@ -2,7 +2,7 @@
 from pypy.tool.pairtype import pairtype
 from pypy.annotation import model as annmodel
 from pypy.rpython.lltypesystem.llmemory import NULL, Address, \
-     cast_adr_to_int, fakeaddress
+     cast_adr_to_int, fakeaddress, sizeof
 from pypy.rpython.rmodel import Repr, IntegerRepr
 from pypy.rpython.rptr import PtrRepr
 from pypy.rpython.lltypesystem import lltype
@@ -73,13 +73,19 @@
     def rtype_getitem((r_acc, r_int), hop):
         c_type = hop.inputconst(lltype.Void, r_acc.type)
         v_addr, v_offs = hop.inputargs(hop.args_r[0], lltype.Signed)
-        return hop.genop('raw_load', [v_addr, c_type, v_offs],
+        c_size = hop.inputconst(lltype.Signed, sizeof(r_acc.type))
+        v_offs_mult = hop.genop('int_mul', [v_offs, c_size],
+                                resulttype=lltype.Signed)
+        return hop.genop('raw_load', [v_addr, c_type, v_offs_mult],
                          resulttype = r_acc.type)
 
     def rtype_setitem((r_acc, r_int), hop):
         c_type = hop.inputconst(lltype.Void, r_acc.type)
         v_addr, v_offs, v_value = hop.inputargs(hop.args_r[0], lltype.Signed, r_acc.type)
-        return hop.genop('raw_store', [v_addr, c_type, v_offs, v_value])
+        c_size = hop.inputconst(lltype.Signed, sizeof(r_acc.type))
+        v_offs_mult = hop.genop('int_mul', [v_offs, c_size],
+                                resulttype=lltype.Signed)
+        return hop.genop('raw_store', [v_addr, c_type, v_offs_mult, v_value])
 
 
 class __extend__(pairtype(AddressRepr, IntegerRepr)):
diff --git a/pypy/translator/c/funcgen.py b/pypy/translator/c/funcgen.py
--- a/pypy/translator/c/funcgen.py
+++ b/pypy/translator/c/funcgen.py
@@ -703,7 +703,8 @@
         offset = self.expr(op.args[2])
         value = self.expr(op.args[3])
         typename = cdecl(self.db.gettype(TYPE).replace('@', '*@'), '')
-        return "((%(typename)s) %(addr)s)[%(offset)s] = %(value)s;" % locals()
+        return ('((%(typename)s) (%(addr)s + %(offset)s))[0] = %(value)s;' %
+                locals())
 
     def OP_RAW_LOAD(self, op):
         addr = self.expr(op.args[0])
@@ -711,7 +712,8 @@
         offset = self.expr(op.args[2])
         result = self.expr(op.result)
         typename = cdecl(self.db.gettype(TYPE).replace('@', '*@'), '')
-        return "%(result)s = ((%(typename)s) %(addr)s)[%(offset)s];" % locals()
+        return ("%(result)s = ((%(typename)s) (%(addr)s + %(offset)s))[0];" %
+                locals())
 
     def OP_CAST_PRIMITIVE(self, op):
         TYPE = self.lltypemap(op.result)


More information about the pypy-commit mailing list