[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