[pypy-commit] pypy default: Crash earlier and more explicitly if the jit sees an unknown
arigo
noreply at buildbot.pypy.org
Sun Jan 29 19:56:55 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r51951:161714d53cc7
Date: 2012-01-29 10:17 +0100
http://bitbucket.org/pypy/pypy/changeset/161714d53cc7/
Log: Crash earlier and more explicitly if the jit sees an unknown
operation (like cast_ptr_to_adr, as win32 builds see now).
diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -7,6 +7,7 @@
from pypy.jit.metainterp import quasiimmut
from pypy.jit.metainterp.history import getkind
from pypy.jit.metainterp.typesystem import deref, arrayItem
+from pypy.jit.metainterp.blackhole import BlackholeInterpreter
from pypy.objspace.flow.model import SpaceOperation, Variable, Constant, c_last_exception
from pypy.rlib import objectmodel
from pypy.rlib.jit import _we_are_jitted
@@ -199,9 +200,9 @@
try:
rewrite = _rewrite_ops[op.opname]
except KeyError:
- return op # default: keep the operation unchanged
- else:
- return rewrite(self, op)
+ raise Exception("the JIT doesn't support the operation %r"
+ " in %r" % (op, getattr(self, 'graph', '?')))
+ return rewrite(self, op)
def rewrite_op_same_as(self, op):
if op.args[0] in self.vable_array_vars:
@@ -1720,4 +1721,18 @@
result[name[len(prefix):]] = getattr(Transformer, name)
return result
+def keep_operation_unchanged(jtransform, op):
+ return op
+
+def _add_default_ops(rewrite_ops):
+ # All operations present in the BlackholeInterpreter as bhimpl_xxx
+ # but not explicitly listed in this file are supposed to be just
+ # passed in unmodified. All other operations are forbidden.
+ for key, value in BlackholeInterpreter.__dict__.items():
+ if key.startswith('bhimpl_'):
+ opname = key[len('bhimpl_'):]
+ rewrite_ops.setdefault(opname, keep_operation_unchanged)
+ rewrite_ops.setdefault('-live-', keep_operation_unchanged)
+
_rewrite_ops = _with_prefix('rewrite_op_')
+_add_default_ops(_rewrite_ops)
diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -1210,3 +1210,11 @@
assert op1.args == [v1]
assert op1.result is None
assert op2 is None
+
+def test_unknown_operation():
+ op = SpaceOperation('foobar', [], varoftype(lltype.Void))
+ tr = Transformer()
+ try:
+ tr.rewrite_operation(op)
+ except Exception, e:
+ assert 'foobar' in str(e)
More information about the pypy-commit
mailing list