diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java index dc6bab1f9142ce475c6ab6efb1bcb5504b9a4562..ac113eb0c847abb0ebd0b80aaeab2511bff714da 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java @@ -36,15 +36,16 @@ import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RComplexVector; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RList; -import com.oracle.truffle.r.runtime.data.RLogicalVector; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RRaw; -import com.oracle.truffle.r.runtime.data.RRawVector; -import com.oracle.truffle.r.runtime.data.RStringVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.ops.na.NACheck; import com.oracle.truffle.r.runtime.ops.na.NAProfile; @@ -168,12 +169,12 @@ public abstract class CastComplexNode extends CastBaseNode { } @Specialization - protected RComplexVector doLogicalVector(RLogicalVector operand) { + protected RComplexVector doLogicalVector(RAbstractLogicalVector operand) { return createResultVector(operand, index -> naCheck.convertLogicalToComplex(operand.getDataAt(index))); } @Specialization - protected RComplexVector doStringVector(RStringVector operand, + protected RComplexVector doStringVector(RAbstractStringVector operand, @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile) { naCheck.enable(operand); double[] ddata = new double[operand.getLength() << 1]; @@ -211,12 +212,12 @@ public abstract class CastComplexNode extends CastBaseNode { } @Specialization - protected RComplexVector doComplexVector(RComplexVector vector) { + protected RAbstractComplexVector doComplexVector(RAbstractComplexVector vector) { return vector; } @Specialization - protected RComplexVector doRawVector(RRawVector operand) { + protected RComplexVector doRawVector(RAbstractRawVector operand) { return createResultVector(operand, index -> RDataFactory.createComplex(operand.getRawDataAt(index), 0)); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java index ef5078d262fe5c861850108a366bd2f55e6c0f4b..f0dd71f992271cb472a238e484f40d7e127382ae 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java @@ -36,17 +36,17 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RComplex; -import com.oracle.truffle.r.runtime.data.RComplexVector; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RDoubleVector; import com.oracle.truffle.r.runtime.data.RList; -import com.oracle.truffle.r.runtime.data.RStringVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.interop.ForeignArray2R; @@ -123,7 +123,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { } @Specialization - protected RDoubleVector doStringVector(RStringVector operand, + protected RDoubleVector doStringVector(RAbstractStringVector operand, @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile, @Cached("create()") BranchProfile warningBranch) { naCheck.enable(operand); @@ -160,7 +160,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { } @Specialization - protected RDoubleVector doComplexVector(RComplexVector operand) { + protected RDoubleVector doComplexVector(RAbstractComplexVector operand) { naCheck.enable(operand); double[] ddata = new double[operand.getLength()]; boolean warning = false; @@ -223,16 +223,16 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { } @Specialization(guards = "isForeignObject(obj)") - protected RDoubleVector doForeignObject(TruffleObject obj, + protected RAbstractDoubleVector doForeignObject(TruffleObject obj, @Cached("create()") ForeignArray2R foreignArray2R) { Object o = foreignArray2R.convert(obj); if (!RRuntime.isForeignObject(o)) { - if (o instanceof RDoubleVector) { - return (RDoubleVector) o; + if (o instanceof RAbstractDoubleVector) { + return (RAbstractDoubleVector) o; } o = castDoubleRecursive(o); - if (o instanceof RDoubleVector) { - return (RDoubleVector) o; + if (o instanceof RAbstractDoubleVector) { + return (RAbstractDoubleVector) o; } } throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector"); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java index 940f8c673b9682366058a3a879260542be90f4ae..558b86015a62ecafe6edd553d551a195b6c51108 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java @@ -231,16 +231,16 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { } @Specialization(guards = "isForeignObject(obj)") - protected RIntVector doForeignObject(TruffleObject obj, + protected RAbstractIntVector doForeignObject(TruffleObject obj, @Cached("create()") ForeignArray2R foreignArray2R) { Object o = foreignArray2R.convert(obj); if (!RRuntime.isForeignObject(o)) { - if (o instanceof RIntVector) { - return (RIntVector) o; + if (o instanceof RAbstractIntVector) { + return (RAbstractIntVector) o; } o = castIntegerRecursive(o); - if (o instanceof RIntVector) { - return (RIntVector) o; + if (o instanceof RAbstractIntVector) { + return (RAbstractIntVector) o; } } throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector"); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java index 1d734075f147b55cb99371fe8d2405b1568f6870..17b784f1b10aa500aa9c300a8a0273c31ef53a35 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java @@ -32,17 +32,18 @@ import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.r.nodes.helpers.InheritsCheckNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; -import com.oracle.truffle.r.runtime.data.RComplexVector; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RLogicalVector; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; -import com.oracle.truffle.r.runtime.data.RRawVector; -import com.oracle.truffle.r.runtime.data.RStringVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.interop.ForeignArray2R; import com.oracle.truffle.r.runtime.ops.na.NAProfile; @@ -111,7 +112,7 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode { } @Specialization - protected RLogicalVector doLogicalVector(RLogicalVector operand) { + protected RAbstractLogicalVector doLogicalVector(RAbstractLogicalVector operand) { return operand; } @@ -133,17 +134,17 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode { } @Specialization - protected RLogicalVector doStringVector(RStringVector operand) { + protected RLogicalVector doStringVector(RAbstractStringVector operand) { return createResultVector(operand, index -> naCheck.convertStringToLogical(operand.getDataAt(index))); } @Specialization - protected RLogicalVector doComplexVector(RComplexVector operand) { + protected RLogicalVector doComplexVector(RAbstractComplexVector operand) { return createResultVector(operand, index -> naCheck.convertComplexToLogical(operand.getDataAt(index))); } @Specialization - protected RLogicalVector doRawVectorDims(RRawVector operand) { + protected RLogicalVector doRawVectorDims(RAbstractRawVector operand) { return createResultVector(operand, index -> RRuntime.raw2logical(operand.getRawDataAt(index))); } @@ -193,16 +194,16 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode { } @Specialization(guards = "isForeignObject(obj)") - protected RLogicalVector doForeignObject(TruffleObject obj, + protected RAbstractLogicalVector doForeignObject(TruffleObject obj, @Cached("create()") ForeignArray2R foreignArray2R) { Object o = foreignArray2R.convert(obj); if (!RRuntime.isForeignObject(o)) { - if (o instanceof RLogicalVector) { - return (RLogicalVector) o; + if (o instanceof RAbstractLogicalVector) { + return (RAbstractLogicalVector) o; } o = castLogicalRecursive(o); if (o instanceof RLogicalVector) { - return (RLogicalVector) o; + return (RAbstractLogicalVector) o; } } throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector"); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java index 44b0149e20f5b7a5f4ccdaa3dc216fadb01a3d16..541bb6d9a250ce1a4691b07c386a8fcb5a4c7279 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java @@ -31,17 +31,18 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RComplex; -import com.oracle.truffle.r.runtime.data.RComplexVector; import com.oracle.truffle.r.runtime.data.RDataFactory; -import com.oracle.truffle.r.runtime.data.RLogicalVector; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RRaw; import com.oracle.truffle.r.runtime.data.RRawVector; -import com.oracle.truffle.r.runtime.data.RStringVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.ops.na.NACheck; import com.oracle.truffle.r.runtime.ops.na.NAProfile; @@ -185,7 +186,7 @@ public abstract class CastRawNode extends CastBaseNode { } @Specialization - protected RRawVector doLogicalVector(RLogicalVector operand) { + protected RRawVector doLogicalVector(RAbstractLogicalVector operand) { byte[] bdata = new byte[operand.getLength()]; boolean warning = false; for (int i = 0; i < operand.getLength(); i++) { @@ -205,7 +206,7 @@ public abstract class CastRawNode extends CastBaseNode { } @Specialization - protected RRawVector doStringVector(RStringVector operand, + protected RRawVector doStringVector(RAbstractStringVector operand, @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile, @Cached("create()") NAProfile naProfile) { naCheck.enable(operand); @@ -245,7 +246,7 @@ public abstract class CastRawNode extends CastBaseNode { } @Specialization - protected RRawVector doComplexVector(RComplexVector operand) { + protected RRawVector doComplexVector(RAbstractComplexVector operand) { byte[] bdata = new byte[operand.getLength()]; boolean imaginaryDiscardedWarning = false; boolean outOfRangeWarning = false; @@ -294,7 +295,7 @@ public abstract class CastRawNode extends CastBaseNode { } @Specialization - protected RRawVector doRawVector(RRawVector operand) { + protected RAbstractRawVector doRawVector(RAbstractRawVector operand) { return operand; } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java index b9406a1420f983e85e9545d369f3bf3448008a30..8210498a21ccb4f7a9af213c0b3572419b7494a0 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java @@ -39,6 +39,7 @@ import com.oracle.truffle.r.runtime.data.RStringSequence; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.interop.ForeignArray2R; @ImportStatic(RRuntime.class) @@ -76,12 +77,7 @@ public abstract class CastStringNode extends CastStringBaseNode { } @Specialization - protected RStringVector doStringVector(RStringVector vector) { - return vector; - } - - @Specialization - protected RStringSequence doStringSequence(RStringSequence vector) { + protected RAbstractStringVector doStringVector(RAbstractStringVector vector) { return vector; } @@ -90,7 +86,7 @@ public abstract class CastStringNode extends CastStringBaseNode { return RDataFactory.createStringSequence("", "", vector.getStart(), vector.getStride(), vector.getLength()); } - @Specialization(guards = "!isIntSequence(operandIn)") + @Specialization(guards = {"!isIntSequence(operandIn)", "!isRAbstractStringVector(operandIn)"}) protected RStringVector doAbstractContainer(RAbstractContainer operandIn, @Cached("createClassProfile()") ValueProfile operandProfile, @Cached("createBinaryProfile()") ConditionProfile isLanguageProfile) { @@ -109,16 +105,16 @@ public abstract class CastStringNode extends CastStringBaseNode { } @Specialization(guards = "isForeignObject(obj)") - protected RStringVector doForeignObject(TruffleObject obj, + protected RAbstractStringVector doForeignObject(TruffleObject obj, @Cached("create()") ForeignArray2R foreignArray2R) { Object o = foreignArray2R.convert(obj); if (!RRuntime.isForeignObject(o)) { - if (o instanceof RStringVector) { - return (RStringVector) o; + if (o instanceof RAbstractStringVector) { + return (RAbstractStringVector) o; } o = castStringRecursive(o); - if (o instanceof RStringVector) { - return (RStringVector) o; + if (o instanceof RAbstractStringVector) { + return (RAbstractStringVector) o; } } throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector"); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java index 6f2ac0b11545308c569f3c75100fe53711471cc0..b5118c475f6dfa08389c85de58cb8a28559dd8f0 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java @@ -33,13 +33,9 @@ import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RDataFactory; -import com.oracle.truffle.r.runtime.data.RDoubleVector; -import com.oracle.truffle.r.runtime.data.RIntVector; import com.oracle.truffle.r.runtime.data.RList; -import com.oracle.truffle.r.runtime.data.RLogicalVector; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RRaw; -import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java index 0541c5523b79038b7dbd6c335f7e281640464bd9..2a75ee21d7cae46891d7614233774f9b64700679 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java @@ -32,14 +32,11 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.r.runtime.RError; -import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RLogical; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RRaw; -import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector; -import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.data.nodes.VectorAccess; import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java index 56dc34d4db19974a05fd5699b85fae7d41d12076..12dd537fa27f2ddbc65cb756e78e49948a3bee82 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java @@ -40,32 +40,21 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; -import com.oracle.truffle.r.runtime.data.RComplex; -import com.oracle.truffle.r.runtime.data.RComplexVector; -import com.oracle.truffle.r.runtime.data.RDoubleSequence; -import com.oracle.truffle.r.runtime.data.RDoubleVector; import com.oracle.truffle.r.runtime.data.RExpression; +import com.oracle.truffle.r.runtime.data.RForeignListWrapper; import com.oracle.truffle.r.runtime.data.RFunction; -import com.oracle.truffle.r.runtime.data.RIntSequence; -import com.oracle.truffle.r.runtime.data.RIntVector; import com.oracle.truffle.r.runtime.data.RInteropScalar; import com.oracle.truffle.r.runtime.data.RLanguage; import com.oracle.truffle.r.runtime.data.RList; -import com.oracle.truffle.r.runtime.data.RLogical; -import com.oracle.truffle.r.runtime.data.RLogicalVector; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RPairList; -import com.oracle.truffle.r.runtime.data.RRaw; -import com.oracle.truffle.r.runtime.data.RRawVector; import com.oracle.truffle.r.runtime.data.RS4Object; -import com.oracle.truffle.r.runtime.data.RString; -import com.oracle.truffle.r.runtime.data.RStringSequence; -import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector; import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; @@ -170,6 +159,16 @@ public abstract class PrecedenceNode extends RBaseNode { @Specialization(guards = "recursive") protected int doListRecursive(RList val, boolean recursive, @Cached("createRecursive()") PrecedenceNode precedenceNode) { + return doListRecursiveInternal(val, precedenceNode, recursive); + } + + @Specialization(guards = "recursive") + protected int doListRecursive(RForeignListWrapper val, boolean recursive, + @Cached("createRecursive()") PrecedenceNode precedenceNode) { + return doListRecursiveInternal(val, precedenceNode, recursive); + } + + private int doListRecursiveInternal(RAbstractListVector val, PrecedenceNode precedenceNode, boolean recursive) { int precedence = -1; for (int i = 0; i < val.getLength(); i++) { precedence = Math.max(precedence, precedenceNode.executeInteger(val.getDataAt(i), recursive)); @@ -197,6 +196,12 @@ public abstract class PrecedenceNode extends RBaseNode { return LIST_PRECEDENCE; } + @Specialization(guards = "!recursive") + @SuppressWarnings("unused") + protected int doList(RForeignListWrapper val, boolean recursive) { + return LIST_PRECEDENCE; + } + @Specialization(guards = "!recursive") @SuppressWarnings("unused") protected int doPairList(RPairList val, boolean recursive) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java index 7230d7b17e60bd571680b3792d0dc235d8562e0c..aa040654c312bf5aa981c0cdd1f243a10227ec25 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java @@ -35,13 +35,13 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RComplex; -import com.oracle.truffle.r.runtime.data.RComplexVector; import com.oracle.truffle.r.runtime.data.RNull; -import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RTypes; +import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.data.nodes.VectorAccess; import com.oracle.truffle.r.runtime.interop.ForeignArray2R; @@ -318,7 +318,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode { } @Specialization(guards = "supportComplex") - protected RComplex doComplexVector(RComplexVector operand, boolean naRm, @SuppressWarnings("unused") boolean finite) { + protected RComplex doComplexVector(RAbstractComplexVector operand, boolean naRm, @SuppressWarnings("unused") boolean finite) { RBaseNode.reportWork(this, operand.getLength()); boolean profiledNaRm = naRmProfile.profile(naRm); RComplex result = RRuntime.double2complex(semantics.getDoubleStart()); @@ -348,7 +348,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode { // "largest" String for the implementation of max function @Specialization(guards = {"supportString", "operand.getLength() == 0"}) - protected String doStringVectorEmpty(@SuppressWarnings("unused") RStringVector operand, @SuppressWarnings("unused") boolean naRm, @SuppressWarnings("unused") boolean finite) { + protected String doStringVectorEmpty(@SuppressWarnings("unused") RAbstractStringVector operand, @SuppressWarnings("unused") boolean naRm, @SuppressWarnings("unused") boolean finite) { if (semantics.getEmptyWarning() != null) { warning(semantics.emptyWarningCharacter); } @@ -356,7 +356,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode { } @Specialization(guards = {"supportString", "operand.getLength() == 1"}) - protected String doStringVectorOneElem(RStringVector operand, boolean naRm, boolean finite) { + protected String doStringVectorOneElem(RAbstractStringVector operand, boolean naRm, boolean finite) { boolean profiledNaRm = naRmProfile.profile(naRm); String result = operand.getDataAt(0); if (profiledNaRm) { @@ -369,7 +369,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode { } @Specialization(guards = {"supportString", "operand.getLength() > 1"}) - protected String doStringVector(RStringVector operand, boolean naRm, boolean finite) { + protected String doStringVector(RAbstractStringVector operand, boolean naRm, boolean finite) { boolean profiledNaRm = naRmProfile.profile(naRm); na.enable(operand); int offset = 0; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java index 36fece25f3205667f6fae6080373c2bb3e06e2ce..9521784271a54374386519a4189ef224c0870c90 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java @@ -32,6 +32,7 @@ import com.oracle.truffle.api.object.DynamicObject; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.interop.ForeignArray2R; public abstract class RForeignWrapper implements RAbstractVector { @@ -61,12 +62,12 @@ public abstract class RForeignWrapper implements RAbstractVector { @Override public final boolean isComplete() { - return true; + return false; } @Override public final void setComplete(boolean complete) { - // sequences are always complete + // we will not make any assumptions about the delegate Truffle Object } @Override diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java index 43bffb637f5f30e311b4d1be0b663c15ddab6921..a689e54bdff5cc7a2d909f83521deb636a6679c4 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java @@ -99,45 +99,43 @@ public abstract class ForeignArray2R extends RBaseNode { * */ public Object convert(Object obj, boolean recursive) { - if (FastROptions.ForeignObjectWrappers.getBooleanValue()) { - if (isForeignArray(obj)) { - TruffleObject truffleObject = (TruffleObject) obj; - try { - int size = (int) ForeignAccess.sendGetSize(getSize, truffleObject); - if (size == 0) { - return new RForeignListWrapper(truffleObject); - } else { - Object firstElement = ForeignAccess.sendRead(read, truffleObject, 0); - switch (InteropTypeCheck.determineType(firstElement)) { - case BOOLEAN: - return new RForeignBooleanWrapper(truffleObject); - case DOUBLE: - return new RForeignDoubleWrapper(truffleObject); - case INTEGER: - return new RForeignIntWrapper(truffleObject); - case STRING: - return new RForeignStringWrapper(truffleObject); - default: - return new RForeignListWrapper(truffleObject); - } + if (FastROptions.ForeignObjectWrappers.getBooleanValue() && isForeignArray(obj)) { + TruffleObject truffleObject = (TruffleObject) obj; + try { + int size = (int) ForeignAccess.sendGetSize(getSize, truffleObject); + if (size == 0) { + return new RForeignListWrapper(truffleObject); + } else { + Object firstElement = ForeignAccess.sendRead(read, truffleObject, 0); + if (isForeignArray(firstElement)) { + throw error(RError.Message.GENERIC, "Wrapping of multi-dim arrays not supported."); + } + switch (InteropTypeCheck.determineType(firstElement)) { + case BOOLEAN: + return new RForeignBooleanWrapper(truffleObject); + case DOUBLE: + return new RForeignDoubleWrapper(truffleObject); + case INTEGER: + return new RForeignIntWrapper(truffleObject); + case STRING: + return new RForeignStringWrapper(truffleObject); + default: + return new RForeignListWrapper(truffleObject); } - } catch (UnsupportedMessageException | UnknownIdentifierException e) { - throw RInternalError.shouldNotReachHere(e); } - } else { - return obj; + } catch (UnsupportedMessageException | UnknownIdentifierException e) { + throw RInternalError.shouldNotReachHere(e); } - } else { - Object result = execute(obj, recursive, null, 0); - if (result instanceof ForeignArrayData) { - ForeignArrayData arrayData = (ForeignArrayData) result; - if (arrayData.elements.isEmpty()) { - return RDataFactory.createList(); - } - return asAbstractVector(arrayData); + } + Object result = execute(obj, recursive, null, 0); + if (result instanceof ForeignArrayData) { + ForeignArrayData arrayData = (ForeignArrayData) result; + if (arrayData.elements.isEmpty()) { + return RDataFactory.createList(); } - return result; + return asAbstractVector(arrayData); } + return result; } protected abstract Object execute(Object obj, boolean recursive, ForeignArrayData arrayData, int depth); 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 cc7e4e4fea9a0a6c3a0e75245573104b2bb8a1ae..57a4818c80ba9f64ec2ff5741afe8e9c7fda50e0 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 @@ -141637,6 +141637,114 @@ NULL [external object] [1] 1 2 3 +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list('a', NULL, 'c') } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$charObjectArrayWithNull) } +[[1]] +[1] "a" + +[[2]] +NULL + +[[3]] +[1] "c" + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list('a', NULL, 'c') } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$stringArrayWithNull) } +[[1]] +[1] "a" + +[[2]] +NULL + +[[3]] +[1] "c" + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list(1, NULL, 3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$byteObjectArrayWithNull) } +[[1]] +[1] 1 + +[[2]] +NULL + +[[3]] +[1] 3 + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list(1, NULL, 3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$longObjectArrayWithNull) } +[[1]] +[1] 1 + +[[2]] +NULL + +[[3]] +[1] 3 + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list(1.1, NULL, 1.3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$doubleObjectArrayWithNull) } +[[1]] +[1] 1.1 + +[[2]] +NULL + +[[3]] +[1] 1.3 + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list(1.1, NULL, 1.3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$floatObjectArrayWithNull) } +[[1]] +[1] 1.1 + +[[2]] +NULL + +[[3]] +[1] 1.3 + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list(1L, NULL, 3L) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$integerObjectArrayWithNull) } +[[1]] +[1] 1 + +[[2]] +NULL + +[[3]] +[1] 3 + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list(1L, NULL, 3L) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$shortObjectArrayWithNull) } +[[1]] +[1] 1 + +[[2]] +NULL + +[[3]] +[1] 3 + + +##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion# +#if (!any(R.version$engine == "FastR")) { list(T, NULL, T) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$booleanObjectArrayWithNull) } +[[1]] +[1] TRUE + +[[2]] +NULL + +[[3]] +[1] TRUE + + ##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testAsList# #if (!any(R.version$engine == "FastR")) { 'a' } else { to <- new.external(new.java.class('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestClass')); l<-as.list(to$arrayObject); l[[1]]$data } [1] "a" diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java index 23b4808a091a254bddc3bbeec0e9e575bf1a2d05..71b89793172a4d91a5923a661260dc8bea015be4 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java @@ -1105,6 +1105,19 @@ public class TestJavaInterop extends TestBase { assertEvalFastR(CREATE_TEST_ARRAYS + " ifelse(ta$stringList, 1, 2)", "c(NA, NA, NA)"); } + @Test + public void testArraysWithNullConversion() throws IllegalArgumentException { + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$booleanObjectArrayWithNull)", "list(T, NULL, T)"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$byteObjectArrayWithNull)", "list(1, NULL, 3)"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$charObjectArrayWithNull)", "list('a', NULL, 'c')"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$doubleObjectArrayWithNull)", "list(1.1, NULL, 1.3)"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$floatObjectArrayWithNull)", "list(1.1, NULL, 1.3)"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$integerObjectArrayWithNull)", "list(1L, NULL, 3L)"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$longObjectArrayWithNull)", "list(1, NULL, 3)"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$shortObjectArrayWithNull)", "list(1L, NULL, 3L)"); + assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$stringArrayWithNull)", "list('a', NULL, 'c')"); + } + @Test public void testForeignVectorArithmeticOp() throws NoSuchFieldException, IllegalAccessException { @@ -2216,38 +2229,47 @@ public class TestJavaInterop extends TestBase { public Boolean[] booleanObjectArray = {true, false, true}; public Boolean[][] booleanObjectArray2 = {{true, false, true}, {true, false, true}}; public Boolean[][][] booleanObjectArray3 = {{{true, false, true}, {true, false, true}}, {{true, false, true}, {true, false, true}}}; + public Boolean[] booleanObjectArrayWithNull = {true, null, true}; public Byte[] byteObjectArray = {1, 2, 3}; public Byte[][] byteObjectArray2 = {{1, 2, 3}, {1, 2, 3}}; public Byte[][][] byteObjectArray3 = {{{1, 2, 3}, {1, 2, 3}}, {{1, 2, 3}, {1, 2, 3}}}; + public Byte[] byteObjectArrayWithNull = {1, null, 3}; public Character[] charObjectArray = {'a', 'b', 'c'}; public Character[][] charObjectArray2 = {{'a', 'b', 'c'}, {'a', 'b', 'c'}}; public Character[][][] charObjectArray3 = {{{'a', 'b', 'c'}, {'a', 'b', 'c'}}, {{'a', 'b', 'c'}, {'a', 'b', 'c'}}}; + public Character[] charObjectArrayWithNull = {'a', null, 'c'}; public Double[] doubleObjectArray = {1.1, 1.2, 1.3}; public Double[][] doubleObjectArray2 = {{1.1, 1.2, 1.3}, {1.1, 1.2, 1.3}}; public Double[][][] doubleObjectArray3 = {{{1.1, 1.2, 1.3}, {1.1, 1.2, 1.3}}, {{1.1, 1.2, 1.3}, {1.1, 1.2, 1.3}}}; + public Double[] doubleObjectArrayWithNull = {1.1, null, 1.3}; public Float[] floatObjectArray = {1.1f, 1.2f, 1.3f}; public Float[][] floatObjectArray2 = {{1.1f, 1.2f, 1.3f}, {1.1f, 1.2f, 1.3f}}; public Float[][][] floatObjectArray3 = {{{1.1f, 1.2f, 1.3f}, {1.1f, 1.2f, 1.3f}}, {{1.1f, 1.2f, 1.3f}, {1.1f, 1.2f, 1.3f}}}; + public Float[] floatObjectArrayWithNull = {1.1f, null, 1.3f}; public Integer[] integerObjectArray = {1, 2, 3}; public Integer[][] integerObjectArray2 = {{1, 2, 3}, {1, 2, 3}}; public Integer[][][] integerObjectArray3 = {{{1, 2, 3}, {1, 2, 3}}, {{1, 2, 3}, {1, 2, 3}}}; + public Integer[] integerObjectArrayWithNull = {1, null, 3}; public Long[] longObjectArray = {1L, 2L, 3L}; public Long[][] longObjectArray2 = {{1L, 2L, 3L}, {1L, 2L, 3L}}; public Long[][][] longObjectArray3 = {{{1L, 2L, 3L}, {1L, 2L, 3L}}, {{1L, 2L, 3L}, {1L, 2L, 3L}}}; + public Long[] longObjectArrayWithNull = {1L, null, 3L}; public Short[] shortObjectArray = {1, 2, 3}; public Short[][] shortObjectArray2 = {{1, 2, 3}, {1, 2, 3}}; public Short[][][] shortObjectArray3 = {{{1, 2, 3}, {1, 2, 3}}, {{1, 2, 3}, {1, 2, 3}}}; + public Short[] shortObjectArrayWithNull = {1, null, 3}; public String[] stringArray = {"a", "b", "c"}; public String[][] stringArray2 = {{"a", "b", "c"}, {"a", "b", "c"}}; public String[][][] stringArray3 = {{{"a", "b", "c"}, {"a", "b", "c"}}, {{"a", "b", "c"}, {"a", "b", "c"}}}; + public String[] stringArrayWithNull = {"a", null, "c"}; public Object[] onlyIntegerObjectArray = {1, 2, 3}; public Object[] onlyLongObjectArray = {1L, 2L, 3L};