[pypy-svn] r74981 - in pypy/branch/blackhole-improvement/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Mon May 31 22:45:46 CEST 2010
Author: arigo
Date: Mon May 31 22:45:44 2010
New Revision: 74981
Modified:
pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_blackhole.py
Log:
Test and fix: the nice caching of blackhole interpreters
was only working on tests run by interp_operations()!
Use it also on meta_interp() tests (and in the real
translation).
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py Mon May 31 22:45:44 2010
@@ -1281,7 +1281,10 @@
def _run_forever(blackholeinterp, current_exc):
while True:
- current_exc = blackholeinterp._resume_mainloop(current_exc)
+ try:
+ current_exc = blackholeinterp._resume_mainloop(current_exc)
+ finally:
+ blackholeinterp.builder.release_interp(blackholeinterp)
blackholeinterp = blackholeinterp.nextblackholeinterp
def resume_in_blackhole(metainterp_sd, resumedescr, all_virtuals=None):
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_blackhole.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_blackhole.py Mon May 31 22:45:44 2010
@@ -2,8 +2,9 @@
from pypy.rlib.jit import JitDriver
from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
from pypy.jit.metainterp.blackhole import BlackholeInterpBuilder
+from pypy.jit.metainterp.blackhole import BlackholeInterpreter
from pypy.jit.metainterp.blackhole import convert_and_run_from_pyjitpl
-from pypy.jit.metainterp import history
+from pypy.jit.metainterp import history, pyjitpl
from pypy.jit.codewriter.assembler import JitCode
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.llinterp import LLException
@@ -140,3 +141,71 @@
d = py.test.raises(MyMetaInterp.staticdata.DoneWithThisFrameInt,
convert_and_run_from_pyjitpl, MyMetaInterp())
assert d.value.args == (42,)
+
+
+class TestBlackhole(LLJitMixin):
+
+ def test_blackholeinterp_cache(self):
+ myjitdriver = JitDriver(greens = [], reds = ['x', 'y'])
+ def choices(x):
+ if x == 2: return 10
+ if x == 3: return 199
+ if x == 4: return 124
+ if x == 5: return -521
+ if x == 6: return 8917
+ if x == 7: return -387
+ return 34871
+ def f(x):
+ y = 0
+ while x > 0:
+ myjitdriver.can_enter_jit(x=x, y=y)
+ myjitdriver.jit_merge_point(x=x, y=y)
+ y += choices(x)
+ x -= 1
+ return y
+ #
+ seen = []
+ def my_copy_constants(self, *args):
+ seen.append(1)
+ return org_copy_constants(self, *args)
+ org_copy_constants = BlackholeInterpreter.copy_constants
+ BlackholeInterpreter.copy_constants = my_copy_constants
+ try:
+ res = self.meta_interp(f, [7], repeat=7)
+ finally:
+ BlackholeInterpreter.copy_constants = org_copy_constants
+ #
+ assert res == sum([choices(x) for x in range(1, 8)])
+ builder = pyjitpl._warmrunnerdesc.metainterp_sd.blackholeinterpbuilder
+ assert builder.num_interpreters == 2
+ assert len(seen) == 2 * 3
+
+ def test_blackholeinterp_cache_exc(self):
+ myjitdriver = JitDriver(greens = [], reds = ['x', 'y'])
+ class FooError(Exception):
+ def __init__(self, num):
+ self.num = num
+ def choices(x):
+ if x == 2: raise FooError(10)
+ if x == 3: raise FooError(199)
+ if x == 4: raise FooError(124)
+ if x == 5: raise FooError(-521)
+ if x == 6: raise FooError(8917)
+ if x == 7: raise FooError(-387)
+ raise FooError(34871)
+ def f(x):
+ y = 0
+ while x > 0:
+ myjitdriver.can_enter_jit(x=x, y=y)
+ myjitdriver.jit_merge_point(x=x, y=y)
+ try:
+ choices(x)
+ except FooError, e:
+ y += e.num
+ x -= 1
+ return y
+ res = self.meta_interp(f, [7], repeat=7)
+ assert res == sum([py.test.raises(FooError, choices, x).value.num
+ for x in range(1, 8)])
+ builder = pyjitpl._warmrunnerdesc.metainterp_sd.blackholeinterpbuilder
+ assert builder.num_interpreters == 2
More information about the Pypy-commit
mailing list