2626
2727import com .oracle .truffle .api .dsl .Cached ;
2828import com .oracle .truffle .api .dsl .Fallback ;
29+ import com .oracle .truffle .api .dsl .ImportStatic ;
2930import com .oracle .truffle .api .dsl .Specialization ;
31+ import com .oracle .truffle .api .interop .TruffleObject ;
3032import com .oracle .truffle .api .object .DynamicObject ;
3133import com .oracle .truffle .api .profiles .BranchProfile ;
3234import com .oracle .truffle .api .profiles .LoopConditionProfile ;
4345import com .oracle .truffle .r .nodes .profile .VectorLengthProfile ;
4446import com .oracle .truffle .r .runtime .RError .Message ;
4547import com .oracle .truffle .r .runtime .RInternalError ;
48+ import com .oracle .truffle .r .runtime .RRuntime ;
4649import com .oracle .truffle .r .runtime .RType ;
4750import com .oracle .truffle .r .runtime .builtins .RBuiltin ;
4851import com .oracle .truffle .r .runtime .data .RDataFactory ;
5659import com .oracle .truffle .r .runtime .data .nodes .VectorAccess ;
5760import com .oracle .truffle .r .runtime .data .nodes .VectorAccess .RandomIterator ;
5861import com .oracle .truffle .r .runtime .data .nodes .VectorReuse ;
62+ import com .oracle .truffle .r .runtime .interop .ConvertForeignObjectNode ;
5963import 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 })
6267public 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 );
0 commit comments