Skip to content

Commit 38868ab

Browse files
committed
handle foreign objects in transpose
1 parent 3fc233e commit 38868ab

File tree

2 files changed

+27
-0
lines changed
  • com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base
  • com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr

2 files changed

+27
-0
lines changed

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626

2727
import com.oracle.truffle.api.dsl.Cached;
2828
import com.oracle.truffle.api.dsl.Fallback;
29+
import com.oracle.truffle.api.dsl.ImportStatic;
2930
import com.oracle.truffle.api.dsl.Specialization;
31+
import com.oracle.truffle.api.interop.TruffleObject;
3032
import com.oracle.truffle.api.object.DynamicObject;
3133
import com.oracle.truffle.api.profiles.BranchProfile;
3234
import com.oracle.truffle.api.profiles.LoopConditionProfile;
@@ -43,6 +45,7 @@
4345
import com.oracle.truffle.r.nodes.profile.VectorLengthProfile;
4446
import com.oracle.truffle.r.runtime.RError.Message;
4547
import com.oracle.truffle.r.runtime.RInternalError;
48+
import com.oracle.truffle.r.runtime.RRuntime;
4649
import com.oracle.truffle.r.runtime.RType;
4750
import com.oracle.truffle.r.runtime.builtins.RBuiltin;
4851
import com.oracle.truffle.r.runtime.data.RDataFactory;
@@ -56,9 +59,11 @@
5659
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
5760
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.RandomIterator;
5861
import com.oracle.truffle.r.runtime.data.nodes.VectorReuse;
62+
import com.oracle.truffle.r.runtime.interop.ConvertForeignObjectNode;
5963
import com.oracle.truffle.r.runtime.nodes.RBaseNode;
6064

6165
@RBuiltin(name = "t.default", kind = INTERNAL, parameterNames = {"x"}, behavior = PURE)
66+
@ImportStatic({RRuntime.class, ConvertForeignObjectNode.class})
6267
public abstract class Transpose extends RBuiltinNode.Arg1 {
6368

6469
private final BranchProfile hasDimNamesProfile = BranchProfile.create();
@@ -80,6 +85,10 @@ public abstract class Transpose extends RBuiltinNode.Arg1 {
8085
Casts.noCasts(Transpose.class);
8186
}
8287

88+
protected static Transpose create() {
89+
return TransposeNodeGen.create();
90+
}
91+
8392
public abstract Object execute(RAbstractVector o);
8493

8594
protected boolean isSquare(RAbstractVector vector) {
@@ -274,6 +283,17 @@ private void convertNamesToDimnames(RAbstractVector source, RAbstractVector dest
274283
}
275284
}
276285

286+
@Specialization(guards = {"isForeignObject(x)"})
287+
protected Object transposeForeign(TruffleObject x,
288+
@Cached("create()") ConvertForeignObjectNode convertForeign,
289+
@Cached("create()") Transpose recursive) {
290+
if (convertForeign.isForeignArray(x)) {
291+
RAbstractVector vec = (RAbstractVector) convertForeign.convert(x);
292+
return recursive.execute(vec);
293+
}
294+
throw error(Message.ARGUMENT_NOT_MATRIX);
295+
}
296+
277297
@Fallback
278298
protected RVector<?> transpose(@SuppressWarnings("unused") Object x) {
279299
throw error(Message.ARGUMENT_NOT_MATRIX);

com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,13 @@ public void testIdentical() {
656656
assertEvalFastR("b1 <- .fastr.interop.asByte(1); s1 <- .fastr.interop.asShort(1); identical(b1, s1)", "FALSE");
657657
}
658658

659+
@Test
660+
public void testTranspose() {
661+
assertEvalFastR(CREATE_TEST_ARRAYS + " t(ta$stringArray)", "t(c('a', 'b', 'c'))");
662+
assertEvalFastR(CREATE_TEST_ARRAYS + " t(ta$stringArray2)", "t(matrix(c('a', 'a', 'b', 'b', 'c', 'c'), c(2, 3)))");
663+
assertEvalFastR(CREATE_TEST_ARRAYS + " t(ta)", errorIn("t.default(ta)", "argument is not a matrix"));
664+
}
665+
659666
@Test
660667
public void testAsVectorFromArray() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
661668
testAsVectorFromArray("fieldStaticBooleanArray", "logical");

0 commit comments

Comments
 (0)