[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