[pypy-svn] r36258 - pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph

arigo at codespeak.net arigo at codespeak.net
Mon Jan 8 13:15:18 CET 2007


Author: arigo
Date: Mon Jan  8 13:15:15 2007
New Revision: 36258

Modified:
   pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py
Log:
(mwh, arigo)

A hack to make sure that the builders returned by jump_if_xxx() are not
used before the original builder is closed.



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 13:15:15 2007
@@ -71,6 +71,7 @@
         self.rgenop = rgenop
         self.gv_f = g
         self.b = block
+        self.jumped_to_builders = []
 
     def end(self):
         llimpl.end(self.gv_f)
@@ -165,35 +166,45 @@
 
     def finish_and_goto(self, args_gv, target):
         lnk = llimpl.closeblock1(self.b)
-        self.b = llimpl.nullblock
         llimpl.closelink(lnk, args_gv, target.b)
+        self._close()
 
     def finish_and_return(self, sigtoken, gv_returnvar):
         gv_returnvar = gv_returnvar or gv_dummy_placeholder
         lnk = llimpl.closeblock1(self.b)
-        self.b = llimpl.nullblock
         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)
-        later_builder = LLBuilder(self.gv_f, b2)
+        later_builder = LLBuilder(self.gv_f, llimpl.nullblock)
+        later_builder.later_block = b2
+        self.jumped_to_builders.append(later_builder)
         return later_builder
 
     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, b2)
+        later_builder = LLBuilder(self.gv_f, llimpl.nullblock)
+        later_builder.later_block = b2
+        self.jumped_to_builders.append(later_builder)
         return later_builder
 
     def flexswitch(self, gv_switchvar, args_gv):
         llimpl.closeblockswitch(self.b, gv_switchvar.v)
         flexswitch = LLFlexSwitch(self.b, self.gv_f)
-        self.b = llimpl.nullblock
+        self._close()
         return (flexswitch, flexswitch._add_default(args_gv))
 
+    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 show_incremental_progress(self):
         llimpl.show_incremental_progress(self.gv_f)
 



More information about the Pypy-commit mailing list