Author: Armin Rigo <[email protected]>
Branch:
Changeset: r95435:b010806d20bf
Date: 2018-12-07 11:19 +0200
http://bitbucket.org/pypy/pypy/changeset/b010806d20bf/
Log: Fix for 708fbffab6a0
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py
b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -389,6 +389,8 @@
def optimize_GUARD_SUBCLASS(self, op):
info = self.getptrinfo(op.getarg(0))
optimizer = self.optimizer
+ # must raise 'InvalidLoop' in all cases where 'info' shows the
+ # class cannot possibly match (see test_issue2926)
if info and info.is_constant():
c = self.get_box_replacement(op.getarg(0))
vtable = optimizer.cpu.ts.cls_of_box(c).getint()
@@ -398,13 +400,29 @@
if info is not None and info.is_about_object():
known_class = info.get_known_class(optimizer.cpu)
if known_class:
+ # Class of 'info' is exactly 'known_class'.
+ # We know statically if the 'guard_subclass' will pass or fail.
if optimizer._check_subclass(known_class.getint(),
op.getarg(1).getint()):
return
+ else:
+ raise InvalidLoop(
+ "GUARD_SUBCLASS(known_class) proven to always fail")
elif info.get_descr() is not None:
- if optimizer._check_subclass(info.get_descr().get_vtable(),
+ # Class of 'info' is either get_descr() or a subclass of it.
+ # We're keeping the 'guard_subclass' at runtime only in the
+ # case where get_descr() is some strict parent class of
+ # the argument to 'guard_subclass'.
+ info_base_descr = info.get_descr().get_vtable()
+ if optimizer._check_subclass(info_base_descr,
op.getarg(1).getint()):
- return
+ return # guard_subclass always passing
+ elif optimizer._check_subclass(op.getarg(1).getint(),
+ info_base_descr):
+ pass # don't know, must keep the 'guard_subclass'
+ else:
+ raise InvalidLoop(
+ "GUARD_SUBCLASS(base_class) proven to always fail")
return self.emit(op)
def optimize_GUARD_NONNULL(self, op):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit