Author: Armin Rigo <ar...@tunes.org> Branch: stm Changeset: r47628:af9b4a254b39 Date: 2011-09-27 15:39 +0200 http://bitbucket.org/pypy/pypy/changeset/af9b4a254b39/
Log: stm_setfield in genc. diff --git a/pypy/rpython/lltypesystem/lloperation.py b/pypy/rpython/lltypesystem/lloperation.py --- a/pypy/rpython/lltypesystem/lloperation.py +++ b/pypy/rpython/lltypesystem/lloperation.py @@ -390,6 +390,7 @@ # to keep them as operations until the genc stage) 'stm_getfield': LLOp(sideeffects=False, canrun=True), + 'stm_setfield': LLOp(), # __________ address operations __________ 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 @@ -475,14 +475,23 @@ def generic_get(self, op, sourceexpr): T = self.lltypemap(op.result) newvalue = self.expr(op.result, special_case_void=False) - result = '%s = %s;' % (newvalue, sourceexpr) + if op.opname.startswith('stm_'): + typename = self.db.gettype(T) + result = '%s = (%s)stm_read_word((void**)&%s);' % ( + newvalue, cdecl(typename, ''), sourceexpr) + else: + result = '%s = %s;' % (newvalue, sourceexpr) if T is Void: result = '/* %s */' % result return result def generic_set(self, op, targetexpr): newvalue = self.expr(op.args[-1], special_case_void=False) - result = '%s = %s;' % (targetexpr, newvalue) + if op.opname.startswith('stm_'): + result = 'stm_write_word((void**)&%s, (void*)%s);' % ( + targetexpr, newvalue) + else: + result = '%s = %s;' % (targetexpr, newvalue) T = self.lltypemap(op.args[-1]) if T is Void: result = '/* %s */' % result @@ -589,21 +598,8 @@ return '%s = %s.length;'%(self.expr(op.result), expr) - def OP_STM_GETFIELD(self, op): - assert isinstance(op.args[1], Constant) - STRUCT = self.lltypemap(op.args[0]).TO - structdef = self.db.gettypedefnode(STRUCT) - baseexpr_is_const = isinstance(op.args[0], Constant) - sourceexpr = structdef.ptr_access_expr(self.expr(op.args[0]), - op.args[1].value, - baseexpr_is_const) - # - T = self.lltypemap(op.result) - assert T is not Void - typename = self.db.gettype(T) - newvalue = self.expr(op.result) - return '%s = (%s)stm_read_word((void**)&%s);' % ( - newvalue, cdecl(typename, ''), sourceexpr) + OP_STM_GETFIELD = OP_GETFIELD + OP_STM_SETFIELD = OP_BARE_SETFIELD def OP_PTR_NONZERO(self, op): diff --git a/pypy/translator/stm/rstm.py b/pypy/translator/stm/rstm.py --- a/pypy/translator/stm/rstm.py +++ b/pypy/translator/stm/rstm.py @@ -33,3 +33,18 @@ c_fieldname = hop.inputconst(lltype.Void, fieldname) return hop.genop('stm_getfield', [v_structptr, c_fieldname], resulttype = lltype.Signed) + + +class ExtEntry(ExtRegistryEntry): + _about_ = stm_setfield + + def compute_result_annotation(self, s_structptr, s_fieldname, s_newvalue): + return None + + def specialize_call(self, hop): + r_structptr = hop.args_r[0] + v_structptr = hop.inputarg(r_structptr, arg=0) + fieldname = hop.args_v[1].value + v_newvalue = hop.inputarg(hop.args_r[2], arg=2) + c_fieldname = hop.inputconst(lltype.Void, fieldname) + hop.genop('stm_setfield', [v_structptr, c_fieldname, v_newvalue]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit