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 ce22e93b4542dbf95490f7ca5945c6ca68d4de3c..837bd534627de17d70d12b97ec38c6f6e873ad64 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 d52436f13ffcd2a8cfbc91a5a16d5ed68538cb99..687c4fce806f0fd1f3ea91763bb59686e0962052 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; + } }