Author: Armin Rigo <[email protected]>
Branch: continulet-jit-3
Changeset: r58309:a2118e60e259
Date: 2012-10-21 13:11 +0200
http://bitbucket.org/pypy/pypy/changeset/a2118e60e259/

Log:    merge heads

diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -41,6 +41,11 @@
         self.registers_r = [None] * 256
         self.registers_f = [None] * 256
 
+    def __repr__(self):
+        if hasattr(self, 'jitcode'):
+            return '<MIFrame for %s>' % self.jitcode.name
+        return '<MIFrame <uninitialized>>'
+
     def setup(self, jitcode, greenkey=None):
         assert isinstance(jitcode, JitCode)
         self.jitcode = jitcode
@@ -753,8 +758,7 @@
         jfdescr = jfdescrbox.getref_base()
         descr = cpu.jitframe_cast_jfdescr_to_descr(jfdescr)
         if not descr:
-            xxx
-            raise SwitchToBlackhole(Counters.ABORT_ESCAPE)
+            raise Exception("descr should not be none while inside a recursive 
call")
         resume.rebuild_virtualizable_from_resumedata(self.metainterp, descr,
                                                      vinfo, box, jfbox)
         self._opimpl_setfield_gc_any(box, vinfo.jit_frame_descr,
@@ -901,7 +905,6 @@
         if warmrunnerstate.inlining:
             if warmrunnerstate.can_inline_callable(greenboxes):
                 portal_code = targetjitdriver_sd.mainjitcode
-                self.orgpc_before_recursive_call = orgpc
                 return self.metainterp.perform_call(portal_code, allboxes,
                                                     greenkey=greenboxes)
             assembler_call = True
@@ -1094,6 +1097,8 @@
             # with make_result_of_lastop(), so the lastop must be right:
             # it must be the call to 'self', and not the jit_merge_point
             # itself, which has no result at all.
+            vbox = redboxes[jitdriver_sd.index_of_virtualizable]
+            self._force_virtualizable_if_necessary(vbox, orgpc)
             assert len(self.metainterp.framestack) >= 2
             try:
                 self.metainterp.finishframe(None)
@@ -1102,7 +1107,7 @@
             frame = self.metainterp.framestack[-1]
             frame.do_recursive_call(jitdriver_sd, greenboxes + redboxes,
                                     assembler_call=True,
-                                    orgpc=frame.orgpc_before_recursive_call)
+                                    orgpc=-1) # don't force the virtualizable
             raise ChangeFrame
 
     def debug_merge_point(self, jitdriver_sd, jd_index, portal_call_depth, 
current_call_id, greenkey):
@@ -2549,8 +2554,6 @@
         if targetjitdriver_sd.virtualizable_info is not None and orgpc != -1:
             vbox = args[targetjitdriver_sd.index_of_virtualizable]
             frame = self.framestack[-1]
-            import pdb
-            pdb.set_trace()
             frame._force_virtualizable_if_necessary(vbox, orgpc)
         token = warmrunnerstate.get_assembler_token(greenargs)
         op = op.copy_and_change(rop.CALL_ASSEMBLER, args=args, descr=token)
diff --git a/pypy/jit/metainterp/test/test_recursive.py 
b/pypy/jit/metainterp/test/test_recursive.py
--- a/pypy/jit/metainterp/test/test_recursive.py
+++ b/pypy/jit/metainterp/test/test_recursive.py
@@ -1019,6 +1019,38 @@
         res = self.meta_interp(main, [], inline=True)
         assert res == main()
 
+    def test_call_assembler_force_in_the_blackhole(self):
+        class Frame(object):
+            _virtualizable2_ = ['thing']
+
+            def __init__(self, thing):
+                self.thing = thing
+
+        driver = JitDriver(greens = ['codeno'],
+                           reds = ['i', 'frame', 'frames'],
+                           virtualizables = ['frame'])
+
+        def portal(codeno, frame, frames):
+            i = 0
+            while i < 10:
+                driver.jit_merge_point(i=i, frame=frame, codeno=codeno,
+                                       frames=frames)
+                frame.thing = frame.thing + 1
+                if codeno == 0:
+                    no = (i % 2)
+                    newframe = frames[no]
+                    frame.thing += portal(no + 1, newframe, None)
+                    frame.thing += newframe.thing
+                i += 1
+            return frame.thing
+
+        def main():
+            frames = [Frame(1), Frame(2)]
+            return portal(0, Frame(0), frames)
+
+        res = self.meta_interp(main, [], inline=True)
+        assert res == main()
+
     def test_assembler_call_red_args(self):
         driver = JitDriver(greens = ['codeno'], reds = ['i', 'k'],
                            get_printable_location = lambda codeno : 
str(codeno))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to