diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java index c8504c82d60d66b60584a15524a320f1ca3116b2..b7a0bd8b9e393a38ed251e007307651a2a3d8b74 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java @@ -47,6 +47,7 @@ import com.oracle.truffle.r.nodes.unary.FirstStringNode; 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.RLanguage; import com.oracle.truffle.r.runtime.data.RLogical; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; @@ -108,14 +109,14 @@ public abstract class ExtractVectorNode extends RBaseNode { protected abstract Object execute(Object vector, Object[] positions, Object exact, Object dropDimensions); @Specialization(guards = {"cached != null", "cached.isSupported(vector, positions)"}, limit = "3") - protected Object doRecursive(RAbstractVector vector, Object[] positions, Object exact, Object dropDimensions, // + protected Object doRecursive(RAbstractContainer vector, Object[] positions, Object exact, Object dropDimensions, // @Cached("createRecursiveCache(vector, positions)") RecursiveExtractSubscriptNode cached) { return cached.apply(vector, positions, exact, dropDimensions); } - protected RecursiveExtractSubscriptNode createRecursiveCache(Object vector, Object[] positions) { - if (isRecursiveSubscript(vector, positions)) { - return RecursiveExtractSubscriptNode.create((RAbstractListVector) vector, positions[0]); + protected RecursiveExtractSubscriptNode createRecursiveCache(Object x, Object[] positions) { + if (isRecursiveSubscript(x, positions)) { + return RecursiveExtractSubscriptNode.create((RAbstractContainer) x, positions[0]); } return null; } @@ -133,7 +134,7 @@ public abstract class ExtractVectorNode extends RBaseNode { } private boolean isRecursiveSubscript(Object vector, Object[] positions) { - return !recursive && !ignoreRecursive && mode.isSubscript() && vector instanceof RAbstractListVector && positions.length == 1; + return !recursive && !ignoreRecursive && mode.isSubscript() && (vector instanceof RAbstractListVector || vector instanceof RLanguage) && positions.length == 1; } @Specialization(limit = "CACHE_LIMIT", guards = {"!isForeignObject(vector)", "cached != null", "cached.isSupported(vector, positions, exact, dropDimensions)"}) @@ -244,7 +245,7 @@ public abstract class ExtractVectorNode extends RBaseNode { public RecursiveExtractSubscriptNode getRecursive(RAbstractContainer vector, Object[] positions) { CompilerAsserts.neverPartOfCompilation(); if (cachedRecursive == null || !cachedRecursive.isSupported(vector, positions)) { - cachedRecursive = insert(RecursiveExtractSubscriptNode.create((RAbstractListVector) vector, positions[0])); + cachedRecursive = insert(RecursiveExtractSubscriptNode.create(vector, positions[0])); } return cachedRecursive; } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveExtractSubscriptNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveExtractSubscriptNode.java index 559bde561745bfe572235378367464503a4fe499..a50f0a2da30620dca6d5dffeb8d6e752b93180a4 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveExtractSubscriptNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveExtractSubscriptNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,10 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.data.RInteger; +import com.oracle.truffle.r.runtime.data.RLanguage; import com.oracle.truffle.r.runtime.data.RLogical; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; abstract class RecursiveExtractSubscriptNode extends RecursiveSubscriptNode { @@ -36,11 +38,11 @@ abstract class RecursiveExtractSubscriptNode extends RecursiveSubscriptNode { @Child private ExtractVectorNode recursiveSubscriptExtract = ExtractVectorNode.createRecursive(ElementAccessMode.SUBSCRIPT); @Child private ExtractVectorNode subscriptExtract = ExtractVectorNode.create(ElementAccessMode.SUBSCRIPT, true); - RecursiveExtractSubscriptNode(RAbstractListVector vector, Object position) { + RecursiveExtractSubscriptNode(RAbstractContainer vector, Object position) { super(vector, position); } - public static RecursiveExtractSubscriptNode create(RAbstractListVector vector, Object position) { + public static RecursiveExtractSubscriptNode create(RAbstractContainer vector, Object position) { return RecursiveExtractSubscriptNodeGen.create(vector, position); } @@ -71,7 +73,7 @@ abstract class RecursiveExtractSubscriptNode extends RecursiveSubscriptNode { for (int i = 1; i < positionLength; i++) { Object selection = getPositionExtract.apply(firstPosition, new Object[]{RInteger.valueOf(i)}, RLogical.TRUE, RLogical.TRUE); try { - if (!(currentVector instanceof RAbstractListVector)) { + if (!(currentVector instanceof RAbstractListVector || currentVector instanceof RLanguage)) { throw indexingFailed(i); } currentVector = recursiveSubscriptExtract.apply(currentVector, new Object[]{selection}, exact, dropDimensions); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveSubscriptNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveSubscriptNode.java index 72a24f39e2db858bb474e438586818bf604adf2b..d91634e1223ced1b109c2ef15ecfa6f4bb0cd01d 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveSubscriptNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/RecursiveSubscriptNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ package com.oracle.truffle.r.nodes.access.vector; import com.oracle.truffle.r.nodes.control.RLengthNode; import com.oracle.truffle.r.runtime.RError; -import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.nodes.RBaseNode; abstract class RecursiveSubscriptNode extends RBaseNode { @@ -34,7 +34,7 @@ abstract class RecursiveSubscriptNode extends RBaseNode { @Child protected RLengthNode positionLengthNode = RLengthNode.create(); - RecursiveSubscriptNode(RAbstractListVector vector, Object position) { + RecursiveSubscriptNode(RAbstractContainer vector, Object position) { this.vectorClass = vector.getClass(); this.positionClass = position.getClass(); } 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 a5ef46f5b78cae27abb3085c9e79b261d7790a74..05633aca26289f48a5f7f4900d16aea07fcb3d7d 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 @@ -117242,6 +117242,10 @@ Error in c(as.raw(10), as.raw(10), as.raw(10))^c(as.raw(10), as.raw(10), : #f <- function(x) { x[1] = 2; }; x <- c(1L, 2L, 3L); f(x); x[1] [1] 1 +##com.oracle.truffle.r.test.library.base.TestSimpleValues.testLanguage# +#quote(1==1)[[c(2,1)]] +[1] 1 + ##com.oracle.truffle.r.test.library.base.TestSimpleValues.testMatrixAccess# #x <- matrix(c(1,2,3,4),2) ; x[,2] [1] 3 4 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleValues.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleValues.java index 07b3d1107bd5a7bf0469c3c7b2f683e61a5edcaf..260b518ba94f16aa1c1efb62df0878c6da81ff0b 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleValues.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleValues.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -161,6 +161,11 @@ public class TestSimpleValues extends TestBase { assertEval("{ 1i }"); } + @Test + public void testLanguage() { + assertEval("quote(1==1)[[c(2,1)]]"); + } + @Test public void testSpecial() { assertEval("{ NULL }");