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