# HG changeset patch # User Michael Van De Vanter # Date 1447208730 28800 # Node ID 5b6e15432aae1f2c9114a75ecf2289ec510337c5 # Parent 834c334de216e0160b95fe6ce31a45a4d96406a1 Truffle/debugging: minor changes to get "eval" working correctly in some cases diff -r 834c334de216 -r 5b6e15432aae truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java --- 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 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 diff -r 834c334de216 -r 5b6e15432aae truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/debug/SuspendedEvent.java --- 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 frames; + private final int stackSize; private final Debugger debugger; SuspendedEvent(Debugger prepares, Node astNode, MaterializedFrame mFrame, List 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)); } } diff -r 834c334de216 -r 5b6e15432aae truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java --- 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); }