[pypy-svn] r23530 - in pypy/branch/jit-redboxes-use-classes: . test

arigo at codespeak.net arigo at codespeak.net
Mon Feb 20 23:23:29 CET 2006


Author: arigo
Date: Mon Feb 20 23:23:28 2006
New Revision: 23530

Modified:
   pypy/branch/jit-redboxes-use-classes/hintrtyper.py
   pypy/branch/jit-redboxes-use-classes/hinttimeshift.py
   pypy/branch/jit-redboxes-use-classes/rtimeshift.py
   pypy/branch/jit-redboxes-use-classes/test/test_hint_timeshift.py
Log:
(pedronis, arigo)

End of the refactoring branch.  Will be merged as one check-in, I expect.
See description in the trunk merge shortly.


Modified: pypy/branch/jit-redboxes-use-classes/hintrtyper.py
==============================================================================
--- pypy/branch/jit-redboxes-use-classes/hintrtyper.py	(original)
+++ pypy/branch/jit-redboxes-use-classes/hintrtyper.py	Mon Feb 20 23:23:28 2006
@@ -52,7 +52,7 @@
         try:
             return self.red_reprs[lowleveltype]
         except KeyError:
-            r = RedRepr(lowleveltype, self.timeshifter.r_RedBox.lowleveltype)
+            r = RedRepr(lowleveltype, self.timeshifter)
             self.red_reprs[lowleveltype] = r
             return r
 
@@ -152,9 +152,12 @@
         return hs_c.__class__,
 
 class RedRepr(Repr):
-    def __init__(self, original_concretetype, redbox_lowleveltype):
+    def __init__(self, original_concretetype, timeshifter):
+        assert original_concretetype is not lltype.Void, (
+            "cannot make red boxes for the lltype Void")
         self.original_concretetype = original_concretetype
-        self.lowleveltype = redbox_lowleveltype
+        self.lowleveltype = timeshifter.r_RedBox.lowleveltype
+        self.timeshifter = timeshifter
 
     def get_genop_var(self, v, llops):
         return llops.genmixlevelhelpercall(rtimeshift.ll_gvar_from_redbox,
@@ -163,7 +166,9 @@
                                            annmodel.SomePtr(rgenop.CONSTORVAR))
 
     def convert_const(self, ll_value):
-        return rtimeshift.ConstRedBox.ll_fromvalue(ll_value)
+        redbox = rtimeshift.ConstRedBox.ll_fromvalue(ll_value)
+        timeshifter = self.timeshifter
+        return timeshifter.annhelper.delayedconst(timeshifter.r_RedBox, redbox)
 
     def residual_values(self, ll_value):
         return [ll_value]
@@ -218,26 +223,6 @@
 
 # ____________________________________________________________
 
-##class SomeJITState(annmodel.SomeObject):
-##    pass
-
-##s_JITState = SomeJITState()
-
-##class __extend__(pairtype(HintTypeSystem, SomeJITState)):
-
-##    def rtyper_makerepr((ts, hs_j), hrtyper):
-##        return jitstate_repr
-
-##    def rtyper_makekey((ts, hs_j), hrtyper):
-##        return hs_j.__class__,
-
-##class JITStateRepr(Repr):
-##    lowleveltype = rtimeshift.STATE_PTR
-
-##jitstate_repr = JITStateRepr()
-
-# ____________________________________________________________
-
 def opname2vstr(name):
     lls = string_repr.convert_const(name)
     return inputconst(string_repr.lowleveltype, lls)

Modified: pypy/branch/jit-redboxes-use-classes/hinttimeshift.py
==============================================================================
--- pypy/branch/jit-redboxes-use-classes/hinttimeshift.py	(original)
+++ pypy/branch/jit-redboxes-use-classes/hinttimeshift.py	Mon Feb 20 23:23:28 2006
@@ -11,38 +11,6 @@
 
 # ___________________________________________________________
 
