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);
+                }
+            }
         }
     }
 }