[pypy-svn] r25576 - pypy/dist/pypy/translator/stackless

mwh at codespeak.net mwh at codespeak.net
Sat Apr 8 19:41:05 CEST 2006


Author: mwh
Date: Sat Apr  8 19:40:54 2006
New Revision: 25576

Modified:
   pypy/dist/pypy/translator/stackless/code.py
   pypy/dist/pypy/translator/stackless/transform.py
Log:
(hpk, mwh)
actually generate the code to restore the state in the resumption blocks.
next: the main loop?


Modified: pypy/dist/pypy/translator/stackless/code.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/code.py	(original)
+++ pypy/dist/pypy/translator/stackless/code.py	Sat Apr  8 19:40:54 2006
@@ -87,4 +87,6 @@
         u.frame_bottom = frame_state
 
 def resume_state():
+    # XXX BAAAAAH!
+    global_state.retval_long = 0
     return global_state.restart_substate

Modified: pypy/dist/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/transform.py	(original)
+++ pypy/dist/pypy/translator/stackless/transform.py	Sat Apr  8 19:40:54 2006
@@ -72,10 +72,10 @@
 ##     return retval + x + 1
 
 class ResumePoint:
-    def __init__(self, var_result, varstoload, targetblock):
+    def __init__(self, var_result, link_to_resumption, frame_state_type):
         self.var_result = var_result
-        self.varstoload = varstoload 
-        self.targetblock = targetblock 
+        self.link_to_resumption = link_to_resumption
+        self.frame_state_type = frame_state_type
 
 class StacklessTransfomer(object):
     def __init__(self, translator):
@@ -125,6 +125,12 @@
 
         mixlevelannotator.finish()
 
+        s_global_state = bk.immutablevalue(code.global_state)
+        r_global_state = translator.rtyper.getrepr(s_global_state)
+        self.ll_global_state = model.Constant(r_global_state.convert_const(code.global_state),
+                                              r_global_state.lowleveltype)
+        
+
     def frame_type_for_vars(self, vars):
         types = [storage_type(v.concretetype) for v in vars]
         counts = dict.fromkeys(range(len(STORAGE_TYPES)), 0)
@@ -168,15 +174,45 @@
         new_start_block.operations.append(
             model.SpaceOperation("direct_call", [self.resume_state_ptr], var_resume_state))
         not_resuming_link = model.Link(newinputargs, old_start_block, 0)
+        not_resuming_link.llexitcase = 0
         resuming_links = []
-        for i, resume_point in enumerate(self.resume_points):
+        for resume_point_index, resume_point in enumerate(self.resume_points):
             newblock = model.Block([])
-            args = []
-            for arg in resume_point.targetblock.inputargs:
-                args.append(model.Constant(arg.concretetype._example(), arg.concretetype))
-            newblock.closeblock(model.Link(args, resume_point.targetblock))
+            newargs = []
+            ops = []
+            uncasted_frame_top = varoftype(lltype.Ptr(STATE_HEADER))
+            ops.append(model.SpaceOperation(
+                "getfield",
+                [self.ll_global_state, model.Constant("inst_top", lltype.Void)],
+                uncasted_frame_top))
+            frame_state_type = resume_point.frame_state_type
+            frame_top = varoftype(lltype.Ptr(frame_state_type))
+            ops.append(model.SpaceOperation(
+                "cast_pointer",
+                [uncasted_frame_top],
+                frame_top))
+            i = 0
+            for arg in resume_point.link_to_resumption.args:
+                newarg = copyvar(self.translator, arg)
+                if arg is resume_point.var_result:
+                    ops.append(model.SpaceOperation(
+                        "getfield",
+                        [self.ll_global_state, model.Constant("inst_retval_long", lltype.Void)],
+                        newarg))
+                else:
+                    # frame_state_type._names[0] is 'header'
+                    fname = model.Constant(frame_state_type._names[i+1], lltype.Void)
+                    ops.append(model.SpaceOperation(
+                        'getfield',
+                        [frame_top, fname],
+                        newarg))
+                    i += 1
+                newargs.append(newarg)
+            newblock.operations.extend(ops)
+            newblock.closeblock(model.Link(newargs, resume_point.link_to_resumption.target))
             
-            resuming_links.append(model.Link([], newblock, i+1))
+            resuming_links.append(model.Link([], newblock, resume_point_index+1))
+            resuming_links[-1].llexitcase = resume_point_index+1
         new_start_block.exitswitch = var_resume_state
         new_start_block.closeblock(not_resuming_link, *resuming_links)
 
@@ -200,10 +236,10 @@
                
                 args = [v for v in link.args 
                             if v is not op.result and v.concretetype is not lltype.Void]
-                save_block = self.generate_save_block(
+                save_block, frame_state_type = self.generate_save_block(
                                 args, var_unwind_exception)
 
-                self.resume_points.append(ResumePoint(op.result, args, link.target))
+                self.resume_points.append(ResumePoint(op.result, link, frame_state_type))
 
                 newlink = model.Link(args + [var_unwind_exception], 
                                      save_block, code.UnwindException)
@@ -212,7 +248,6 @@
                 newlink.last_exc_value = var_unwind_exception 
                 block.recloseblock(link, newlink) # exits.append(newlink)
                 self.translator.rtyper._convert_link(block, newlink)
-    # ARGH ... 
 
                 block = link.target
                 i = 0
@@ -266,7 +301,7 @@
         save_state_block.closeblock(model.Link([c_unwindexception, var_exc], 
                                                self.curr_graph.exceptblock))
         self.translator.rtyper._convert_link(save_state_block, save_state_block.exits[0])
-        return save_state_block
+        return save_state_block, frame_type
         
 
     def generate_saveops(self, frame_state_var, varstosave):



More information about the Pypy-commit mailing list