Skip to content
Snippets Groups Projects
Commit 27456f17 authored by Lukas Stadler's avatar Lukas Stadler
Browse files

fix gettext builtin (remove remnants from SUBSTITUTE implementation)

parent 710a4e1e
Branches
No related tags found
No related merge requests found
...@@ -24,69 +24,29 @@ package com.oracle.truffle.r.nodes.builtin.base; ...@@ -24,69 +24,29 @@ package com.oracle.truffle.r.nodes.builtin.base;
import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; 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.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.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.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.RNull;
import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
import com.oracle.truffle.r.runtime.ops.na.NACheck;
@SuppressWarnings("unused") @RBuiltin(name = "gettext", kind = INTERNAL, parameterNames = {"domain", "args"})
@RBuiltin(name = "gettext", kind = INTERNAL, parameterNames = {"...", "domain"})
public abstract class GetText extends RBuiltinNode { public abstract class GetText extends RBuiltinNode {
@Child private CastToVectorNode castVector; @Override
@Child private CastStringNode castString; protected void createCasts(CastBuilder casts) {
casts.arg("domain").asStringVector().findFirst("");
private final NACheck elementNACheck = NACheck.create(); casts.arg("args").asStringVector();
private Object castString(Object operand) {
if (castString == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
castString = insert(CastStringNodeGen.create(false, true, false, false));
}
return castString.execute(operand);
} }
private Object castVector(Object value) { @Specialization
if (castVector == null) { protected RAbstractStringVector getText(@SuppressWarnings("unused") String domain, RAbstractStringVector texts) {
CompilerDirectives.transferToInterpreterAndInvalidate(); return texts;
castVector = insert(CastToVectorNodeGen.create(false));
}
return castVector.execute(value);
} }
@Specialization @Specialization
protected RStringVector getText(RArgsValuesAndNames varargs, Object domain) { protected RNull getText(@SuppressWarnings("unused") String domain, RNull texts) {
Object[] argValues = varargs.getArguments(); return texts;
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());
} }
} }
...@@ -20410,6 +20410,14 @@ list() ...@@ -20410,6 +20410,14 @@ list()
[1] FALSE [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 ##com.oracle.truffle.r.test.builtins.TestBuiltin_gettext.testgettext1
#argv <- list(NULL, 'Loading required package: %s'); .Internal(gettext(argv[[1]], argv[[2]])) #argv <- list(NULL, 'Loading required package: %s'); .Internal(gettext(argv[[1]], argv[[2]]))
[1] "Loading required package: %s" [1] "Loading required package: %s"
...@@ -44,6 +44,12 @@ public class TestBuiltin_gettext extends TestBase { ...@@ -44,6 +44,12 @@ public class TestBuiltin_gettext extends TestBase {
@Test @Test
public void testgettext6() { 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')");
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment