Mercurial > hg > graal-compiler
changeset 11425:decad422aa0c
Truffle: improve virtual frame access verification (GRAAL-424 #resolve).
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Mon, 26 Aug 2013 20:21:43 +0200 |
parents | ece40b452e65 |
children | ddbeefb142a7 |
files | graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/FrameAccessNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/VerifyFrameDoesNotEscapePhase.java |
diffstat | 2 files changed, 9 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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(); }
--- 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); + } + } } } }