diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java index 07fcb565e5998e170f8b9b14f2c090420c987939..de2e5bbf2115c9bd446875a389babefdde09f7d6 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java @@ -36,6 +36,7 @@ import com.oracle.truffle.r.nodes.unary.*; import com.oracle.truffle.r.runtime.*; import com.oracle.truffle.r.runtime.data.*; import com.oracle.truffle.r.runtime.data.model.*; +import com.oracle.truffle.r.runtime.env.*; import com.oracle.truffle.r.runtime.ops.na.*; abstract class ArrayPositionsCastBase extends RNode { @@ -142,6 +143,11 @@ public abstract class ArrayPositionCast extends ArrayPositionsCastBase { return operand; } + @Specialization + protected Object doEnvOp(REnvironment vector, Object operand) { + return operand; + } + @Specialization protected Object doMissingVector(VirtualFrame frame, RAbstractContainer container, RMissing operand) { int[] dimensions = getDimensions(container); @@ -376,6 +382,11 @@ public abstract class ArrayPositionCast extends ArrayPositionsCastBase { return operand; } + @Specialization + protected Object doEnvOp(REnvironment vector, Object operand, Object exact) { + return operand; + } + @Specialization protected int doFactor(RNull vector, RFactor operand, Object exact) { return 0; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java index 7803a01e6e850ff0a346d61386f2f75d3dce0409..f5ade96a1d87cd0132c310851df20137c9e341ae 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java @@ -1689,6 +1689,21 @@ public abstract class AccessArrayNode extends RNode { return pairlist.getDataAtAsObject(position - 1); } + @SuppressWarnings("unused") + @Specialization + protected Object access(REnvironment env, Object exact, int recLevel, Object position, RAbstractLogicalVector dropDim) { + if (isSubset) { + error.enter(); + throw RError.error(getEncapsulatingSourceSection(), RError.Message.OBJECT_NOT_SUBSETTABLE, "environment"); + } + if (!(position instanceof String || ((position instanceof RStringVector) && ((RStringVector) position).getLength() == 1))) { + error.enter(); + throw RError.error(getEncapsulatingSourceSection(), RError.Message.WRONG_ARGS_SUBSET_ENV); + } + Object obj = env.get(RRuntime.asString(position)); + return obj == null ? RNull.instance : obj; + } + protected boolean outOfBounds(RList vector, @SuppressWarnings("unused") Object exact, @SuppressWarnings("unused") int recLevel, int position) { return position > vector.getLength(); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java index 98d1cc102ab63e820f9cdf905379567ec4adaa39..4a1e804d4e71fa1ee41b410c74a0baa13f2d0e7c 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java @@ -76,6 +76,11 @@ public abstract class CastToContainerNode extends CastNode { return pairlist; } + @Specialization + protected REnvironment cast(REnvironment env) { + return env; + } + @Override public RNode substitute(REnvironment env) { return CastToContainerNodeGen.create(getOperand(), false, false, false); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java index c8071a3966e7ab8afff73e1eaaf04fdee47b655d..c948e477e2776d1d9df20350a0335a78b50d0710 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java @@ -382,6 +382,7 @@ public final class RError extends RuntimeException { TYPE_EXPECTED("%s argument expected"), CANNOT_CHANGE_DIRECTORY("cannot change working directory"), FIRST_ARG_MUST_BE_STRING("first argument must be a character string"), + ARG_MUST_BE_CHARACTER_VECTOR_LENGTH_ONE("argument must be a character vector of length 1"), ZERO_LENGTH_VARIABLE("attempt to use zero-length variable name"), ARGUMENT_NOT_INTERPRETABLE_LOGICAL("argument is not interpretable as logical"), OPERATIONS_NUMERIC_LOGICAL_COMPLEX("operations are possible only for numeric, logical or complex types"), @@ -430,6 +431,7 @@ public final class RError extends RuntimeException { IS_OF_WRONG_LENGTH("'%s' is of wrong length %d (!= %d)"), IS_OF_WRONG_ARITY("'%d' argument passed to '%s' which requires '%d'"), OBJECT_NOT_SUBSETTABLE("object of type '%s' is not subsettable"), + WRONG_ARGS_SUBSET_ENV("wrong arguments for subsetting an environment"), DIMS_DONT_MATCH_LENGTH("dims [product %d] do not match the length of object [%d]"), DIMNAMES_DONT_MATCH_DIMS("length of 'dimnames' [%d] must match that of 'dims' [%d]"), DIMNAMES_DONT_MATCH_EXTENT("length of 'dimnames' [%d] not equal to array extent"),