From 3c0a94e26118f7a965c3502d7fe2f3a9345a125e Mon Sep 17 00:00:00 2001
From: Prahlad Joshi <joshi18@bitbucket.org>
Date: Thu, 14 Aug 2014 20:46:02 -0400
Subject: [PATCH] Minor fixes.

---
 .../r/nodes/builtin/base/AsCharacter.java     |  1 +
 .../r/nodes/builtin/base/EncodeString.java    | 19 +++++++++++++++----
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java
index f2b2288083..67cc41df09 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/AsCharacter.java
@@ -131,6 +131,7 @@ public abstract class AsCharacter extends RBuiltinNode {
     public Object doObject(VirtualFrame frame, RAbstractVector vector) {
         controlVisibility();
         if (dcn == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             dcn = insert(DispatchedCallNode.create("as.character", RRuntime.USE_METHOD, this.getSuppliedArgsNames()));
         }
         try {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
index 2712f920c4..e63fb15f8b 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
@@ -13,6 +13,7 @@ package com.oracle.truffle.r.nodes.builtin.base;
 import com.oracle.truffle.api.CompilerDirectives.SlowPath;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.nodes.builtin.*;
 import com.oracle.truffle.r.nodes.unary.*;
@@ -32,6 +33,7 @@ public abstract class EncodeString extends RBuiltinNode {
     }
 
     private final NACheck na = NACheck.create();
+    private BranchProfile everSeenNA = new BranchProfile();
 
     @CreateCast("arguments")
     public RNode[] castArguments(RNode[] arguments) {
@@ -86,6 +88,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 if (quoteEl.isEmpty()) {
                     currentEl = concat("<", currentEl, ">");
                 }
@@ -106,6 +109,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = currentEl;
             } else {
                 result[i] = format(concat("%-", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
@@ -123,8 +127,9 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 if (quoteEl.isEmpty()) {
-                    currentEl = "<" + currentEl + ">";
+                    currentEl = concat("<", currentEl, ">");
                 }
                 result[i] = format(concat("%", maxElWidth, "s"), currentEl);
             } else {
@@ -143,6 +148,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = currentEl;
             } else {
                 result[i] = format(concat("%", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
@@ -164,6 +170,7 @@ public abstract class EncodeString extends RBuiltinNode {
             final String curEl = x.getDataAt(i);
             int totalPadding = padding - curEl.length();
             if (RRuntime.isNA(curEl)) {
+                everSeenNA.enter();
                 if (quoteEl.isEmpty()) {
                     // Accounting for <> in <NA>
                     totalPadding -= 2;
@@ -189,6 +196,7 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String curEl = x.getDataAt(i);
             if (RRuntime.isNA(curEl)) {
+                everSeenNA.enter();
                 result[i] = curEl;
             } else {
                 final int totalPadding = padding - curEl.length();
@@ -216,12 +224,13 @@ public abstract class EncodeString extends RBuiltinNode {
     }
 
     @SlowPath
-    private static String addPadding(final String el, final int leftPadding, final int rightPadding, final String quoteEl) {
+    private String addPadding(final String el, final int leftPadding, final int rightPadding, final String quoteEl) {
         final StringBuffer sb = new StringBuffer();
         for (int j = 0; j < leftPadding; ++j) {
             sb.append(" ");
         }
         if (RRuntime.isNA(el)) {
+            everSeenNA.enter();
             if (quoteEl.isEmpty()) {
                 sb.append("<");
                 sb.append(el);
@@ -248,9 +257,10 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = new String(currentEl);
             } else {
-                result[i] = quoteEl + currentEl + quoteEl;
+                result[i] = concat(quoteEl, currentEl, quoteEl);
             }
         }
         return RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR);
@@ -264,9 +274,10 @@ public abstract class EncodeString extends RBuiltinNode {
         for (int i = 0; i < x.getLength(); ++i) {
             final String currentEl = x.getDataAt(i);
             if (RRuntime.isNA(currentEl)) {
+                everSeenNA.enter();
                 result[i] = currentEl;
             } else {
-                result[i] = quoteEl + currentEl + quoteEl;
+                result[i] = concat(quoteEl, currentEl, quoteEl);
             }
         }
         return RDataFactory.createStringVector(result, na.neverSeenNA());
-- 
GitLab