[pypy-svn] r24696 - in pypy/dist/pypy/jit: . test
pedronis at codespeak.net
pedronis at codespeak.net
Tue Mar 21 17:26:01 CET 2006
Author: pedronis
Date: Tue Mar 21 17:25:58 2006
New Revision: 24696
Modified:
pypy/dist/pypy/jit/hintrtyper.py
pypy/dist/pypy/jit/rtimeshift.py
pypy/dist/pypy/jit/test/test_hint_annotation.py
pypy/dist/pypy/jit/test/test_hint_timeshift.py
Log:
(arre, pedronis)
pass one more test of the ones in progress. renamed some tests for clarity.
The code in hintrtyper is reaching a point where extracting some helpers may help
readability. Now is getting to a sort blob.
Modified: pypy/dist/pypy/jit/hintrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/hintrtyper.py (original)
+++ pypy/dist/pypy/jit/hintrtyper.py Tue Mar 21 17:25:58 2006
@@ -146,10 +146,49 @@
if isinstance(hop.args_r[0], BlueRepr):
return hop.args_r[0].timeshift_setfield(hop)
# non virtual case ...
- raise NotImplementedError
+ ts = self.timeshifter
+ PTRTYPE = originalconcretetype(hop.args_s[0])
+ VALUETYPE = originalconcretetype(hop.args_s[2])
+ v_destbox, c_fieldname, v_valuebox = hop.inputargs(self.getredrepr(PTRTYPE),
+ green_void_repr,
+ self.getredrepr(VALUETYPE)
+ )
+ fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
+ c_fielddesc = inputconst(lltype.Void, fielddesc)
+ s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
+ gv_fieldname = rgenop.constFieldName(c_fieldname.value)
+ c_fieldname = hop.inputconst(rgenop.CONSTORVAR, gv_fieldname)
+ v_jitstate = hop.llops.getjitstate()
+ s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
+ return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_setfield,
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR, ts.s_RedBox],
+ [v_jitstate, c_fielddesc, v_destbox, c_fieldname, v_valuebox],
+ annmodel.s_None)
def translate_op_getsubstruct(self, hop):
- return hop.args_r[0].timeshift_getsubstruct(hop)
+ if isinstance(hop.args_r[0], BlueRepr):
+ return hop.args_r[0].timeshift_getsubstruct(hop)
+ # non virtual case
+ # XXX green getfields on an immutable structure could be more efficient
+ ts = self.timeshifter
+ PTRTYPE = originalconcretetype(hop.args_s[0])
+ RESTYPE = originalconcretetype(hop.s_result)
+ v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
+ green_void_repr)
+ fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
+ c_fielddesc = inputconst(lltype.Void, fielddesc)
+ s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
+ gv_fieldname = rgenop.constFieldName(c_fieldname.value)
+ gv_resulttype = rgenop.constTYPE(RESTYPE)
+ c_fieldname = hop.inputconst(rgenop.CONSTORVAR, gv_fieldname)
+ c_resulttype = hop.inputconst(rgenop.CONSTORVAR, gv_resulttype)
+ v_jitstate = hop.llops.getjitstate()
+ s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
+ return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_getsubstruct,
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR, s_CONSTORVAR],
+ [v_jitstate, c_fielddesc, v_argbox, c_fieldname, c_resulttype],
+ ts.s_RedBox)
+
def translate_op_malloc(self, hop):
r_result = hop.r_result
@@ -277,7 +316,19 @@
return [ll_value]
def create(self, hop):
- XXX #...
+ ts = self.timeshifter
+ s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
+ RESTYPE = self.original_concretetype
+ gv_type = rgenop.constTYPE(RESTYPE.TO)
+ c_type = hop.inputconst(rgenop.CONSTORVAR, gv_type)
+ gv_resulttype = rgenop.constTYPE(RESTYPE)
+ c_resulttype = hop.inputconst(rgenop.CONSTORVAR, gv_resulttype)
+ v_jitstate = hop.llops.getjitstate()
+
+ return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_malloc,
+ [ts.s_JITState, s_CONSTORVAR, s_CONSTORVAR],
+ [v_jitstate, c_type, c_resulttype],
+ ts.s_RedBox)
class BlueRepr(Repr):
Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/rtimeshift.py Tue Mar 21 17:25:58 2006
@@ -234,6 +234,31 @@
gv_resulttype)
return VarRedBox(genvar)
+gv_Void = rgenop.constTYPE(lltype.Void)
+
+def ll_generate_setfield(jitstate, fielddesc, destbox,
+ gv_fieldname, valuebox):
+ op_args = lltype.malloc(VARLIST.TO, 3)
+ op_args[0] = destbox.getgenvar()
+ op_args[1] = gv_fieldname
+ op_args[2] = valuebox.getgenvar()
+ rgenop.genop(jitstate.curblock, 'setfield', op_args,
+ gv_Void)
+
+
+
+def ll_generate_getsubstruct(jitstate, fielddesc, argbox,
+ gv_fieldname, gv_resulttype):
+ if isinstance(argbox, ConstRedBox):
+ res = getattr(argbox.ll_getvalue(fielddesc.PTRTYPE), fielddesc.fieldname)
+ return ConstRedBox.ll_fromvalue(res)
+ op_args = lltype.malloc(VARLIST.TO, 2)
+ op_args[0] = argbox.getgenvar()
+ op_args[1] = gv_fieldname
+ genvar = rgenop.genop(jitstate.curblock, 'getsubstruct', op_args,
+ gv_resulttype)
+ return VarRedBox(genvar)
+
def ll_generate_getarrayitem(jitstate, fielddesc, argbox,
indexbox, gv_resulttype):
@@ -248,6 +273,12 @@
gv_resulttype)
return VarRedBox(genvar)
+def ll_generate_malloc(jitstate, gv_type, gv_resulttype):
+ op_args = lltype.malloc(VARLIST.TO, 1)
+ op_args[0] = gv_type
+ genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
+ gv_resulttype)
+ return VarRedBox(genvar)
# ____________________________________________________________
# other jitstate/graph level operations
Modified: pypy/dist/pypy/jit/test/test_hint_annotation.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_hint_annotation.py (original)
+++ pypy/dist/pypy/jit/test/test_hint_annotation.py Tue Mar 21 17:25:58 2006
@@ -306,7 +306,7 @@
hs = hannotate(ll1, [int])
assert isinstance(hs, SomeLLAbstractVariable)
-def test_merge_substructure():
+def test_degenerated_merge_substructure():
S = lltype.GcStruct('S', ('n', lltype.Signed))
T = lltype.GcStruct('T', ('s', S), ('n', lltype.Float))
Modified: pypy/dist/pypy/jit/test/test_hint_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_hint_timeshift.py (original)
+++ pypy/dist/pypy/jit/test/test_hint_timeshift.py Tue Mar 21 17:25:58 2006
@@ -320,8 +320,7 @@
assert res == 7
assert insns == {}
-def test_merge_substructure():
- py.test.skip("in-progress")
+def test_degenerated_merge_substructure():
S = lltype.GcStruct('S', ('n', lltype.Signed))
T = lltype.GcStruct('T', ('s', S), ('n', lltype.Float))
@@ -335,7 +334,7 @@
return s
insns, res = timeshift(ll_function, [0], [])
assert res.n == 4
- assert insns == {'malloc': 1, 'setfield': 1, 'getfield': 1}
+ assert insns == {'getsubstruct': 2, 'int_is_true': 1, 'malloc': 2, 'setfield': 2}
def test_plus_minus_all_inlined():
py.test.skip("in-progress")
More information about the Pypy-commit
mailing list