Mercurial > hg > graal-compiler
diff graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java @ 21364:600d37d28494
cleaned up and improved documentation for IntrinsicScope
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 13 May 2015 13:11:17 +0200 |
parents | ead75077228b |
children | e4eae0fb72d0 |
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java Wed May 13 10:54:14 2015 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java Wed May 13 13:11:17 2015 +0200 @@ -208,11 +208,14 @@ } // Skip intrinsic frames - BytecodeParser parent = (BytecodeParser) parser.getNonReplacementAncestor(); - return create(bci, parent, false); + return create(bci, parser.getNonIntrinsicAncestor(), false, (ValueNode[]) null); } - public FrameState create(int bci, BytecodeParser parent, boolean duringCall) { + /** + * @param pushedValues if non-null, values to {@link #push(Kind, ValueNode)} to the stack before + * creating the {@link FrameState} + */ + public FrameState create(int bci, BytecodeParser parent, boolean duringCall, ValueNode... pushedValues) { if (outerFrameState == null && parent != null) { outerFrameState = parent.getFrameStateBuilder().create(parent.bci(), null); } @@ -223,7 +226,18 @@ if (bci == BytecodeFrame.INVALID_FRAMESTATE_BCI) { throw GraalInternalError.shouldNotReachHere(); } - return graph.add(new FrameState(outerFrameState, method, bci, locals, stack, stackSize, lockedObjects, Arrays.asList(monitorIds), rethrowException, duringCall)); + + if (pushedValues != null) { + int stackSizeToRestore = stackSize; + for (ValueNode arg : pushedValues) { + push(arg.getKind(), arg); + } + FrameState res = graph.add(new FrameState(outerFrameState, method, bci, locals, stack, stackSize, lockedObjects, Arrays.asList(monitorIds), rethrowException, duringCall)); + stackSize = stackSizeToRestore; + return res; + } else { + return graph.add(new FrameState(outerFrameState, method, bci, locals, stack, stackSize, lockedObjects, Arrays.asList(monitorIds), rethrowException, duringCall)); + } } public BytecodePosition createBytecodePosition(int bci) { @@ -234,7 +248,7 @@ return new BytecodePosition(parent.getFrameStateBuilder().createBytecodePosition(parent.bci()), parser.intrinsicContext.getOriginalMethod(), -1); } // Skip intrinsic frames - parent = (BytecodeParser) parser.getNonReplacementAncestor(); + parent = parser.getNonIntrinsicAncestor(); } return create(null, bci, parent); }