[pypy-svn] r37079 - in pypy/dist/pypy/jit: codegen codegen/i386 codegen/i386/test codegen/llgraph codegen/llgraph/test codegen/llvm codegen/ppc codegen/ppc/test codegen/test timeshifter timeshifter/test

arigo at codespeak.net arigo at codespeak.net
Sat Jan 20 22:59:40 CET 2007


Author: arigo
Date: Sat Jan 20 22:59:34 2007
New Revision: 37079

Modified:
   pypy/dist/pypy/jit/codegen/graph2rgenop.py
   pypy/dist/pypy/jit/codegen/i386/rgenop.py
   pypy/dist/pypy/jit/codegen/i386/test/test_genc_portal.py
   pypy/dist/pypy/jit/codegen/i386/test/test_operation.py
   pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py
   pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
   pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py
   pypy/dist/pypy/jit/codegen/llvm/rgenop.py
   pypy/dist/pypy/jit/codegen/model.py
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
   pypy/dist/pypy/jit/codegen/ppc/test/test_interp.py
   pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
   pypy/dist/pypy/jit/timeshifter/hrtyper.py
   pypy/dist/pypy/jit/timeshifter/rtimeshift.py
   pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py
Log:
(pedronis, arigo)

The point of this is to pass codegen/i386/test/test_genc_portal.py.

Change the newgraph() signature: it now returns a builder that is not
initially opened.  Changed hrtyper to not generate residual graphs
recursively any more, but off a queue.

All i386 tests pass!  Success.  All ppc tests still pass too.
Apparently, no new failure in the llvm backend on wyvern.


Modified: pypy/dist/pypy/jit/codegen/graph2rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/graph2rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/graph2rgenop.py	Sat Jan 20 22:59:34 2007
@@ -12,6 +12,7 @@
     sigtoken = rgenop.sigToken(FUNC)
     builder, gv_entrypoint, args_gv = rgenop.newgraph(sigtoken,
                                          "compiled_%s" % (graph.name,))
+    builder.start_writing()
 
     pending_blocks = {graph.startblock: (builder, args_gv)}
     seen_blocks = {}

Modified: pypy/dist/pypy/jit/codegen/i386/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/rgenop.py	Sat Jan 20 22:59:34 2007
@@ -244,6 +244,7 @@
     opname = 'int_floordiv'
     input_is_64bits = True
     reg_containing_result = eax
+    unsigned = False
     @staticmethod
     def emit(mc, op2):
         # from the PPC backend which has the same problem:
@@ -1312,6 +1313,7 @@
         mc = self.generate_block_code(outputargs_gv, outputargs_gv, operands,
                               minimal_stack_depth = targetlbl.targetstackdepth)
         mc.JMP(rel32(targetlbl.targetaddr))
+        mc.done()
         self.rgenop.close_mc(mc)
 
     def finish_and_return(self, sigtoken, gv_returnvar):
@@ -1324,11 +1326,13 @@
         mc.POP(ebp)
         mc.RET()
         # ----------------
+        mc.done()
         self.rgenop.close_mc(mc)
 
     def pause_writing(self, alive_gv):
         mc = self.generate_block_code(alive_gv, renaming=False)
         self.set_coming_from(mc)
+        mc.done()
         self.rgenop.close_mc(mc)
         return self
 
@@ -1430,6 +1434,7 @@
                                       renaming=False)
         result = FlexSwitch(self.rgenop, self.inputargs_gv, self.inputoperands)
         default_builder = result.initialize(mc)
+        mc.done()
         self.rgenop.close_mc(mc)
         return result, default_builder
 
@@ -1568,9 +1573,6 @@
         mc.PUSH(esi)
         mc.PUSH(edi)
         # ^^^ pushed 5 words including the retval ( == PROLOGUE_FIXED_WORDS)
-        self.close_mc(mc)
-        # NB. a bit of a hack: the first generated block of the function
-        # will immediately follow, by construction
         # ----------------
         numargs = sigtoken     # for now
         inputargs_gv = []
@@ -1579,7 +1581,12 @@
             inputargs_gv.append(GenVar())
             inputoperands.append(mem(ebp, WORD * (2+i)))
         builder = Builder(self, inputargs_gv, inputoperands)
-        builder.start_writing()
+        # XXX this makes the code layout in memory a bit obscure: we have the
+        # prologue of the new graph somewhere in the middle of its first
+        # caller, all alone...
+        builder.set_coming_from(mc)
+        mc.done()
+        self.close_mc(mc)
         #ops = [OpSameAs(v) for v in inputargs_gv]
         #builder.operations.extend(ops)
         #inputargs_gv = ops

Modified: pypy/dist/pypy/jit/codegen/i386/test/test_genc_portal.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_genc_portal.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_genc_portal.py	Sat Jan 20 22:59:34 2007
@@ -1,5 +1,4 @@
 import py, os
-py.test.skip("in-progress")
 from pypy.annotation import model as annmodel
 from pypy.annotation.listdef import s_list_of_strings
 from pypy.rlib.unroll import unrolling_iterable

Modified: pypy/dist/pypy/jit/codegen/i386/test/test_operation.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_operation.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_operation.py	Sat Jan 20 22:59:34 2007
@@ -59,6 +59,7 @@
         arraytoken = rgenop.arrayToken(A)
         builder0, gv_callable, _ = rgenop.newgraph(rgenop.sigToken(FUNC0),
                                                    'generated')
