Author: Maciej Fijalkowski <[email protected]>
Branch:
Changeset: r44791:54bd2d6de6de
Date: 2011-06-07 16:40 +0200
http://bitbucket.org/pypy/pypy/changeset/54bd2d6de6de/
Log: Make sure that jithook is not reentrant. We do care about jitting
stuff there, but we don't call jit hook for those jitted loops
diff --git a/pypy/module/pypyjit/interp_jit.py
b/pypy/module/pypyjit/interp_jit.py
--- a/pypy/module/pypyjit/interp_jit.py
+++ b/pypy/module/pypyjit/interp_jit.py
@@ -57,11 +57,14 @@
space = self.space
cache = space.fromcache(Cache)
+ if cache.in_recursion:
+ return
if space.is_true(cache.w_compile_hook):
logops = logger._make_log_operations()
list_w = [space.wrap(logops.repr_of_resop(op))
for op in operations]
pycode = cast_base_ptr_to_instance(PyCode, ll_pycode)
+ cache.in_recursion = True
try:
space.call_function(cache.w_compile_hook,
space.wrap('main'),
@@ -72,14 +75,18 @@
space.newlist(list_w))
except OperationError, e:
e.write_unraisable(space, "jit hook ", cache.w_compile_hook)
+ cache.in_recursion = False
def on_compile_bridge(self, logger, orig_looptoken, operations, n):
space = self.space
cache = space.fromcache(Cache)
+ if cache.in_recursion:
+ return
if space.is_true(cache.w_compile_hook):
logops = logger._make_log_operations()
list_w = [space.wrap(logops.repr_of_resop(op))
for op in operations]
+ cache.in_recursion = True
try:
space.call_function(cache.w_compile_hook,
space.wrap('main'),
@@ -88,6 +95,7 @@
space.newlist(list_w))
except OperationError, e:
e.write_unraisable(space, "jit hook ", cache.w_compile_hook)
+ cache.in_recursion = False
pypyjitdriver = PyPyJitDriver(get_printable_location = get_printable_location,
get_jitcell_at = get_jitcell_at,
@@ -193,6 +201,7 @@
class Cache(object):
def __init__(self, space):
self.w_compile_hook = space.w_None
+ self.in_recursion = False
@unwrap_spec(ObjSpace, W_Root)
def set_compile_hook(space, w_hook):
diff --git a/pypy/module/pypyjit/test/test_jit_hook.py
b/pypy/module/pypyjit/test/test_jit_hook.py
--- a/pypy/module/pypyjit/test/test_jit_hook.py
+++ b/pypy/module/pypyjit/test/test_jit_hook.py
@@ -87,3 +87,19 @@
sys.stderr = prev
assert 'jit hook' in s.getvalue()
assert 'ZeroDivisionError' in s.getvalue()
+
+ def test_non_reentrant(self):
+ import pypyjit
+ l = []
+
+ def hook(*args):
+ l.append(None)
+ self.on_compile()
+ self.on_compile_bridge()
+
+ pypyjit.set_compile_hook(hook)
+ self.on_compile()
+ assert len(l) == 1 # and did not crash
+ self.on_compile_bridge()
+ assert len(l) == 2 # and did not crash
+
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit