From b12e3f66d5bef08dddb7590fa858ec8c6b7cc91d Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Fri, 22 May 2015 07:37:12 -0700
Subject: [PATCH] A fix to string conversion for RLanguage objects.

---
 .../com/oracle/truffle/r/nodes/unary/CastStringNode.java  | 8 +++++++-
 .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test | 8 ++++++++
 .../truffle/r/test/library/base/TestSimpleBuiltins.java   | 3 +++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
index b2152f6172..8cdf807f92 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
@@ -23,6 +23,7 @@
 package com.oracle.truffle.r.nodes.unary;
 
 import com.oracle.truffle.api.dsl.*;
+import com.oracle.truffle.r.runtime.*;
 import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.data.model.*;
 
@@ -95,7 +96,12 @@ public abstract class CastStringNode extends CastNode {
         String[] sdata = new String[operand.getLength()];
         // conversions to character will not introduce new NAs
         for (int i = 0; i < operand.getLength(); i++) {
-            sdata[i] = toString(operand.getDataAtAsObject(i));
+            Object o = operand.getDataAtAsObject(i);
+            if (o instanceof RLanguage) {
+                sdata[i] = RDeparse.deparseForPrint(o);
+            } else {
+                sdata[i] = toString(o);
+            }
         }
         RStringVector ret = RDataFactory.createStringVector(sdata, operand.isComplete(), getPreservedDimensions(operand), getPreservedNames(operand));
         preserveDimensionNames(operand, ret);
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index 0a58cb06bf..9788e3a7fc 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -5059,6 +5059,14 @@ character(0)
 #{ as.character(list(list(c("hello", "hi")))) }
 [1] "list(c(\"hello\", \"hi\"))"
 
+##com.oracle.truffle.r.test.library.base.TestSimpleBuiltins.testAsCharacter
+#{ f1<-function() 7; f2<-function(x) { sys.call() }; as.character(f2(f1())) }
+[1] "f2"   "f1()"
+
+##com.oracle.truffle.r.test.library.base.TestSimpleBuiltins.testAsCharacter
+#{ f1<-function(x) 7; f2<-function(y) { sys.call() }; as.character(f2(f1(42))) }
+[1] "f2"     "f1(42)"
+
 ##com.oracle.truffle.r.test.library.base.TestSimpleBuiltins.testAsCharacter
 #{ f<-function(x) { sys.call() }; as.character(f(7)) }
 [1] "f" "7"
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java
index e928e3469e..fdde461a0c 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleBuiltins.java
@@ -742,6 +742,9 @@ public class TestSimpleBuiltins extends TestBase {
 
         assertEval("{ x<-as.character(Sys.time()) }");
         assertEval("{ f<-function(x) { sys.call() }; as.character(f(7)) }");
+
+        assertEval("{ f1<-function() 7; f2<-function(x) { sys.call() }; as.character(f2(f1())) }");
+        assertEval("{ f1<-function(x) 7; f2<-function(y) { sys.call() }; as.character(f2(f1(42))) }");
     }
 
     @Test
-- 
GitLab