+        builder0.start_writing()
         builder0.genop_setarrayitem(arraytoken, gv_a, rgenop.genconst(0),
                                     rgenop.genconst(1))
         builder0.genop_setarrayitem(arraytoken, gv_a, rgenop.genconst(1),

Modified: pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py	Sat Jan 20 22:59:34 2007
@@ -19,6 +19,7 @@
         # ------------------------------------------------------------
         builder0, gv_callable, [v0, v1, v2] = rgenop.newgraph(
             rgenop.sigToken(FUNC3), 'generated')
+        builder0.start_writing()
         v3 = builder0.genop_malloc_varsize(varsizealloctoken,
                                            rgenop.genconst(2))
         v4 = builder0.genop1('ptr_iszero', v3)

Modified: pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/llgraph/rgenop.py	Sat Jan 20 22:59:34 2007
@@ -289,13 +289,11 @@
     currently_writing = None
 
     def newgraph(self, (ARGS_gv, gv_RESULT, gv_FUNCTYPE), name):
-        debug_assert(self.currently_writing is None,
-                     "newgraph: currently_writing")
         gv_func = llimpl.newgraph(gv_FUNCTYPE.v, name)
-        builder = LLBuilder(self, gv_func, llimpl.getstartblock(gv_func))
-        inputargs_gv = [LLVar(llimpl.getinputarg(builder.b, i))
+        builder = LLBuilder(self, gv_func, llimpl.nullblock)
+        builder.later_block = llimpl.getstartblock(gv_func)
+        inputargs_gv = [LLVar(llimpl.getinputarg(builder.later_block, i))
                         for i in range(len(ARGS_gv))]
-        self.currently_writing = builder
         return builder, LLConst(gv_func), inputargs_gv
 
     @staticmethod

Modified: pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py	Sat Jan 20 22:59:34 2007
@@ -44,6 +44,7 @@
     readertoken = rgenop.sigToken(lltype.typeOf(reader_ptr).TO)
 
     builder, gv_f, [gv_x] = rgenop.newgraph(sigtoken, "f")
+    builder.start_writing()
 
     gv_y = builder.genop2("int_mul", gv_x, rgenop.genconst(2))
     gv_base = builder.get_frame_base()
@@ -61,6 +62,7 @@
     rgenop = RGenOp()
     sigtoken = rgenop.sigToken(F1)
     builder, gv_adder, [gv_x] = rgenop.newgraph(sigtoken, "adder")
+    builder.start_writing()
     gv_result = builder.genop2("int_add", gv_x, rgenop.genconst(5))
     builder.finish_and_return(sigtoken, gv_result)
     #builder.end() <--- the point

Modified: pypy/dist/pypy/jit/codegen/llvm/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/llvm/rgenop.py	Sat Jan 20 22:59:34 2007
@@ -811,7 +811,6 @@
         self.funcsig[n] = '%s %%%s' % (restype, name)
         self.gv_entrypoint = IntConst(n)    #note: updated by Builder.end() (i.e after compilation)
         args = list(prologueblock.inputargs)
-        builder.start_writing()
         return builder, self.gv_entrypoint, args
 
     @specialize.genconst(1)

Modified: pypy/dist/pypy/jit/codegen/model.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/model.py	(original)
+++ pypy/dist/pypy/jit/codegen/model.py	Sat Jan 20 22:59:34 2007
@@ -201,7 +201,10 @@
         inputargs_gv where the new builder is for the startblock,
         entrypoint is the address of the new function as GenConst and
         inputargs_gv is the location of each argument on entry to the
-        function.  name is for debugging purposes"""
+        function.  name is for debugging purposes.  The fresh builder
+        is initially paused, you must call start_writing() before
+        actually putting operations in it.
+        """
         raise NotImplementedError
 
     # all staticmethods commented out for the sake of the annotator

Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py	Sat Jan 20 22:59:34 2007
@@ -413,7 +413,6 @@
             return self
         else:
             self._open()
-            self.closed = False
             self.maybe_patch_start_here()
             return self
 
@@ -520,6 +519,7 @@
 
     def _open(self):
         self.asm.mc = self.rgenop.open_mc()
+        self.closed = False
 
     def _close(self):
         self.rgenop.close_mc(self.asm.mc)

Modified: pypy/dist/pypy/jit/codegen/ppc/test/test_interp.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/test/test_interp.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/test/test_interp.py	Sat Jan 20 22:59:34 2007
@@ -14,6 +14,7 @@
         rgenop = LLTypeRGenOp()
         sigtoken = rgenop.sigToken(FUNC)
         builder, gv_add_one, [gv_x] = rgenop.newgraph(sigtoken, "adder")
+        builder.start_writing()
         gv_result = builder.genop2("int_add", gv_x, rgenop.genconst(n))
         builder.finish_and_return(sigtoken, gv_result)
         builder.end()

Modified: pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/test/rgenop_tests.py	(original)
+++ pypy/dist/pypy/jit/codegen/test/rgenop_tests.py	Sat Jan 20 22:59:34 2007
@@ -15,6 +15,7 @@
     # 'return x+n'
     sigtoken = rgenop.sigToken(FUNC)
     builder, gv_add_one, [gv_x] = rgenop.newgraph(sigtoken, "adder")
+    builder.start_writing()
     gv_result = builder.genop2("int_add", gv_x, rgenop.genconst(n))
     builder.finish_and_return(sigtoken, gv_result)
     builder.end()
@@ -37,6 +38,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC2)
     builder, gv_dummyfn, [gv_x, gv_y] = rgenop.newgraph(sigtoken, "dummy")
+    builder.start_writing()
     gv_z = builder.genop2("int_sub", gv_x, rgenop.genconst(1))
 
     args_gv = [gv_y, gv_z, gv_x]
@@ -74,6 +76,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC100)
     builder, gv_largedummyfn, gvs = rgenop.newgraph(sigtoken, "largedummy")
+    builder.start_writing()
 
     for i in range(0, 100, 2):
         gvs.append(builder.genop2("int_sub", gvs[i], gvs[i+1]))
@@ -123,6 +126,7 @@
     sigtoken = rgenop.sigToken(FUNC2)
     builder, gv_branchingfn, [gv_x, gv_y] = rgenop.newgraph(sigtoken,
                                                             "branching")
+    builder.start_writing()
     gv_cond = builder.genop2("int_gt", gv_x, rgenop.genconst(5))
     false_builder = builder.jump_if_false(gv_cond, [gv_y])
 
@@ -191,6 +195,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC2)
     builder, gv_gotofn, [gv_x, gv_y] = rgenop.newgraph(sigtoken, "goto")
+    builder.start_writing()
 
     [gv_x, gv_y, gv_z],loopblock,bodybuilder = loop_start(
         rgenop, builder, signed_kind, gv_x, gv_y)
@@ -221,6 +226,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC2)
     builder, gv_gotofn, [gv_x1, gv_unused] = rgenop.newgraph(sigtoken, "if")
+    builder.start_writing()
 
     # check
     args_gv = [gv_x1, gv_unused]
@@ -271,6 +277,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC2)
     builder, gv_switch, [gv0, gv1] = rgenop.newgraph(sigtoken, "switch")
+    builder.start_writing()
 
     flexswitch, default_builder = builder.flexswitch(gv0, [gv1])
     const21 = rgenop.genconst(21)
@@ -319,6 +326,7 @@
     signed_tok = rgenop.kindToken(lltype.Signed)
     f2_token = rgenop.sigToken(FUNC2)
     builder, gv_switch, (gv0, gv1) = rgenop.newgraph(f2_token, "large_switch")
+    builder.start_writing()
 
     flexswitch, default_builder = builder.flexswitch(gv0, [gv1])
     const21 = rgenop.genconst(21)
@@ -362,6 +370,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC)
     builder, gv_fact, [gv_x] = rgenop.newgraph(sigtoken, "fact")
+    builder.start_writing()
 
     gv_cond = builder.genop1("int_is_true", gv_x)
 
@@ -398,6 +407,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC)
     builder, gv_f, [gv_x] = rgenop.newgraph(sigtoken, "abs")
+    builder.start_writing()
 
     gv_cond = builder.genop2("int_gt", gv_x, rgenop.genconst(0))
 
@@ -440,6 +450,7 @@
     bool_kind = rgenop.kindToken(lltype.Bool)
     sigtoken = rgenop.sigToken(FUNC)
     builder, gv_f, [gv_y] = rgenop.newgraph(sigtoken, "abs")
+    builder.start_writing()
 
     gv_x = builder.genop2("int_le", rgenop.genconst(2), gv_y)
 
@@ -469,6 +480,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC)
     builder, gv_f, [gv_y] = rgenop.newgraph(sigtoken, "foo")
+    builder.start_writing()
 
     gv_result = builder.genop2("int_eq", gv_y, rgenop.genconst(0))
     target1 = builder.jump_if_false(gv_result, [gv_result])
@@ -497,6 +509,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC)
     builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken, "f")
+    builder.start_writing()
 
     gv_one = rgenop.genconst(1)
 
@@ -548,6 +561,7 @@
     signed_kind = rgenop.kindToken(lltype.Signed)
     sigtoken = rgenop.sigToken(FUNC2)
     builder, gv_f, [gv_x, gv_y] = rgenop.newgraph(sigtoken, "f")
+    builder.start_writing()
 
     gv_c = builder.genop2("int_ne", gv_x, rgenop.genconst(0))
 
@@ -593,6 +607,7 @@
     sig1token = rgenop.sigToken(FUNC)
     sig100token = rgenop.sigToken(FUNC100)
     builder, gv_callable, [gv_x, gv_y] = rgenop.newgraph(sig2token, "f")
+    builder.start_writing()
 
     gv_z = builder.genop_call(sig100token, gv_largedummy, [gv_y]*100)
     gv_w = builder.genop_call(sig1token, gv_add1, [gv_x])
@@ -857,6 +872,7 @@
         sigtoken = rgenop.sigToken(FUNC2)
         builder, gv_callable, [gv_x, gv_y] = rgenop.newgraph(sigtoken,
                                                              "multicmp")
+        builder.start_writing()
 
         args_gv = [gv_x, gv_y]
         builder.enter_next_block([signed_kind, signed_kind], args_gv)
