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