[pypy-svn] r52934 - in pypy/branch/jit-hotpath/pypy/jit: rainbow timeshifter

cfbolz at codespeak.net cfbolz at codespeak.net
Tue Mar 25 18:34:07 CET 2008


Author: cfbolz
Date: Tue Mar 25 18:34:07 2008
New Revision: 52934

Modified:
   pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py
Log:
backing out revision 52933. there are failing tests that I overlooked


Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	Tue Mar 25 18:34:07 2008
@@ -341,7 +341,8 @@
                 self.newjitstate(newjitstate)
                 if self.frame is not None:
                     newjitstate = rtimeshift.collect_split(
-                        self.jitstate, self.frame.pc)
+                        self.jitstate, self.frame.pc,
+                        self.frame.local_green)
                     assert newjitstate.frame.bytecode is self.frame.bytecode
                     assert newjitstate.frame.pc == self.frame.pc
                     self.newjitstate(newjitstate)
@@ -500,6 +501,7 @@
 
     @arguments("red", "jumptarget")
     def opimpl_red_goto_iftrue(self, switchbox, target):
+        # XXX not sure about passing no green vars
         decision = rtimeshift.split(self.jitstate, switchbox, self.frame.pc)
         if decision:
             self.frame.pc = target
@@ -511,6 +513,7 @@
 
     @arguments("exception")
     def opimpl_split_raisingop(self, ll_evalue):
+        # XXX not sure about passing no green vars
         rtimeshift.split_raisingop(self.jitstate, self.frame.pc, ll_evalue)
 
 
@@ -554,7 +557,8 @@
 
     @arguments()
     def opimpl_yellow_return(self):
-        self.jitstate.save_green_return_value(self.frame.local_green[0])
+        # save the greens to make the return value findable by collect_split
+        rtimeshift.save_greens(self.jitstate, self.frame.local_green)
         rtimeshift.save_return(self.jitstate)
         return self.dispatch()
 
@@ -611,7 +615,8 @@
     def opimpl_portal_call(self, greenargs, redargs):
         self.portalstate.portal_reentry(greenargs, redargs)
         newjitstate = rtimeshift.collect_split(
-            self.jitstate, self.frame.pc)
+            self.jitstate, self.frame.pc,
+            self.frame.local_green)
         assert newjitstate.frame.bytecode is self.frame.bytecode
         assert newjitstate.frame.pc == self.frame.pc
         self.newjitstate(newjitstate)
@@ -636,13 +641,15 @@
 
     @arguments(returns="green")
     def opimpl_yellow_retrieve_result(self):
-        return self.jitstate.get_gv_return_value()
+        # XXX all this jitstate.greens business is a bit messy
+        return self.jitstate.greens[0]
 
     @arguments("2byte", returns="red")
     def opimpl_yellow_retrieve_result_as_red(self, typeid):
+        # XXX all this jitstate.greens business is a bit messy
         redboxcls = self.frame.bytecode.redboxclasses[typeid]
         kind = self.frame.bytecode.typekinds[typeid]
-        return redboxcls(kind, self.jitstate.get_gv_return_value())
+        return redboxcls(kind, self.jitstate.greens[0])
 
     @arguments("oopspec", "bool", returns="red")
     def opimpl_red_oopspec_call_0(self, oopspec, deepfrozen):

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py	Tue Mar 25 18:34:07 2008
@@ -407,7 +407,6 @@
     jitstate.resumepoint = resumepoint
 
 def split(jitstate, switchredbox, resumepoint, *greens_gv):
-    assert not greens_gv
     exitgvar = switchredbox.getgenvar(jitstate)
     if exitgvar.is_const:
         return exitgvar.revealconst(lltype.Bool)
@@ -417,7 +416,6 @@
 
 def split_nonconstantcase(jitstate, exitgvar, resumepoint,
                           condbox, reverse, greens_gv, ll_evalue=NULL_OBJECT):
-    assert not greens_gv
     resuming = jitstate.get_resuming()
     if resuming is not None and resuming.mergesleft == 0:
         node = resuming.path.pop()
@@ -452,7 +450,6 @@
     return True
 
 def split_raisingop(jitstate, resumepoint, ll_evalue, *greens_gv):
-    assert not greens_gv
     exitgvar = jitstate.get_gv_op_raised()
     if exitgvar.is_const:
         gotexc = exitgvar.revealconst(lltype.Bool)
@@ -463,7 +460,7 @@
     if gotexc:
         jitstate.residual_ll_exception(ll_evalue)
 
-def collect_split(jitstate_chain, resumepoint):
+def collect_split(jitstate_chain, resumepoint, greens_gv):
     # YYY split to avoid over-specialization
     # assumes that the head of the jitstate_chain is ready for writing,
     # and all the other jitstates in the chain are paused
@@ -474,7 +471,7 @@
         assert isinstance(node, PromotionPathCollectSplit)
         for i in range(node.n):
             pending = pending.next
-        #pending.greens.extend(greens_gv)
+        pending.greens.extend(greens_gv)
         if pending.returnbox is not None:
             pending.frame.local_boxes.append(getreturnbox(pending))
         pending.next = None
@@ -485,7 +482,7 @@
     while True:
         jitstate = pending
         pending = pending.next
-        #jitstate.greens.extend(greens_gv)   # item 0 is the return value
+        jitstate.greens.extend(greens_gv)   # item 0 is the return value
         if jitstate.returnbox is not None:
             jitstate.frame.local_boxes.append(getreturnbox(jitstate))
         jitstate.resumepoint = resumepoint
@@ -538,12 +535,14 @@
     jitstate.frame.local_boxes = redboxes
 
 def save_greens(jitstate, greens_gv):
-    assert not greens_gv
     jitstate.greens = list(greens_gv)
 
 def getlocalbox(jitstate, i):
     return jitstate.frame.local_boxes[i]
 
+def ll_getgreenbox(jitstate, i, T):
+    return jitstate.greens[i].revealconst(T)
+
 def getreturnbox(jitstate):
     retbox = jitstate.returnbox
     jitstate.returnbox = None
@@ -1041,7 +1040,7 @@
 class JITState(object):
     _attrs_ = """curbuilder frame
                  exc_type_box exc_value_box
-                 gv_return_value
+                 greens
                  gv_op_raised
                  returnbox
                  promotion_path
@@ -1070,7 +1069,6 @@
         if newgreens is None:
             newgreens = []
         self.greens = newgreens
-        self.gv_return_value = None
         self.gv_op_raised = None
 
         # XXX can not be a dictionary
@@ -1290,13 +1288,6 @@
         self.gv_op_raised = None
         return result
 
-    def save_green_return_value(self, gv_result):
-        self.gv_return_value = gv_result
-
-    def get_gv_return_value(self):
-        result = self.gv_return_value
-        self.gv_return_value = None
-        return result
 
 def start_writing(jitstate=None, prevopen=None):
     if jitstate is not prevopen:

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py	Tue Mar 25 18:34:07 2008
@@ -239,6 +239,8 @@
                 self.setgenvar_hint(gv_null, known_nonzero=False)
         return ok
 
+    learn_boolvalue = learn_nonzeroness
+
     def __repr__(self):
         if not self.genvar and self.content is not None:
             return '<virtual %s>' % (self.content,)



More information about the Pypy-commit mailing list