src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java Fri Feb 02 10:37:48 2018 -0500
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java Fri Feb 02 17:28:17 2018 -0800
@@ -86,6 +86,8 @@
import java.util.List;
import java.util.TreeSet;
+import org.graalvm.collections.EconomicMap;
+import org.graalvm.collections.Equivalence;
import org.graalvm.compiler.bytecode.Bytecode;
import org.graalvm.compiler.bytecode.BytecodeLookupSwitch;
import org.graalvm.compiler.bytecode.BytecodeStream;
@@ -95,8 +97,6 @@
import org.graalvm.compiler.core.common.PermanentBailoutException;
import org.graalvm.compiler.debug.DebugContext;
import org.graalvm.compiler.options.OptionValues;
-import org.graalvm.util.EconomicMap;
-import org.graalvm.util.Equivalence;
import jdk.vm.ci.code.BytecodeFrame;
import jdk.vm.ci.meta.ExceptionHandler;
@@ -415,9 +415,6 @@
}
public static class ExceptionDispatchBlock extends BciBlock {
-
- private EconomicMap<ExceptionHandler, ExceptionDispatchBlock> exceptionDispatch = EconomicMap.create(Equivalence.DEFAULT);
-
public ExceptionHandler handler;
public int deoptBci;
}
@@ -748,15 +745,6 @@
}
}
- private EconomicMap<ExceptionHandler, ExceptionDispatchBlock> initialExceptionDispatch;
-
- private EconomicMap<ExceptionHandler, ExceptionDispatchBlock> getInitialExceptionDispatch() {
- if (initialExceptionDispatch == null) {
- initialExceptionDispatch = EconomicMap.create(Equivalence.DEFAULT);
- }
- return initialExceptionDispatch;
- }
-
private ExceptionDispatchBlock handleExceptions(BciBlock[] blockMap, int bci) {
ExceptionDispatchBlock lastHandler = null;
@@ -769,20 +757,17 @@
lastHandler = null;
}
- EconomicMap<ExceptionHandler, ExceptionDispatchBlock> exceptionDispatch = lastHandler != null ? lastHandler.exceptionDispatch : getInitialExceptionDispatch();
- ExceptionDispatchBlock curHandler = exceptionDispatch.get(h);
- if (curHandler == null) {
- curHandler = new ExceptionDispatchBlock();
- blocksNotYetAssignedId++;
- curHandler.startBci = -1;
- curHandler.endBci = -1;
- curHandler.deoptBci = bci;
- curHandler.handler = h;
- curHandler.addSuccessor(blockMap[h.getHandlerBCI()]);
- if (lastHandler != null) {
- curHandler.addSuccessor(lastHandler);
- }
- exceptionDispatch.put(h, curHandler);
+ // We do not reuse exception dispatch blocks, because nested exception handlers
+ // might have problems reasoning about the correct frame state.
+ ExceptionDispatchBlock curHandler = new ExceptionDispatchBlock();
+ blocksNotYetAssignedId++;
+ curHandler.startBci = -1;
+ curHandler.endBci = -1;
+ curHandler.deoptBci = bci;
+ curHandler.handler = h;
+ curHandler.addSuccessor(blockMap[h.getHandlerBCI()]);
+ if (lastHandler != null) {
+ curHandler.addSuccessor(lastHandler);
}
lastHandler = curHandler;
}