-##def define_queue_in_state(rtyper, s_item, fieldname):
-##    queue_def = listdef.ListDef(None,
-##                                s_item)
-##    queue_def.resize()
-##    queue_def.mutate()
-
-##    s_queue = annmodel.SomeList(queue_def)
-
-##    r_queue = rtyper.getrepr(s_queue)
-##    r_queue.setup()
-##    QUEUE = r_queue.lowleveltype
-
-##    def ll_get_queue(questate):
-##        pass
-##    def _ll_get_queue(questate):
-##        return getattr(questate, fieldname)
-
-##    llgetq = ll_get_queue
-
-##    def ll_get_queue_annotation(queustate_s):
-##        return s_queue
-
-##    llgetq.compute_result_annotation = ll_get_queue_annotation
-
-##    def ll_get_queue_specialize(hop):
-##        return hop.gendirectcall(_ll_get_queue, hop.args_v[0])
-
-##    llgetq.specialize = ll_get_queue_specialize
-
-##    return s_queue, QUEUE, ll_get_queue
- 
-
 class HintTimeshift(object):
     
     def __init__(self, hannotator, rtyper):
@@ -100,51 +68,6 @@
         r_instance = self.annhelper.getdelayedrepr(s_instance)
         return s_instance, r_instance
 
-##        s_return_info = annmodel.SomeTuple([annmodel.SomePtr(rgenop.LINK),
-##                                           annmodel.SomePtr(REDBOX_PTR)])
-
-##        defs = define_queue_in_state(rtyper, s_return_info, 'return_queue')
-##        s_return_queue, RETURN_QUEUE, ll_get_return_queue = defs
-
-##        s_split_info = annmodel.SomeTuple([annmodel.SomeInteger(),
-##                                           annmodel.SomePtr(STATE_PTR),
-##                                           self.s_box_list])
-
-##        defs = define_queue_in_state(rtyper, s_split_info, 'split_queue')
-##        s_split_queue, SPLIT_QUEUE, ll_get_split_queue = defs        
-
-
-##        def ll_newstate():
-##            questate = lltype.malloc(QUESTATE)
-##            questate.return_queue = RETURN_QUEUE.TO.ll_newlist(0)
-##            questate.split_queue = SPLIT_QUEUE.TO.ll_newlist(0)
-##            return questate
-
-##        def ll_copystate(questate):
-##            newquestate = lltype.malloc(QUESTATE)
-##            newquestate.return_queue = questate.return_queue
-##            newquestate.split_queue = questate.split_queue
-##            basestate = questate.basestate
-##            newbasestate = newquestate.basestate
-##            newbasestate.curblock = basestate.curblock
-##            newbasestate.curoutgoinglink = basestate.curoutgoinglink
-##            newbasestate.curvalue = basestate.curvalue
-##            return newquestate
-        
-##        QUESTATE = lltype.GcStruct("quejitstate",
-##                                   ('basestate', STATE),
-##                                   ("return_queue", RETURN_QUEUE),
-##                                   ("split_queue", SPLIT_QUEUE),                                   
-##                                   adtmeths = {
-##            'll_get_return_queue': ll_get_return_queue,
-##            'll_get_split_queue': ll_get_split_queue,
-##            'll_newstate': ll_newstate,
-##            'll_copystate': ll_copystate,
-##            'll_basestate': lambda questate: questate.basestate})
-
-##        self.s_return_queue = s_return_queue # for the test
-##        self.QUESTATE_PTR = lltype.Ptr(QUESTATE)
-
     def getexitindex(self, link, inputargs, args_r, entering_links):
         self.latestexitindex += 1
         v_jitstate = flowmodel.Variable('jitstate')
@@ -216,7 +139,7 @@
         for block in originalblocks:
             if block.operations != ():
                 block_entering_links = entering_links.pop(block)
-                before_block = self.insert_before_block(block, block_entering_links)              
+                before_block = self.insert_before_block(block, block_entering_links)
                 self.insert_bookkeeping_enter(block, before_block, len(block_entering_links))
                 
                 self.insert_bookkeeping_leave_block(block, entering_links)
@@ -314,13 +237,8 @@
                 TYPES.append(r.original_concretetype)                
         getrepr = self.rtyper.getrepr
 
