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 a10b07fcea151125b4ad0143c1b94dd937906a3a..6c760541d6afbb78f8937eca0b1c86c31b78ec53 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 d0cf9c52f50523c4590ae8f06e1b49487032207e..38817e301918a7be493ac5d4f888e9c5468874e2 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 acaf7cf063366fa5d427f8e9c5c3ace329d87d69..dd9e60ad1156b241c4d7a3e81a20b113db8cacf2 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')"); } }