[pypy-commit] pypy resume-refactor: (fijal, antocuni) support bridges in resume bytecode
fijal
noreply at buildbot.pypy.org
Fri Aug 30 15:02:57 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r66460:f0e16e4ab5e2
Date: 2013-08-30 13:54 +0100
http://bitbucket.org/pypy/pypy/changeset/f0e16e4ab5e2/
Log: (fijal, antocuni) support bridges in resume bytecode
diff --git a/rpython/jit/metainterp/resume2.py b/rpython/jit/metainterp/resume2.py
--- a/rpython/jit/metainterp/resume2.py
+++ b/rpython/jit/metainterp/resume2.py
@@ -4,20 +4,21 @@
from rpython.jit.codewriter.jitcode import JitCode
class ResumeBytecode(object):
- def __init__(self, bc, parent=None, loop=None):
- self.bc = bc
- self.branches = {}
+ def __init__(self, opcodes, parent=None, parent_position=-1, loop=None):
+ self.opcodes = opcodes
self.parent = parent
+ self.parent_position = parent_position
self.loop = loop
- def add_branch(self, pos, bc):
- self.branches[pos] = ResumeBytecode(bc, self)
-
class AbstractResumeReader(object):
def rebuild(self, faildescr):
- bytecode = faildescr.rd_loop.rd_bytecode
- pos = faildescr.rd_bytecode_position
- self.interpret_until(bytecode, pos)
+ self._rebuild_until(faildescr.rd_resume_bytecode,
+ faildescr.rd_bytecode_position)
+
+ def _rebuild_until(self, rb, position):
+ if rb.parent is not None:
+ self._rebuild_until(rb.parent, rb.parent_position)
+ self.interpret_until(rb.opcodes, position)
def interpret_until(self, bytecode, until):
pos = 0
@@ -74,3 +75,6 @@
def rebuild_from_resumedata(metainterp, deadframe, faildescr):
BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
+
+def rebuild_locs_from_resumedata(faildescr):
+ ReconstructingResumeReader().rebuild(faildescr)
diff --git a/rpython/jit/metainterp/test/test_resume2.py b/rpython/jit/metainterp/test/test_resume2.py
--- a/rpython/jit/metainterp/test/test_resume2.py
+++ b/rpython/jit/metainterp/test/test_resume2.py
@@ -2,7 +2,9 @@
from rpython.jit.tool.oparser import parse
from rpython.jit.codewriter.jitcode import JitCode
from rpython.jit.metainterp.history import AbstractDescr
-from rpython.jit.metainterp.resume2 import rebuild_from_resumedata
+from rpython.jit.metainterp.resume2 import rebuild_from_resumedata,\
+ rebuild_locs_from_resumedata, ResumeBytecode
+
class Descr(AbstractDescr):
pass
@@ -44,8 +46,7 @@
leave_frame()
""", namespace={'jitcode1': jitcode})
descr = Descr()
- descr.rd_loop = MockLoop()
- descr.rd_loop.rd_bytecode = resume_loop.operations
+ descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
descr.rd_bytecode_position = 2
metainterp = MockMetaInterp()
metainterp.cpu = MockCPU()
@@ -73,8 +74,7 @@
metainterp = MockMetaInterp()
metainterp.cpu = MockCPU()
descr = Descr()
- descr.rd_loop = MockLoop()
- descr.rd_loop.rd_bytecode = resume_loop.operations
+ descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
descr.rd_bytecode_position = 5
rebuild_from_resumedata(metainterp, "myframe", descr)
assert len(metainterp.framestack) == 2
@@ -96,9 +96,39 @@
assert f.registers_i[2].getint() == 11 + 3
assert f.registers_i[4].getint() == 8 + 3
+ def test_bridge(self):
+ jitcode1 = JitCode("jitcode")
+ jitcode1.setup(num_regs_i=13)
+ base = parse("""
+ []
+ enter_frame(-1, descr=jitcode1)
+ backend_put(42, 0, 0)
+ # here is the split caused by a guard
+ backend_put(1, 0, 1)
+ """, namespace={'jitcode1': jitcode1})
+ bridge = parse("""
+ []
+ backend_put(2, 0, 1)
+ """)
+ descr = Descr()
+ descr.rd_bytecode_position = 1
+ parent = ResumeBytecode(base.operations)
+ b = ResumeBytecode(bridge.operations, parent=parent,
+ parent_position=2)
+ descr.rd_resume_bytecode = b
+ metainterp = MockMetaInterp()
+ metainterp.cpu = MockCPU()
+ rebuild_from_resumedata(metainterp, "myframe", descr)
+ f = metainterp.framestack[-1]
+ assert f.num_nonempty_regs() == 2
+ assert f.registers_i[0].getint() == 42 + 3
+ assert f.registers_i[1].getint() == 2 + 3
+
def test_reconstructing_resume_reader(self):
jitcode1 = JitCode("jitcode")
jitcode1.setup(num_regs_i=13)
+ jitcode2 = JitCode("jitcode2")
+ jitcode2.setup(num_regs_i=9)
resume_loop = parse("""
[]
enter_frame(-1, descr=jitcode1)
@@ -109,5 +139,7 @@
leave_frame()
backend_put(10, 0, 1)
leave_frame()
- """)
- xxx
+ """, namespace={'jitcode1': jitcode1,
+ 'jitcode2': jitcode2})
+ descr = Descr()
+ #rebuild_locs_from_resumedata(descr)
More information about the pypy-commit
mailing list