From 27456f17548949afb8a5e4b6fcf422059ebbdec3 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Fri, 15 Jul 2016 10:11:16 +0200
Subject: [PATCH] fix gettext builtin (remove remnants from SUBSTITUTE
 implementation)

---
 .../truffle/r/nodes/builtin/base/GetText.java | 64 ++++---------------
 .../truffle/r/test/ExpectedTestOutput.test    |  8 +++
 .../r/test/builtins/TestBuiltin_gettext.java  |  8 ++-
 3 files changed, 27 insertions(+), 53 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GetText.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GetText.java
index a10b07fcea..6c760541d6 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GetText.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GetText.java
@@ -24,69 +24,29 @@ package com.oracle.truffle.r.nodes.builtin.base;
 
 import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL;
 
-import java.util.Arrays;
-
-import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.dsl.Specialization;
+import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
-import com.oracle.truffle.r.nodes.unary.CastStringNode;
-import com.oracle.truffle.r.nodes.unary.CastStringNodeGen;
-import com.oracle.truffle.r.nodes.unary.CastToVectorNode;
-import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen;
 import com.oracle.truffle.r.runtime.RBuiltin;
-import com.oracle.truffle.r.runtime.Utils;
-import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.RStringVector;
-import com.oracle.truffle.r.runtime.ops.na.NACheck;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 
-@SuppressWarnings("unused")
-@RBuiltin(name = "gettext", kind = INTERNAL, parameterNames = {"...", "domain"})
+@RBuiltin(name = "gettext", kind = INTERNAL, parameterNames = {"domain", "args"})
 public abstract class GetText extends RBuiltinNode {
 
-    @Child private CastToVectorNode castVector;
-    @Child private CastStringNode castString;
-
-    private final NACheck elementNACheck = NACheck.create();
-
-    private Object castString(Object operand) {
-        if (castString == null) {
-            CompilerDirectives.transferToInterpreterAndInvalidate();
-            castString = insert(CastStringNodeGen.create(false, true, false, false));
-        }
-        return castString.execute(operand);
+    @Override
+    protected void createCasts(CastBuilder casts) {
+        casts.arg("domain").asStringVector().findFirst("");
+        casts.arg("args").asStringVector();
     }
 
-    private Object castVector(Object value) {
-        if (castVector == null) {
-            CompilerDirectives.transferToInterpreterAndInvalidate();
-            castVector = insert(CastToVectorNodeGen.create(false));
-        }
-        return castVector.execute(value);
+    @Specialization
+    protected RAbstractStringVector getText(@SuppressWarnings("unused") String domain, RAbstractStringVector texts) {
+        return texts;
     }
 
     @Specialization
-    protected RStringVector getText(RArgsValuesAndNames varargs, Object domain) {
-        Object[] argValues = varargs.getArguments();
-        String[] a = new String[0];
-        int aLength = 0;
-        int index = 0;
-        for (int i = 0; i < argValues.length; i++) {
-            Object v = castVector(argValues[i]);
-            if (v != RNull.instance) {
-                RStringVector vector = (RStringVector) castString(v);
-                elementNACheck.enable(vector);
-                aLength += vector.getLength();
-                a = Utils.resizeArray(a, Math.max(aLength, a.length * 2));
-                for (int j = 0; j < vector.getLength(); j++) {
-                    a[index] = vector.getDataAt(j);
-                    elementNACheck.check(a[index]);
-                    index++;
-                }
-            }
-        }
-
-        return RDataFactory.createStringVector(a.length == aLength ? a : Arrays.copyOf(a, aLength), elementNACheck.neverSeenNA());
+    protected RNull getText(@SuppressWarnings("unused") String domain, RNull texts) {
+        return texts;
     }
 }
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 d0cf9c52f5..38817e3019 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
@@ -20410,6 +20410,14 @@ list()
 [1] FALSE
 
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_gettext.testgettext
+#gettext('Loading required package: %s')
+[1] "Loading required package: %s"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_gettext.testgettext
+#gettext(domain='foo', 'bar')
+[1] "bar"
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_gettext.testgettext1
 #argv <- list(NULL, 'Loading required package: %s'); .Internal(gettext(argv[[1]], argv[[2]]))
 [1] "Loading required package: %s"
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gettext.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gettext.java
index acaf7cf063..dd9e60ad11 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gettext.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gettext.java
@@ -44,6 +44,12 @@ public class TestBuiltin_gettext extends TestBase {
 
     @Test
     public void testgettext6() {
-        assertEval(Ignored.Unknown, "argv <- list(NULL, NULL); .Internal(gettext(argv[[1]], argv[[2]]))");
+        assertEval("argv <- list(NULL, NULL); .Internal(gettext(argv[[1]], argv[[2]]))");
+    }
+
+    @Test
+    public void testgettext() {
+        assertEval("gettext('Loading required package: %s')");
+        assertEval("gettext(domain='foo', 'bar')");
     }
 }
-- 
GitLab