[pypy-svn] r30899 - pypy/dist/pypy/translator/stackless
mwh at codespeak.net
mwh at codespeak.net
Wed Aug 2 16:03:31 CEST 2006
Author: mwh
Date: Wed Aug 2 16:03:31 2006
New Revision: 30899
Modified:
pypy/dist/pypy/translator/stackless/transform.py
Log:
revert r30860. it's makes confusing code even more confusing and breaks the
build, occasionally.
will try to do something cleaner.
Modified: pypy/dist/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/transform.py (original)
+++ pypy/dist/pypy/translator/stackless/transform.py Wed Aug 2 16:03:31 2006
@@ -449,7 +449,6 @@
assert self.curr_graph is None
self.curr_graph = graph
self.curr_graph_save_blocks = {}
- self.curr_graph_resume_blocks = {}
if SAVE_STATISTICS:
self.stats.cur_rp_exact_types = {}
self.stats.cur_rp_erased_types = {}
@@ -483,7 +482,6 @@
self.curr_graph = None
self.curr_graph_save_blocks = None
- self.curr_graph_resume_blocks = None
def ops_read_global_state_field(self, targetvar, fieldname):
ops = []
@@ -521,12 +519,8 @@
not_resuming_link.llexitcase = -1
resuming_links = []
for resume_index, resume_block in enumerate(self.resume_blocks):
- if resume_block.inputargs:
- args = [var_resume_state]
- else:
- args = []
resuming_links.append(
- model.Link(args, resume_block, resume_index))
+ model.Link([], resume_block, resume_index))
resuming_links[-1].llexitcase = resume_index
new_start_block.exitswitch = var_resume_state
@@ -903,111 +897,68 @@
def _generate_resume_block(self, varsinfieldorder, frame_type,
var_result, links_to_resumption):
- typekey = [v.concretetype for v in varsinfieldorder]
- linkkey = [(link.target, link.exitcase) for link in links_to_resumption[1:]]
- key = tuple([var_result.concretetype] + typekey + linkkey)
- if key in self.curr_graph_resume_blocks:
- newblock, switchblock, newargs, newresult = self.curr_graph_resume_blocks[key]
- if switchblock is None:
- newblock.inputargs = [varoftype(lltype.Signed)]
- switchblock = unsimplify.insert_empty_block(None, newblock.exits[0], [])
- newblock.exits[0].args.append(newblock.inputargs[0])
- switchblock.inputargs.append(varoftype(lltype.Signed))
- switchblock.exitswitch = switchblock.inputargs[-1]
- link, = switchblock.exits
- link.exitcase = link.llexitcase = self.resume_blocks.index(newblock)
- mapping = {}
- for i in range(len(newblock.exits[0].args)):
- mapping[newblock.exits[0].args[i]] = switchblock.inputargs[i]
- if newresult in mapping:
- newresult = mapping[newresult]
- newnewargs = []
- for arg in newargs:
- newnewargs.append(mapping[arg])
- newargs = newnewargs
- self.curr_graph_resume_blocks[key] = newblock, switchblock, newnewargs, newresult
- oldlink = links_to_resumption[0]
- varmap = {}
- for old, new in zip(varsinfieldorder, newargs):
- varmap[old] = new
- varmap[var_result] = newresult
- def rename(arg):
- if isinstance(arg, model.Variable):
+ newblock = model.Block([])
+ newargs = []
+ llops = LowLevelOpList()
+ llops.genop("setfield",
+ [self.ll_global_state,
+ self.c_restart_substate_name,
+ self.c_minus_one])
+ frame_top = varoftype(lltype.Ptr(frame_type))
+ llops.extend(self.ops_read_global_state_field(frame_top, "top"))
+ llops.genop("setfield",
+ [self.ll_global_state,
+ self.c_inst_top_name,
+ self.c_null_state])
+ varmap = {}
+ fielditer = iter(frame_type._names[1:])
+ for arg in varsinfieldorder:
+ assert arg is not var_result
+ t = storage_type(arg.concretetype)
+ if t is lltype.Void:
+ v_newarg = model.Constant(None, lltype.Void)
+ else:
+ fname = model.Constant(fielditer.next(), lltype.Void)
+ assert frame_type._flds[fname.value] is t
+ v_newarg = llops.genop('getfield', [frame_top, fname],
+ resulttype = t)
+ v_newarg = gen_cast(llops, arg.concretetype, v_newarg)
+ varmap[arg] = v_newarg
+
+ rettype = storage_type(var_result.concretetype)
+ getretval = self.fetch_retvals[rettype]
+ retval = llops.genop("direct_call", [getretval],
+ resulttype = rettype)
+ varmap[var_result] = retval
+
+ newblock.operations.extend(llops)
+
+ def rename(arg):
+ if isinstance(arg, model.Variable):
+ if arg in varmap:
return varmap[arg]
else:
- return arg
- newlink = oldlink.copy(rename)
- newlink.exitcase = newlink.llexitcase = len(self.resume_blocks)
- switchblock.recloseblock(*(switchblock.exits + (newlink,)))
- rettype = newresult.concretetype
- retval = newresult
- retlink = newlink
+ assert arg in [l.last_exception, l.last_exc_value]
+ r = unsimplify.copyvar(None, arg)
+ varmap[arg] = r
+ return r
+ else:
+ return arg
+
+ newblock.closeblock(*[l.copy(rename)
+ for l in links_to_resumption])
+ # this check is a bit implicit!
+ if len(links_to_resumption) > 1:
+ newblock.exitswitch = model.c_last_exception
else:
- newblock = model.Block([])
- newargs = []
- llops = LowLevelOpList()
- llops.genop("setfield",
- [self.ll_global_state,
- self.c_restart_substate_name,
- self.c_minus_one])
- frame_top = varoftype(lltype.Ptr(frame_type))
- llops.extend(self.ops_read_global_state_field(frame_top, "top"))
- llops.genop("setfield",
- [self.ll_global_state,
- self.c_inst_top_name,
- self.c_null_state])
- varmap = {}
- newargs = []
- fielditer = iter(frame_type._names[1:])
- for arg in varsinfieldorder:
- assert arg is not var_result
- t = storage_type(arg.concretetype)
- if t is lltype.Void:
- v_newarg = model.Constant(None, lltype.Void)
- else:
- fname = model.Constant(fielditer.next(), lltype.Void)
- assert frame_type._flds[fname.value] is t
- v_newarg = llops.genop('getfield', [frame_top, fname],
- resulttype = t)
- v_newarg = gen_cast(llops, arg.concretetype, v_newarg)
- newargs.append(v_newarg)
- varmap[arg] = v_newarg
-
- rettype = storage_type(var_result.concretetype)
- getretval = self.fetch_retvals[rettype]
- retval = llops.genop("direct_call", [getretval],
- resulttype = rettype)
- varmap[var_result] = retval
-
- newblock.operations.extend(llops)
-
- def rename(arg):
- if isinstance(arg, model.Variable):
- if arg in varmap:
- return varmap[arg]
- else:
- assert arg in [l.last_exception, l.last_exc_value]
- r = unsimplify.copyvar(None, arg)
- varmap[arg] = r
- return r
- else:
- return arg
+ newblock.exitswitch = None
- newblock.closeblock(*[l.copy(rename)
- for l in links_to_resumption])
- # this check is a bit implicit!
- if len(links_to_resumption) > 1:
- newblock.exitswitch = model.c_last_exception
- else:
- newblock.exitswitch = None
- self.curr_graph_resume_blocks[key] = newblock, None, newargs, retval
- retlink = newblock.exits[0]
- if SAVE_STATISTICS:
- self.stats.resumeops += len(newblock.operations)
-
if var_result.concretetype != rettype:
- self.insert_return_conversion(retlink, var_result.concretetype, retval)
+ self.insert_return_conversion(
+ newblock.exits[0], var_result.concretetype, retval)
+ if SAVE_STATISTICS:
+ self.stats.resumeops += len(newblock.operations)
return newblock
def generate_restart_infos(self, graph):
More information about the Pypy-commit
mailing list