Skip to content
Snippets Groups Projects
Commit 8231533f authored by Tomas Stupka's avatar Tomas Stupka
Browse files

a simple combine on REnvironment, RExpression, RFunction, RLanguage, RSymbol,...

a simple combine on REnvironment, RExpression, RFunction, RLanguage, RSymbol, RS4Object has to return a list
parent 55d3fd36
No related branches found
No related tags found
No related merge requests found
...@@ -70,13 +70,18 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin; ...@@ -70,13 +70,18 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
import com.oracle.truffle.r.runtime.data.RAttributesLayout; import com.oracle.truffle.r.runtime.data.RAttributesLayout;
import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RExpression;
import com.oracle.truffle.r.runtime.data.RFunction;
import com.oracle.truffle.r.runtime.data.RLanguage; import com.oracle.truffle.r.runtime.data.RLanguage;
import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RList;
import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.RS4Object;
import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RStringVector;
import com.oracle.truffle.r.runtime.data.RSymbol;
import com.oracle.truffle.r.runtime.data.RVector; import com.oracle.truffle.r.runtime.data.RVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractVector; 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;
import com.oracle.truffle.r.runtime.env.REnvironment;
import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.nodes.RBaseNode;
import com.oracle.truffle.r.runtime.ops.na.NACheck; import com.oracle.truffle.r.runtime.ops.na.NACheck;
...@@ -112,7 +117,15 @@ public abstract class Combine extends RBuiltinNode.Arg2 { ...@@ -112,7 +117,15 @@ public abstract class Combine extends RBuiltinNode.Arg2 {
public abstract Object executeCombine(Object value, Object recursive); public abstract Object executeCombine(Object value, Object recursive);
protected boolean isSimpleArguments(RArgsValuesAndNames args) { protected boolean isSimpleArguments(RArgsValuesAndNames args) {
return !signatureHasNames(args.getSignature()) && args.getLength() == 1 && !(args.getArgument(0) instanceof RAbstractVector) && !RRuntime.isForeignObject(args.getArgument(0)); return !signatureHasNames(args.getSignature()) &&
args.getLength() == 1 &&
!(args.getArgument(0) instanceof RAbstractVector) &&
!(args.getArgument(0) instanceof REnvironment) &&
!(args.getArgument(0) instanceof RFunction) &&
!(args.getArgument(0) instanceof RLanguage) &&
!(args.getArgument(0) instanceof RSymbol) &&
!(args.getArgument(0) instanceof RS4Object) &&
!RRuntime.isForeignObject(args.getArgument(0));
} }
@Specialization(guards = {"isSimpleArguments(args)", "!recursive"}) @Specialization(guards = {"isSimpleArguments(args)", "!recursive"})
......
...@@ -11567,6 +11567,59 @@ NULL ...@@ -11567,6 +11567,59 @@ NULL
Warning message: Warning message:
In body(argv[[1]]) : argument is not a function In body(argv[[1]]) : argument is not a function
   
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(as.expression(1))
expression(1)
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(as.expression(1), as.expression(1))
expression(1, 1)
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(as.symbol(1))
[[1]]
`1`
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(as.symbol(1), as.symbol(1))
[[1]]
`1`
[[2]]
`1`
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(environment())
[[1]]
<environment: R_GlobalEnv>
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(environment(), environment())
[[1]]
<environment: R_GlobalEnv>
[[2]]
<environment: R_GlobalEnv>
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(x~a)
[[1]]
x ~ a
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#c(x~a, x~b)
[[1]]
x ~ a
[[2]]
x ~ b
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine# ##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#typeof(c(substitute(graphics::par), list(as.symbol('a')))) #typeof(c(substitute(graphics::par), list(as.symbol('a'))))
[1] "list" [1] "list"
...@@ -12179,6 +12232,16 @@ x y ...@@ -12179,6 +12232,16 @@ x y
#{ f <- function() { }; length(c(f, 2)) == 2 } #{ f <- function() { }; length(c(f, 2)) == 2 }
[1] TRUE [1] TRUE
   
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#{ f <- function(){}; l <- c(f); print(is.list(l)); identical(l[[1]], f) }
[1] TRUE
[1] TRUE
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#{ f <- function(){}; l <- c(f, f); print(is.list(l)); identical(l[[1]], f) }
[1] TRUE
[1] TRUE
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine# ##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#{ f <- function(x,y) { c(x,y) } ; f(1,1) ; f(1, TRUE) ; f(NULL, NULL) } #{ f <- function(x,y) { c(x,y) } ; f(1,1) ; f(1, TRUE) ; f(NULL, NULL) }
NULL NULL
...@@ -12198,6 +12261,30 @@ Slot "d": ...@@ -12198,6 +12261,30 @@ Slot "d":
[1] 42 [1] 42
   
   
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#{ setClass('foo', representation(bar = 'ANY')); c(new('foo', bar=1)) }
[[1]]
An object of class "foo"
Slot "bar":
[1] 1
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#{ setClass('foo', representation(bar = 'ANY')); c(new('foo', bar=1), new('foo', bar=1)) }
[[1]]
An object of class "foo"
Slot "bar":
[1] 1
[[2]]
An object of class "foo"
Slot "bar":
[1] 1
##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine# ##com.oracle.truffle.r.test.builtins.TestBuiltin_c.testCombine#
#{ typeof(c(as.symbol("foo"), 42)) } #{ typeof(c(as.symbol("foo"), 42)) }
[1] "list" [1] "list"
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* http://www.gnu.org/licenses/gpl-2.0.html * http://www.gnu.org/licenses/gpl-2.0.html
* *
* Copyright (c) 2012-2014, Purdue University * Copyright (c) 2012-2014, Purdue University
* Copyright (c) 2013, 2017, Oracle and/or its affiliates * Copyright (c) 2013, 2018, Oracle and/or its affiliates
* *
* All rights reserved. * All rights reserved.
*/ */
...@@ -541,6 +541,19 @@ public class TestBuiltin_c extends TestBase { ...@@ -541,6 +541,19 @@ public class TestBuiltin_c extends TestBase {
assertEval("{ x<-c(a=42); y<-c(b=7); z<-c(x,y); w<-names(z); w[[1]]<-\"c\"; z }"); assertEval("{ x<-c(a=42); y<-c(b=7); z<-c(x,y); w<-names(z); w[[1]]<-\"c\"; z }");
assertEval("typeof(c(substitute(graphics::par), list(as.symbol('a'))))"); assertEval("typeof(c(substitute(graphics::par), list(as.symbol('a'))))");
assertEval("c(x~a)");
assertEval("c(x~a, x~b)");
assertEval("{ f <- function(){}; l <- c(f); print(is.list(l)); identical(l[[1]], f) }");
assertEval("{ f <- function(){}; l <- c(f, f); print(is.list(l)); identical(l[[1]], f) }");
assertEval("c(environment())");
assertEval("c(environment(), environment())");
assertEval("c(as.expression(1))");
assertEval("c(as.expression(1), as.expression(1))");
assertEval("c(as.symbol(1))");
assertEval("c(as.symbol(1), as.symbol(1))");
assertEval("{ setClass('foo', representation(bar = 'ANY')); c(new('foo', bar=1)) }");
assertEval("{ setClass('foo', representation(bar = 'ANY')); c(new('foo', bar=1), new('foo', bar=1)) }");
} }
@Test @Test
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment