diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java index 391ae348f8fadf20069d6bc89c488c99751a8c3f..cfd03f4094ea0d5aa04ca51bd8c949ac2d2bb0d0 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java @@ -364,7 +364,7 @@ final class REngine implements Engine, Engine.Timings { } lastValue = calls[i].call(new Object[]{executionFrame != null ? executionFrame : newContext.stateREnvironment.getGlobalFrame()}); } - return lastValue; + return RRuntime.r2Java(lastValue); } catch (ReturnException ex) { return ex.getResult(); } catch (DebugExitException | JumpToTopLevelException | ExitException | ThreadDeath e) { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java index 9f159f813512fb6ae93d57a02795069172011266..c686273f3d38addd4f03ec62f4606c3a1f119595 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java @@ -308,7 +308,9 @@ public class RCommand { private static boolean doEcho(PolyglotEngine vm) { PolyglotEngine.Value echoValue = vm.eval(GET_ECHO); Object echo = echoValue.get(); - if (echo instanceof TruffleObject) { + if (echo instanceof Boolean) { + return (boolean) echo; + } else if (echo instanceof TruffleObject) { RLogicalVector echoVec = echoValue.as(RLogicalVector.class); return RRuntime.fromLogical(echoVec.getDataAt(0)); } else if (echo instanceof Byte) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java index 75684febae6ee8df37d7d1fd758169b6a918569f..b50be670aff64e6194a116cffdf175381e241629 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java @@ -598,11 +598,14 @@ public class DebugHandling { public void onEnter(EventContext context, VirtualFrame frame) { if (!RContext.getInstance().stateInstrumentation.debugGloballyDisabled()) { CompilerDirectives.transferToInterpreter(); - FunctionDefinitionNode fdn = (FunctionDefinitionNode) context.getInstrumentedNode().getRootNode(); - FunctionStatementsEventListener ensureSingleStep = ensureSingleStep(fdn); + RootNode rootNode = context.getInstrumentedNode().getRootNode(); + if (rootNode instanceof FunctionDefinitionNode) { + FunctionDefinitionNode fdn = (FunctionDefinitionNode) rootNode; + FunctionStatementsEventListener ensureSingleStep = ensureSingleStep(fdn); - functionStatementsEventListener.clearStepInstrument(); - ensureSingleStep.onEnter(context, frame); + functionStatementsEventListener.clearStepInstrument(); + ensureSingleStep.onEnter(context, frame); + } } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java index f338a25c9ac534364d623a9b5a338e3256d0da13..c93bf6935e6818f563f04f9fb608e2a658bee006 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java @@ -24,6 +24,7 @@ package com.oracle.truffle.r.runtime.env; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.interop.ForeignAccess; import com.oracle.truffle.api.interop.Message; import com.oracle.truffle.api.interop.MessageResolution; @@ -137,8 +138,16 @@ public final class RScope extends AbstractScope { return new RScope(node.getRootNode(), getEnv(frame)); } - private static Object getInteropValue(Object value) { - return value; + /** + * Explicitly convert some known types to interop types. + */ + private static Object getInteropValue(Object obj) { + if (obj instanceof Frame) { + MaterializedFrame materialized = ((Frame) obj).materialize(); + assert RArguments.isRFrame(materialized); + return REnvironment.frameToEnvironment(materialized); + } + return obj; } static final class VariablesMapObject implements TruffleObject {