-        # XXX factor this out too!
-        for i in range(len(boxes_v)):
-            boxes_v[i] = llops.convertvar(boxes_v[i], self.r_RedBox,
-                                          self.r_box_list.item_repr)
-        v_boxes = rlist.newlist(llops, self.r_box_list, boxes_v)
-        c_TYPES = rmodel.inputconst(VARLIST, make_types_const(TYPES))        
-
+        v_boxes = self.build_box_list(llops, boxes_v)
+        TYPES_gv = make_types_const(TYPES)
 
         if nentrylinks > 1:
             enter_block_logic = self.bookkeeping_enter_for_join
@@ -333,13 +251,18 @@
                           before_block,
                           llops,
                           v_boxes,
-                          c_TYPES)
-
-
+                          TYPES_gv)
 
+    def build_box_list(self, llops, boxes_v):
+        type_erased_v = [llops.convertvar(v_box, self.r_RedBox,
+                                          self.r_box_list.item_repr)
+                         for v_box in boxes_v]
+        v_boxes = rlist.newlist(llops, self.r_box_list, type_erased_v)
+        return v_boxes
 
     def bookkeeping_enter_simple(self, args_r, newinputargs, before_block, llops, v_boxes,
-                                c_TYPES):
+                                TYPES_gv):
+        c_TYPES = rmodel.inputconst(VARLIST, TYPES_gv)
         v_newjitstate = llops.genmixlevelhelpercall(rtimeshift.enter_block,
                              [self.s_JITState, self.s_box_list,
                               annmodel.SomePtr(VARLIST)],
@@ -361,7 +284,7 @@
     # mapping green values combinations to frozen states for red boxes values
     # and generated blocks
     def bookkeeping_enter_for_join(self, args_r, newinputargs, before_block, llops, v_boxes,
-                                  c_TYPES):
+                                   TYPES_gv):
         getrepr = self.rtyper.getrepr        
         items_s = []
         key_v = []
@@ -374,33 +297,21 @@
                 erased_v = llops.convertvar(newvar, r_from, r_to)
                 key_v.append(erased_v)
 
-
         s_key_tuple = annmodel.SomeTuple(items_s)
-  
-        s_dict_value = annmodel.SomeTuple([self.s_box_list,
-                                           annmodel.SomePtr(rgenop.BLOCK)])
-        s_state_dic = annmodel.SomeDict(dictdef.DictDef(None,
-                                                        s_key_tuple,
-                                                        s_dict_value
-                                                        ))
         r_key = getrepr(s_key_tuple)
-
-        r_state_dic = getrepr(s_state_dic)
         r_key.setup()
-
-        r_state_dic.setup()
-
-        c_state_dic = rmodel.inputconst(r_state_dic, {})
-
         v_key = rtuple.newtuple(llops, r_key, key_v)
 
-
         v_oldjitstate = newinputargs[0]
 
