[pypy-svn] r23516 - pypy/dist/pypy/translator/backendopt

ericvrp at codespeak.net ericvrp at codespeak.net
Mon Feb 20 17:02:46 CET 2006


Author: ericvrp
Date: Mon Feb 20 17:02:42 2006
New Revision: 23516

Modified:
   pypy/dist/pypy/translator/backendopt/stackless.py
Log:
some thoughts on how to proceed with the stackless transformation.


Modified: pypy/dist/pypy/translator/backendopt/stackless.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/stackless.py	(original)
+++ pypy/dist/pypy/translator/backendopt/stackless.py	Mon Feb 20 17:02:42 2006
@@ -24,15 +24,69 @@
 
 def stackless(translator, stacklessdata):
     log('starting')
-    seen = {}
-    for op in all_operations(translator):
-        try:
-            seen[op.opname] += 1
-        except:
-            seen[op.opname] = 1
-
-    #statistics...
-    for k, v in seen.iteritems():
-        log("%dx %s" % (v, k))
+
+    for graph in translator.graphs:
+        """
+        #note: c/stackless.py check_directcall_result() computes savelines and resumeblocks
+        if not savelines:
+            continue
+        generate_savelines()
+        generate_resumeblocks()
+        graph.operations.insert(0, 'if (slp_frame_stack_top) goto resume;')
+        """
+        for block in graph.iterblocks():
+            for opindex, op in enumerate(block.operations):
+                if op.opname not in ('direct_call', 'indirect_call'):
+                    continue
+                needstackless = False #TODO: extract from SlpFunctionCodeGenerator.check_directcall_result
+                if not needstackless:
+                    continue
+                """
+                emit code like:
+                    l_v74 = pypy_g_f(l_v73);
+                    if (slp_frame_stack_bottom)     # 1.
+                        goto save_2;
+                    resume_2:
+                    #2. check rpythonexception
+                1. was generated by SlpFunctionCodeGenerator.check_directcall_result
+                2. will be generated by FunctionCodeGenerator.check_directcall_result
+                2. should actually still be generated by the backends. The problem is that 
+                """
+
+    def generate_savelines():
+        """
+        for line in self.savelines:  # save-state-away lines
+            yield line
+        """
+        return
+
+    def generate_resumeblocks():
+        """
+        yield 'resume:'    # resume-state blocks
+        yield '{'
+        yield '\tslp_frame_t* f = slp_frame_stack_top;'
+        yield '\tslp_frame_stack_top = NULL;'
+        yield '\tswitch (slp_restart_substate) {'
+        for block in self.resumeblocks:
+            for line in block:
+                yield '\t'+line
+        yield '\t}'
+        yield '\tassert(!"bad restart_substate");'
+        yield '}'
+        """
+
+    def compute_function_signatures():
+        """
+        # record extra data needed to generate the slp_*.h tables:
+        # find the signatures of all functions
+        slpdata = self.db.stacklessdata
+        argtypes = [signature_type(self.lltypemap(v))
+        for v in self.graph.getargs()]
+        argtypes = [T for T in argtypes if T is not lltype.Void]
+        rettype = signature_type(self.lltypemap(self.graph.getreturnvar()))
+        FUNC = lltype.FuncType(argtypes, rettype)
+        slpdata.registerunwindable(self.functionname, FUNC,
+                                   resume_points = len(self.resumeblocks))
+        """
 
     log('finished')



More information about the Pypy-commit mailing list