# HG changeset patch # User Andreas Woess # Date 1377541303 -7200 # Node ID decad422aa0c53892025ada1ebf9d0a388afe2ce # Parent ece40b452e6596ed5fbbe12679f31dc876b4f03f Truffle: improve virtual frame access verification (GRAAL-424 #resolve). diff -r ece40b452e65 -r decad422aa0c graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/FrameAccessNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/FrameAccessNode.java Mon Aug 26 19:25:06 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/FrameAccessNode.java Mon Aug 26 20:21:43 2013 +0200 @@ -70,7 +70,7 @@ return getConstantFrameSlot().getIndex(); } - protected boolean isConstantFrameSlot() { + public boolean isConstantFrameSlot() { return slot.isConstant() && !slot.isNullConstant(); } diff -r ece40b452e65 -r decad422aa0c graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/VerifyFrameDoesNotEscapePhase.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/VerifyFrameDoesNotEscapePhase.java Mon Aug 26 19:25:06 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/VerifyFrameDoesNotEscapePhase.java Mon Aug 26 20:21:43 2013 +0200 @@ -37,9 +37,8 @@ @Override protected void run(StructuredGraph graph) { - NewFrameNode frame = graph.getNodes(NewFrameNode.class).first(); - if (frame != null) { - for (MethodCallTargetNode callTarget : frame.usages().filter(MethodCallTargetNode.class)) { + for (NewFrameNode virtualFrame : graph.getNodes(NewFrameNode.class)) { + for (MethodCallTargetNode callTarget : virtualFrame.usages().filter(MethodCallTargetNode.class)) { if (callTarget.invoke() != null) { String properties = callTarget.getDebugProperties().toString(); String arguments = callTarget.arguments().toString(); @@ -47,6 +46,12 @@ throw GraphUtil.approxSourceException(callTarget, exception); } } + for (FrameAccessNode frameAccess : virtualFrame.usages().filter(FrameAccessNode.class)) { + if (!frameAccess.isConstantFrameSlot()) { + Throwable exception = new VerificationError("Frame slot must be compile-time constant in virtual frame access at: %s frameSlot=%s", frameAccess, frameAccess.getSlot()); + throw GraphUtil.approxSourceException(frameAccess, exception); + } + } } } }