-        v_newjitstate = llops.genmixlevelhelpercall(rtimeshift.retrieve_jitstate_for_merge,
-              [s_state_dic, self.s_JITState, s_key_tuple, self.s_box_list,
-               annmodel.SomePtr(VARLIST)],
-              [c_state_dic, v_oldjitstate, v_key, v_boxes, c_TYPES],
+        cache = {}
+        def merge_point(jitstate, key, boxes):
+            return rtimeshift.retrieve_jitstate_for_merge(cache, jitstate,
+                                                          key, boxes, TYPES_gv)
+
+        v_newjitstate = llops.genmixlevelhelpercall(merge_point,
+              [self.s_JITState, s_key_tuple, self.s_box_list],
+              [v_oldjitstate, v_key, v_boxes],
               self.s_JITState)
 
         v_continue = llops.genop('ptr_nonzero', [v_newjitstate], resulttype=lltype.Bool)
@@ -530,9 +441,7 @@
                 else:
                     raise RuntimeError('Unsupported boxtype')
             
-            getrepr = self.rtyper.getrepr
-
-            v_boxes = rlist.newlist(llops, self.r_box_list, boxes_v)
+            v_boxes = self.build_box_list(llops, boxes_v)
             false_exit = [exit for exit in newblock.exits if exit.exitcase is False][0]
             exitindex = self.getexitindex(false_exit, inputargs[1:], args_r, entering_links)
             c_exitindex = rmodel.inputconst(lltype.Signed, exitindex)

Modified: pypy/branch/jit-redboxes-use-classes/rtimeshift.py
==============================================================================
--- pypy/branch/jit-redboxes-use-classes/rtimeshift.py	(original)
+++ pypy/branch/jit-redboxes-use-classes/rtimeshift.py	Mon Feb 20 23:23:28 2006
@@ -113,39 +113,6 @@
         return isinstance(other, AddrRedBox) and self.intvalue == other.adrvalue
 
 
-#REDBOX = lltype.GcStruct("redbox", ("genvar", rgenop.CONSTORVAR),
-#                                   ("isvar", lltype.Bool),
-#                         adtmeths = {
-#    'll_make_for_gvar': ll_make_for_gvar,
-#    'll_make_from_const': ll_make_from_const,
-#    'll_getvalue': ll_getvalue,
-#    })
-#
-#REDBOX_PTR = lltype.Ptr(REDBOX)
-#
-#REDBOX_FOR_SIGNED = lltype.GcStruct("signed_redbox", 
-#                                    ('basebox', REDBOX),
-#                                    ("value", lltype.Signed))
-#REDBOX_FOR_SIGNED_PTR = lltype.Ptr(REDBOX_FOR_SIGNED)
-#STATE = lltype.GcStruct("jitstate", ("curblock", rgenop.BLOCK),
-#                                    ("curoutgoinglink", rgenop.LINK),
-#                                    ("curvalue", REDBOX_PTR))
-#STATE_PTR = lltype.Ptr(STATE)
-
-
-# ____________________________________________________________
-# ll helpers on boxes
-
-
-#def ll_gvar_from_redbox(jitstate, box, TYPE):
-#    if not box.genvar:
-#        value = box.ll_getvalue(TYPE)
-#        box.genvar = ll_gvar_from_const(jitstate, value)
-#    return box.genvar
-
-#def ll_gvar_from_const(jitstate, value):
-#    return rgenop.genconst(value)
-
 # ____________________________________________________________
 # emit ops
 
@@ -223,10 +190,6 @@
                           rgenop.constTYPE(RESULT))
     return VarRedBox(genvar)
 
-#def ll_generate_operation(jitstate, opname, args, RESULTTYPE):
-#    gvar = rgenop.genop(jitstate.curblock, opname, args, RESULTTYPE)
-#    return REDBOX.ll_make_for_gvar(gvar)
-
 # ____________________________________________________________
 # other jitstate/graph level operations
 
@@ -251,7 +214,7 @@
         break
     else:
         rgenop.closelink(jitstate.curoutgoinglink, incoming, oldblock)
-        return lltype.nullptr(STATE)
+        return None
     
     # Make a more general block
     newblock = rgenop.newblock()
@@ -373,6 +336,7 @@
         other.curblock = self.curblock
         other.curoutgoinglink = self.curoutgoinglink
         other.curvalue = self.curvalue
+        return other
 
 def ll_build_jitstate():
     jitstate = JITState()

Modified: pypy/branch/jit-redboxes-use-classes/test/test_hint_timeshift.py
==============================================================================
--- pypy/branch/jit-redboxes-use-classes/test/test_hint_timeshift.py	(original)
+++ pypy/branch/jit-redboxes-use-classes/test/test_hint_timeshift.py	Mon Feb 20 23:23:28 2006
@@ -64,7 +64,7 @@
             box = llinterp.eval_graph(htshift.ll_var_box_graph, [jitstate,
                                                                  rgenop.constTYPE(TYPE)])
             if i in opt_consts: # XXX what should happen here interface wise is unclear
-                box = llinterp.eval_graph(htshift.ll_signed_box_graph, [jitstate, ll_value])
+                box = llinterp.eval_graph(htshift.ll_signed_box_graph, [jitstate, llvalue])
             graph1args.append(box)
             residual_graph_args.append(llvalue)
     startblock = llinterp.eval_graph(htshift.ll_end_setup_jitstate_graph, [jitstate])
@@ -233,7 +233,7 @@
     assert insns == {'int_add': 2,
                      'int_sub': 1}
 
-def test_simple_struct():
+def INPROGRESS_test_simple_struct():
     S = lltype.GcStruct('helloworld', ('hello', lltype.Signed),
                                       ('world', lltype.Signed),
                         hints={'immutable': True})



More information about the Pypy-commit mailing list