[pypy-svn] r36272 - in pypy/branch/jit-codegen-refactor/pypy/jit/codegen: . llgraph llgraph/test
arigo at codespeak.net
arigo at codespeak.net
Mon Jan 8 15:01:55 CET 2007
Author: arigo
Date: Mon Jan 8 15:01:53 2007
New Revision: 36272
Modified:
pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py
pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/test/test_rgenop.py
pypy/branch/jit-codegen-refactor/pypy/jit/codegen/model.py
Log:
(mwh, arigo)
More refinements to the interface.
Modified: pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py (original)
+++ pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py Mon Jan 8 15:01:53 2007
@@ -66,12 +66,12 @@
return LLBuilder(self.gv_f, b)
class LLBuilder(GenBuilder):
+ jumped_from = None
def __init__(self, g, block):
self.rgenop = rgenop
self.gv_f = g
self.b = block
- self.jumped_to_builders = []
def end(self):
llimpl.end(self.gv_f)
@@ -175,23 +175,21 @@
llimpl.closereturnlink(lnk, gv_returnvar.v, self.gv_f)
self._close()
- def jump_if_true(self, gv_cond, args_for_jump_gv):
- l_false, l_true = llimpl.closeblock2(self.b, gv_cond.v)
- self.b = llimpl.closelinktofreshblock(l_false, None)
- b2 = llimpl.closelinktofreshblock(l_true, args_for_jump_gv)
+ def _jump(self, l_jump, l_no_jump, args_for_jump_gv):
+ self.b = llimpl.closelinktofreshblock(l_no_jump, None)
+ b2 = llimpl.closelinktofreshblock(l_jump, args_for_jump_gv)
later_builder = LLBuilder(self.gv_f, llimpl.nullblock)
later_builder.later_block = b2
- self.jumped_to_builders.append(later_builder)
+ later_builder.jumped_from = self
return later_builder
+ def jump_if_true(self, gv_cond, args_for_jump_gv):
+ l_false, l_true = llimpl.closeblock2(self.b, gv_cond.v)
+ return self._jump(l_true, l_false, args_for_jump_gv)
+
def jump_if_false(self, gv_cond, args_for_jump_gv):
l_false, l_true = llimpl.closeblock2(self.b, gv_cond.v)
- self.b = llimpl.closelinktofreshblock(l_true, None)
- b2 = llimpl.closelinktofreshblock(l_false, args_for_jump_gv)
- later_builder = LLBuilder(self.gv_f, llimpl.nullblock)
- later_builder.later_block = b2
- self.jumped_to_builders.append(later_builder)
- return later_builder
+ return self._jump(l_false, l_true, args_for_jump_gv)
def flexswitch(self, gv_switchvar, args_gv):
llimpl.closeblockswitch(self.b, gv_switchvar.v)
@@ -201,9 +199,20 @@
def _close(self):
self.b = llimpl.nullblock
- for builder in self.jumped_to_builders:
- builder.b = builder.later_block
- builder.later_block = llimpl.nullblock
+
+ def start_writing(self):
+ assert self.b == llimpl.nullblock
+ if self.jumped_from:
+ assert self.jumped_from.b == llimpl.nullblock
+ assert self.later_block != llimpl.nullblock
+ self.b = self.later_block
+ self.later_block = llimpl.nullblock
+
+ def pause_writing(self, args_gv):
+ lnk = llimpl.closeblock1(self.b)
+ b2 = llimpl.closelinktofreshblock(lnk, args_gv)
+ self.later_block = b2
+ self._close()
def show_incremental_progress(self):
llimpl.show_incremental_progress(self.gv_f)
Modified: pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/test/test_rgenop.py
==============================================================================
--- pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/test/test_rgenop.py (original)
+++ pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/test/test_rgenop.py Mon Jan 8 15:01:53 2007
@@ -69,6 +69,7 @@
gv1 = builder.genop2('int_lt', gv0, const0)
false_builder = builder.jump_if_false(gv1, [gv0])
builder.finish_and_return(f1_token, const0)
+ false_builder.start_writing()
false_builder.finish_and_return(f1_token, gv0)
builder.end()
if_ptr = gv_if.revealconst(lltype.Ptr(F1))
@@ -112,6 +113,7 @@
gv2 = builder.genop2('int_le', gv_i1, gv1)
loop_builder = builder.jump_if_true(gv2, [gv_result1, gv_i1, gv1])
builder.finish_and_return(f1_token, gv_result1)
+ loop_builder.start_writing()
loop_builder.finish_and_goto([gv_result1, gv_i1, gv1], loopblock)
builder.end()
Modified: pypy/branch/jit-codegen-refactor/pypy/jit/codegen/model.py
==============================================================================
--- pypy/branch/jit-codegen-refactor/pypy/jit/codegen/model.py (original)
+++ pypy/branch/jit-codegen-refactor/pypy/jit/codegen/model.py Mon Jan 8 15:01:53 2007
@@ -102,9 +102,10 @@
that is taken if gv_condition is false and return the new
builder.
- The current builder stays open, and it must be closed before
- the fresh builder is used at all, to make the backend\'s life
- easier.'''
+ The current builder stays open. To make the backend\'s life
+ easier it must be closed before the fresh builder is used at
+ all, and the first thing to call on the latter is
+ start_writing().'''
def jump_if_true(self, gv_condition, args_for_jump_gv):
'''See above, with the obvious difference :)'''
@@ -153,14 +154,15 @@
'''Optional method: prints or logs the position of the generated code
along with the given msg.
'''
- def pause(self):
+ def pause_writing(self, args_gv):
'''Optional method: Called when the builder will not be used for a
while. This allows the builder to free temporary resources needed
during code generation. The next call to the builder will have to be
- to enter_next_block, finish_and_got, finish_and_return or resume.
+ to start_writing().
'''
- def resume(self):
- 'Resumes a paused builder.'
+ def start_writing(self):
+ '''Start a builder returned by jump_if_xxx(), or resumes a paused
+ builder.'''
class GenLabel(object):
'''A "smart" label. Represents an address of the start of a basic
More information about the Pypy-commit
mailing list