diff --git a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g index 81001b684010e4665dd785f4bde17a6462e07f87..0015efa635fa6aa9795a1957e30be274ec297e02 100644 --- a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g +++ b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2015, Oracle and/or its affiliates + * Copyright (c) 2013, 2016, Oracle and/or its affiliates * * All rights reserved. */ @@ -493,7 +493,7 @@ expr_subset [ASTNode i] returns [ASTNode v] | (t=AT n_ name=id { $v = FieldAccess.create(sourceSection("expr_subset/AT", $t, name), FieldOperator.AT, i, name.getText()); }) | (t=LBRAKET subset=args y=RBRAKET { $v = Call.create(sourceSection("expr_subset/LBRAKET", $t, $y), CallOperator.SUBSET, i, subset); }) | (t=LBB subscript=args RBRAKET y=RBRAKET { $v = Call.create(sourceSection("expr_subset/LBB", $t, $y), CallOperator.SUBSCRIPT, i, subscript); }) - // Must use RBRAKET twice instead of RBB beacause this is possible: a[b[1]] + // Must use RBRAKET twice instead of RBB because this is possible: a[b[1]] | (t=LPAR a=args y=RPAR { $v = Call.create(sourceSection("expr_subset/LPAR", $t, $y), i, a); }) //| { $v = i; } ; diff --git a/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/NAMESPACE b/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/NAMESPACE index 16685286e4092711ae3bacc843642d89607952a5..4583db56a01a4cd1dc0e18f899c03eabbca009e9 100644 --- a/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/NAMESPACE +++ b/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/NAMESPACE @@ -1 +1,2 @@ export(vanilla) +export(functionTest) diff --git a/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/R/vanilla.R b/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/R/vanilla.R index 19c05192f9379132a6c4b0108ee793de543305d3..68f189d61507d8c6ddf93f222554b6b07a604663 100644 --- a/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/R/vanilla.R +++ b/com.oracle.truffle.r.test.native/packages/vanilla/vanilla/R/vanilla.R @@ -1,2 +1,8 @@ vanilla <- function() print("A vanilla R package") + +functionTest <- function(x, y) { + x[5] <- 1 + y[2] <- x[5] + (1+y[2]):10 +} \ No newline at end of file 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 420e641b217b29b989fb8e4e1596a4241262bc7e..94b8aa54791f6f8f6ab771f81a059668ef517534 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 @@ -103649,3 +103649,7 @@ NULL [1] "A vanilla R package" [1] "A vanilla R package" +##com.oracle.truffle.r.test.rpackages.TestVanillaPackage.testSimpleFunction +#{ library("vanilla", lib.loc = "com.oracle.truffle.r.test/rpackages/testrlibs_user"); r <- functionTest(c(1,2,3,4,5,6),8:10); detach("package:vanilla"); r } +[1] 2 3 4 5 6 7 8 9 10 + diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java index 1f82ac178685f0e4c006e18dd91f424d8c57acd0..113bf5793ea57b0759fa95a9070bd3529a61d16b 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2015, Oracle and/or its affiliates + * Copyright (c) 2013, 2016, Oracle and/or its affiliates * * All rights reserved. */ @@ -56,6 +56,7 @@ public class TestBase { ParserErrorFormatting("tests that fail because of the formatting of parser error messages"), WrongCaller("tests that fail because the caller source is wrong in an error or warning"), ParserError("tests that fail because of bugs in the parser"), + ImplementationError("tests that fail because of bugs in other parts of the runtime"), SideEffects("tests that are ignored because they would interfere with other tests"), MissingWarning("tests that fail because of missing warnings"), MissingBuiltin("tests that fail because of missing builtins"), diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestVanillaPackage.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestVanillaPackage.java index 0cac5d339a6787167fb80d4d3d0eacca7ffdcc8b..455287c488f70f7166c43dfd233e501cceb6deed 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestVanillaPackage.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestVanillaPackage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 @@ -58,4 +58,18 @@ public class TestVanillaPackage extends TestRPackages { assertEval(TestBase.template("{ library(\"vanilla\", lib.loc = \"%0\"); r <- vanilla(); detach(\"package:vanilla\"); r }", new String[]{packagePaths.rpackagesLibs.toString()})); } + @Test + public void testSimpleFunction() { + /* + * This test fails because FastR doesn't install the package correctly. In particular, the + * ReplacementNode serializes "y[x] <- z" to "`[<-`(y, x, z)", where it should create + * "y <- `[<-`(y, x, z)" (i.e., it doesn't actually change the variable). This causes + * replacements that are part of lazy-loaded library functions to have no effect if the + * package in question was installed using FastR. + */ + assertEval(Ignored.ImplementationError, + TestBase.template("{ library(\"vanilla\", lib.loc = \"%0\"); r <- functionTest(c(1,2,3,4,5,6),8:10); detach(\"package:vanilla\"); r }", + new String[]{packagePaths.rpackagesLibs.toString()})); + } + }