[pypy-svn] r30755 - pypy/dist/pypy/translator/stackless
mwh at codespeak.net
mwh at codespeak.net
Mon Jul 31 10:00:07 CEST 2006
Author: mwh
Date: Mon Jul 31 10:00:04 2006
New Revision: 30755
Modified:
pypy/dist/pypy/translator/stackless/transform.py
Log:
re-use 'save blocks' where the saved types are exactly the same.
Modified: pypy/dist/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/transform.py (original)
+++ pypy/dist/pypy/translator/stackless/transform.py Mon Jul 31 10:00:04 2006
@@ -121,10 +121,10 @@
return key
def saving_function_for_type(self, FRAME_TYPE):
- v_restart = varoftype(lltype.Signed)
v_exception = varoftype(self.transformer.unwind_exception_type)
+ v_restart = varoftype(lltype.Signed)
- save_block = model.Block([v_restart, v_exception])
+ save_block = model.Block([v_exception, v_restart])
llops = LowLevelOpList()
if self.stackless_gc:
@@ -459,6 +459,7 @@
assert self.curr_graph is None
self.curr_graph = graph
+ self.curr_graph_save_blocks = {}
if SAVE_STATISTICS:
self.stats.cur_rp_exact_types = {}
self.stats.cur_rp_erased_types = {}
@@ -490,9 +491,8 @@
self.stats.pot_erased_saves[gkey(self.curr_graph)] = pot_erased_save_count
self.stats.total_pot_erased_saves += pot_erased_save_count
-
-
self.curr_graph = None
+ self.curr_graph_save_blocks = None
def ops_read_global_state_field(self, targetvar, fieldname):
ops = []
@@ -836,7 +836,9 @@
exact_key = (tuple(exact_key), var_result.concretetype)
inc(self.stats.cur_rp_exact_types, exact_key)
inc(self.stats.cur_rp_erased_types, frame_type)
-
+
+ c_restart = model.Constant(len(self.masterarray1) + len(self.resume_blocks), lltype.Signed)
+ varsforcall.insert(0, c_restart)
return (self._generate_save_block(varsforcall, var_exception,
frame_type, fieldnames, saver),
@@ -846,11 +848,19 @@
def _generate_save_block(self, varsforcall, var_unwind_exception,
frame_type, fieldnames, saver):
+ conc_types = tuple([v.concretetype for v in varsforcall])
+ if conc_types in self.curr_graph_save_blocks:
+ return self.curr_graph_save_blocks[conc_types]
rtyper = self.translator.rtyper
edata = rtyper.getexceptiondata()
etype = edata.lltype_of_exception_type
evalue = edata.lltype_of_exception_value
- inputargs = [unsimplify.copyvar(None, v) for v in varsforcall]
+ def cv(v):
+ if isinstance(v, model.Variable):
+ return unsimplify.copyvar(None, v)
+ else:
+ return varoftype(v.concretetype)
+ inputargs = [cv(v) for v in varsforcall]
var_unwind_exception = unsimplify.copyvar(None, var_unwind_exception)
save_state_block = model.Block(inputargs + [var_unwind_exception])
@@ -858,9 +868,7 @@
var_exc = gen_cast(saveops, self.unwind_exception_type, var_unwind_exception)
- c_restart = model.Constant(len(self.masterarray1) + len(self.resume_blocks), lltype.Signed)
-
- realvarsforcall = [c_restart, var_exc]
+ realvarsforcall = [var_exc]
for v in inputargs:
realvarsforcall.append(gen_cast(saveops, storage_type(v.concretetype), v))
@@ -883,6 +891,7 @@
save_state_block, save_state_block.exits[0])
if SAVE_STATISTICS:
self.stats.saveops += len(save_state_block.operations)
+ self.curr_graph_save_blocks[conc_types] = save_state_block
return save_state_block
def _generate_resume_block(self, varstosave, frame_type, fieldnames,
More information about the Pypy-commit
mailing list