[pypy-svn] r29602 - pypy/dist/pypy/jit/timeshifter
pedronis at codespeak.net
pedronis at codespeak.net
Mon Jul 3 08:02:07 CEST 2006
Author: pedronis
Date: Mon Jul 3 08:02:04 2006
New Revision: 29602
Modified:
pypy/dist/pypy/jit/timeshifter/rtimeshift.py
pypy/dist/pypy/jit/timeshifter/timeshift.py
Log:
(arre, pedronis)
fix some of the refactoring breakage
TODO: we need to be more careful with the return block
there are possibly multiple less general blocks that need to be closed into a real return block.
See degenerated_before_return for an example of this!
Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Mon Jul 3 08:02:04 2006
@@ -252,11 +252,13 @@
return exitindex
return -1
-def prepare_return(cache, gv_return_type):
+def save_return(jitstate, redboxes):
+ jitstate.returnbox = redboxes[0]
+
+def prepare_return(jitstate, cache, gv_return_type):
frozens, block = cache[()]
builder = ResidualGraphBuilder(block)
- memo = rvalue.unfreeze_memo()
- builder.valuebox = frozens[0].unfreeze(memo, block, gv_return_type)
+ builder.valuebox = jitstate.returnbox
return builder
def ll_gvar_from_redbox(jitstate, redbox):
Modified: pypy/dist/pypy/jit/timeshifter/timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/timeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/timeshift.py Mon Jul 3 08:02:04 2006
@@ -322,7 +322,8 @@
cache = enter_block_logic(args_r, newinputargs,
before_block,
llops,
- v_boxes)
+ v_boxes,
+ is_returnblock)
if is_returnblock:
assert self.return_cache is None
self.return_cache = cache
@@ -335,7 +336,7 @@
return v_boxes
def bookkeeping_enter_simple(self, args_r, newinputargs, before_block,
- llops, v_boxes):
+ llops, v_boxes, is_returnblock=False):
v_newjitstate = llops.genmixlevelhelpercall(rtimeshift.enter_block,
[self.s_JITState, self.s_box_list],
[newinputargs[0], v_boxes],
@@ -358,7 +359,7 @@
# mapping green values combinations to frozen states for red boxes values
# and generated blocks
def bookkeeping_enter_for_join(self, args_r, newinputargs, before_block,
- llops, v_boxes):
+ llops, v_boxes, is_returnblock):
getrepr = self.rtyper.getrepr
items_s = []
key_v = []
@@ -401,7 +402,7 @@
v_boxes2 = flowmodel.Variable(v_boxes)
v_boxes2.concretetype = self.r_box_list.lowleveltype
-
+
read_boxes_block_vars = [v_newjitstate2, v_boxes2]
for greenvar in orig_key_v:
@@ -412,6 +413,8 @@
read_boxes_block = flowmodel.Block(read_boxes_block_vars)
to_read_boxes_block = flowmodel.Link([v_newjitstate, v_boxes] + orig_key_v, read_boxes_block)
to_read_boxes_block.exitcase = to_read_boxes_block.llexitcase = True
+
+
to_dispatch_block = flowmodel.Link([v_oldjitstate], self.dispatchblock)
to_dispatch_block.exitcase = to_dispatch_block.llexitcase = False
@@ -423,16 +426,24 @@
llops = HintLowLevelOpList(self, None)
newinputargs2 = [v_newjitstate2]
- i = 0
- j = 0
- for r in args_r[1:]:
- if isinstance(r, RedRepr):
- newinputargs2.append(self.read_out_box(llops, v_boxes2, i))
- i += 1
- else:
- newinputargs2.append(read_boxes_block_vars[j+2])
- j += 1
-
+ if not is_returnblock:
+ i = 0
+ j = 0
+ for r in args_r[1:]:
+ if isinstance(r, RedRepr):
+ newinputargs2.append(self.read_out_box(llops, v_boxes2, i))
+ i += 1
+ else:
+ newinputargs2.append(read_boxes_block_vars[j+2])
+ j += 1
+ else:
+ # xxx reorganize
+ llops.genmixlevelhelpercall(rtimeshift.save_return,
+ [self.s_JITState, self.s_box_list],
+ [v_newjitstate2, v_boxes2],
+ annmodel.s_None)
+ target = self.dispatchblock
+
read_boxes_block.operations[:] = llops
to_target = flowmodel.Link(newinputargs2, target)
@@ -499,10 +510,6 @@
llops = HintLowLevelOpList(self, None)
if len(newblock.exits) == 0: # this is the original returnblock
- llops.genmixlevelhelpercall(rtimeshift.save_return,
- [...],
- [...],
- ...)
newblock.recloseblock(flowmodel.Link(newblock.inputargs, self.dispatchblock))
elif len(newblock.exits) == 1 or isinstance(self.hrtyper.bindingrepr(oldexitswitch), GreenRepr):
newblock.exitswitch = rename(oldexitswitch)
@@ -571,8 +578,10 @@
dispatchblock.operations = list(llops)
dispatch_to = self.dispatch_to
- prepare_return_block = flowmodel.Block([])
- prepare_return_link = flowmodel.Link([], prepare_return_block)
+ v_jitstate2 = flowmodel.Variable('jitstate')
+ v_jitstate2.concretetype = self.r_JITState.lowleveltype
+ prepare_return_block = flowmodel.Block([v_jitstate2])
+ prepare_return_link = flowmodel.Link([v_jitstate], prepare_return_block)
dispatch_to.append(('default', prepare_return_link))
if len(dispatch_to) == 1:
@@ -593,12 +602,13 @@
return_cache = self.return_cache
assert return_cache is not None
RETURN_TYPE = self.r_returnvalue.original_concretetype
- def prepare_return():
- return rtimeshift.prepare_return(return_cache,
+ def prepare_return(jitstate):
+ return rtimeshift.prepare_return(jitstate, return_cache,
rgenop.constTYPE(RETURN_TYPE))
llops = HintLowLevelOpList(self, None)
v_return_builder = llops.genmixlevelhelpercall(prepare_return,
- [], [], self.s_ResidualGraphBuilder)
+ [self.s_JITState], [v_jitstate2],
+ self.s_ResidualGraphBuilder)
prepare_return_block.operations = list(llops)
finishedlink = flowmodel.Link([v_return_builder], returnblock)
More information about the Pypy-commit
mailing list