@@ -908,6 +924,7 @@
         sigtoken = rgenop.sigToken(FUNC)
         builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken,
                                                        "multicmp")
+        builder.start_writing()
         gv_one = rgenop.genconst(1)
 
         gv_gt = builder.genop2("int_gt", gv_one, gv_x)
@@ -962,6 +979,7 @@
         sigtoken = rgenop.sigToken(FUNC)
         builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken,
                                                        "tightloop")
+        builder.start_writing()
         args_gv = [gv_x]
         loopstart = builder.enter_next_block([signed_kind], args_gv)
         [gv_x] = args_gv
@@ -988,11 +1006,13 @@
         sigtoken = rgenop.sigToken(FUNC)
         builder, gv_verysmall_callable, [gv_x] = rgenop.newgraph(sigtoken,
                                                                  "verysmall")
+        builder.start_writing()
         builder.finish_and_return(sigtoken, rgenop.genconst(17))
         builder.end()
 
         builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken,
                                                        "jtbwmv")
+        builder.start_writing()
         gv_cond = builder.genop1("int_is_true", gv_x)
         builder2 = builder.jump_if_false(gv_cond, [gv_x])
         builder = builder.pause_writing([gv_x])
@@ -1027,6 +1047,7 @@
         signed_kind = rgenop.kindToken(lltype.Signed)
         sigtoken = rgenop.sigToken(FUNC)
         builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken, "sameas")
+        builder.start_writing()
         gv_nineteen = builder.genop_same_as(signed_kind, rgenop.genconst(19))
         assert not gv_nineteen.is_const   # 'same_as' must return a variable
         builder.finish_and_return(sigtoken, gv_nineteen)
@@ -1090,6 +1111,7 @@
         signed_kind = rgenop.kindToken(lltype.Signed)
         sigtoken = rgenop.sigToken(FUNC)
         builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken, "defaultonly")
+        builder.start_writing()
         flexswitch, default_builder = builder.flexswitch(gv_x, [gv_x])
         default_builder.finish_and_return(sigtoken, gv_x)
         builder.end()

Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py	Sat Jan 20 22:59:34 2007
@@ -260,8 +260,15 @@
             vinfo_read_forced_ptr)
         self.vinfo_read_forced_token = RGenOp.sigToken(
                                      lltype.typeOf(vinfo_read_forced_ptr).TO)
