[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