[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