-        
-         
+
+        # global state for the portal corresponding to this timeshifted world
+        class PortalState(object):
+            pass
+        def compile_more_functions():
+            "Empty by default; overridden in rewire_portal()"
+        self.portalstate = PortalState()
+        self.portalstate.compile_more_functions = compile_more_functions
+
     def specialize(self, origportalgraph=None, view=False):
         """
         Driver for running the timeshifter.
@@ -352,12 +359,7 @@
         args_specification = unrolling_iterable(args_specification)
         fresh_jitstate = self.ll_fresh_jitstate
         finish_jitstate = self.ll_finish_jitstate
-
-        class PortalState(object):
-            def __init__(self):
-                self.cache = {}
-
-        state = PortalState()
+        sigtoken = rgenop.sigToken(FUNC)
 
         # debug helper
         def readportal(*args):
@@ -400,7 +402,6 @@
                 gv_generated = cache[key]
             except KeyError:
                 portal_ts_args = ()
-                sigtoken = rgenop.sigToken(FUNC)
                 builder, gv_generated, inputargs_gv = rgenop.newgraph(sigtoken,
                                                              "generated")
                 cache[key] = gv_generated
@@ -418,15 +419,27 @@
                         i += make_arg_redbox.consumes                        
                         portal_ts_args += (box,)
 
+                state.graph_compilation_queue.append((top_jitstate, portal_ts_args))
+                compile_more_functions()
+
+            fn = gv_generated.revealconst(lltype.Ptr(FUNC))
+            return fn(*residualargs)
+
+        def compile_more_functions():
+            while state.graph_compilation_queue:
+                top_jitstate, portal_ts_args = state.graph_compilation_queue.pop()
+                builder = top_jitstate.curbuilder
+                builder.start_writing()
                 top_jitstate = portal_fn(top_jitstate, *portal_ts_args)
                 if top_jitstate is not None:
                     finish_jitstate(top_jitstate, sigtoken)
-                    
                 builder.end()
                 builder.show_incremental_progress()
-            fn = gv_generated.revealconst(lltype.Ptr(FUNC))
-            return fn(*residualargs)
 
+        state = self.portalstate
+        state.cache = {}
+        state.graph_compilation_queue = []
+        state.compile_more_functions = compile_more_functions
 
         args_s = [annmodel.lltype_to_annotation(v.concretetype) for
                   v in origportalgraph.getargs()]
@@ -464,7 +477,6 @@
                     box = args[i]
                     args_gv.append(box.getgenvar(jitstate))
                 i = i + 1
-            sigtoken = rgenop.sigToken(FUNC)
             cache = state.cache
             try:
                 gv_generated = cache[key]
@@ -489,14 +501,8 @@
                         portal_ts_args += (box,)
 
                 top_jitstate = fresh_jitstate(builder)
-                top_jitstate = portal_fn(top_jitstate, *portal_ts_args)
-                if top_jitstate is not None:
-                    finish_jitstate(top_jitstate, sigtoken)
-
-                builder.end()
-                builder.show_incremental_progress()
+                state.graph_compilation_queue.append((top_jitstate, portal_ts_args))
 
- 
             gv_res = curbuilder.genop_call(sigtoken, gv_generated, args_gv)
             fetch_global_excdata(jitstate)
 

Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py	Sat Jan 20 22:59:34 2007
@@ -596,25 +596,26 @@
 MC_CALL_NOT_TAKEN      = -2
 
 
-def ll_continue_compilation(promotion_point_ptr, value):
-    try:
-        promotion_point = cast_base_ptr_to_instance(PromotionPoint,
-                                                    promotion_point_ptr)
-        path = [None]
-        root = promotion_point.promotion_path.follow_path(path)
-        gv_value = root.rgenop.genconst(value)
-        resuminginfo = ResumingInfo(promotion_point, gv_value, path)
-        root.continue_compilation(resuminginfo)
-    except Exception, e:
-        lloperation.llop.debug_fatalerror(lltype.Void,
-                                          "compilation-time error %s" % e)
-
 class PromotionDesc:
     __metatype__ = cachedtype
 
     def __init__(self, ERASED, hrtyper):
-##        (s_PromotionPoint,
-##         r_PromotionPoint) = hrtyper.s_r_instanceof(PromotionPoint)
+        state = hrtyper.portalstate
+
+        def ll_continue_compilation(promotion_point_ptr, value):
+            try:
+                promotion_point = cast_base_ptr_to_instance(
+                    PromotionPoint, promotion_point_ptr)
+                path = [None]
+                root = promotion_point.promotion_path.follow_path(path)
+                gv_value = root.rgenop.genconst(value)
+                resuminginfo = ResumingInfo(promotion_point, gv_value, path)
+                root.continue_compilation(resuminginfo)
+                state.compile_more_functions()
+            except Exception, e:
+                lloperation.llop.debug_fatalerror(
+                    lltype.Void, "compilation-time error %s" % e)
+
         fnptr = hrtyper.annhelper.delayedfunction(
             ll_continue_compilation,
             [annmodel.SomePtr(base_ptr_lltype()),

Modified: pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py	Sat Jan 20 22:59:34 2007
@@ -159,6 +159,7 @@
             sigtoken = rgenop.sigToken(FUNC)
             builder, gv_generated, inputargs_gv = rgenop.newgraph(sigtoken,
                                                                   "generated")
+            builder.start_writing()
             i = 0
             for color in argcolors:
                 if color == "green":



More information about the Pypy-commit mailing list