From 555e6319653d94cecc70d563a0029acff9738e23 Mon Sep 17 00:00:00 2001 From: Tomas Stupka <tomas.stupka@oracle.com> Date: Wed, 7 Mar 2018 21:30:11 +0100 Subject: [PATCH] support RInteropScalar in print() and paste() --- .../com/oracle/truffle/r/nodes/builtin/base/Paste.java | 2 +- .../truffle/r/nodes/builtin/casts/CastForeignNode.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java index ce22e93b45..837bd53462 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java @@ -271,7 +271,7 @@ public abstract class Paste extends RBuiltinNode.Arg3 { private CastNode getAsCharacterNode() { if (asCharacterNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - asCharacterNode = insert(newCastBuilder().returnIf(nullValue(), emptyStringVector()).asStringVector().buildCastNode()); + asCharacterNode = insert(newCastBuilder().castForeignObjects(true).returnIf(nullValue(), emptyStringVector()).asStringVector().buildCastNode()); } return asCharacterNode; } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java index d52436f13f..687c4fce80 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java @@ -24,6 +24,7 @@ package com.oracle.truffle.r.nodes.builtin.casts; import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.unary.CastNode; +import com.oracle.truffle.r.runtime.data.RInteropScalar; import com.oracle.truffle.r.runtime.interop.ForeignArray2R; public final class CastForeignNode extends CastNode { @@ -31,13 +32,20 @@ public final class CastForeignNode extends CastNode { @Child private ForeignArray2R foreignArray2R = ForeignArray2R.create(); private final ConditionProfile isForeign = ConditionProfile.createBinaryProfile(); + private final ConditionProfile isInteropScalar = ConditionProfile.createBinaryProfile(); @Override protected Object execute(Object obj) { if (isForeign.profile(foreignArray2R.isForeignVector(obj))) { return foreignArray2R.convert(obj); + } else if (isInteropScalar.profile(isInteropScalar(obj))) { + return ((RInteropScalar) obj).getRValue(); } else { return obj; } } + + protected boolean isInteropScalar(Object obj) { + return obj instanceof RInteropScalar; + } } -- GitLab