changeset 22446:5b6e15432aae

Truffle/debugging: minor changes to get "eval" working correctly in some cases
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Tue, 10 Nov 2015 18:25:30 -0800
parents 834c334de216
children a8b796ac350d
files truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/debug/SuspendedEvent.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java
diffstat 3 files changed, 31 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Tue Nov 10 15:33:18 2015 -0800
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Tue Nov 10 18:25:30 2015 -0800
@@ -482,14 +482,19 @@
 
         @Override
         protected Object evalInContext(Object vm, SuspendedEvent ev, String code, FrameInstance frame) throws IOException {
-            Node n = frame == null ? ev.getNode() : frame.getCallNode();
+            Node n = ev.getNode();
+            if (n == null && frame != null) {
+                n = frame.getCallNode();
+            }
+            if (n == null) {
+                throw new IOException("Can't determine language for text \"" + code + "\"");
+            }
             RootNode rootNode = n.getRootNode();
             Class<? extends TruffleLanguage> languageType = findLanguage(rootNode);
-            Env env = findLanguage(vm, languageType);
-            TruffleLanguage<?> lang = findLanguage(env);
-            Source source = Source.fromText(code, "eval in context");
-            CallTarget target = lang.parse(source, n);
-            return target.call();
+            final Env env = findLanguage(vm, languageType);
+            final TruffleLanguage<?> lang = findLanguage(env);
+            final Source source = Source.fromText(code, "eval in context");
+            return lang.evalInContext(source, n, frame.getFrame(null, true).materialize());
         }
 
         @Override
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/debug/SuspendedEvent.java	Tue Nov 10 15:33:18 2015 -0800
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/debug/SuspendedEvent.java	Tue Nov 10 18:25:30 2015 -0800
@@ -24,6 +24,11 @@
  */
 package com.oracle.truffle.api.debug;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.Truffle;
 import com.oracle.truffle.api.frame.FrameInstance;
@@ -31,10 +36,6 @@
 import com.oracle.truffle.api.frame.MaterializedFrame;
 import com.oracle.truffle.api.instrument.StandardSyntaxTag;
 import com.oracle.truffle.api.nodes.Node;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
 
 /**
  * This event is delivered to all
@@ -52,6 +53,7 @@
     private final MaterializedFrame mFrame;
     private final Node astNode;
     private final List<FrameInstance> frames;
+    private final int stackSize;
     private final Debugger debugger;
 
     SuspendedEvent(Debugger prepares, Node astNode, MaterializedFrame mFrame, List<String> recentWarnings, final int stackDepth) {
@@ -77,7 +79,7 @@
                 return frameInstance;
             }
         });
-
+        stackSize = frames.size();
     }
 
     /**
@@ -204,7 +206,14 @@
      * @return the computed value
      * @throws IOException in case an evaluation goes wrong
      */
-    public Object eval(String code, FrameInstance frame) throws IOException {
-        return debugger.evalInContext(this, code, frame);
+    public Object eval(String code, Integer frameNumber) throws IOException {
+        int n = 0;
+        if (frameNumber != null) {
+            if (frameNumber < 0 || frameNumber >= stackSize) {
+                throw new IOException("invalid frame number");
+            }
+            n = frameNumber;
+        }
+        return debugger.evalInContext(this, code, frames.get(n));
     }
 }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Tue Nov 10 15:33:18 2015 -0800
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Tue Nov 10 18:25:30 2015 -0800
@@ -316,10 +316,6 @@
         return API.findContext(env);
     }
 
-    protected TruffleLanguage<?> findLanguage(Env env) {
-        return API.findLanguage(env);
-    }
-
     /** Applies all registered {@linkplain ASTProber probers} to the AST. */
     protected void probeAST(RootNode rootNode) {
         INSTRUMENT.probeAST(rootNode);
@@ -335,6 +331,10 @@
         return parse(truffleLanguage, code, context, argumentNames);
     }
 
+    protected TruffleLanguage<?> findLanguage(Env env) {
+        return API.findLanguage(env);
+    }
+
     protected CallTarget parse(TruffleLanguage<?> truffleLanguage, Source code, Node context, String... argumentNames) throws IOException {
         return API.parse(truffleLanguage, code, context, argumentNames);
     }