Author: Maciej Fijalkowski <fij...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit