diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ROptions.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ROptions.java index 05c614c25acbde2a40fb38145f061baccf255cd9..8d5c70e8c0b217218f24bdf35ff30b62e553c64f 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ROptions.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ROptions.java @@ -5,7 +5,7 @@ * * Copyright (c) 1995-2012, The R Core Team * Copyright (c) 2003, The R Foundation - * Copyright (c) 2015, 2016, Oracle and/or its affiliates + * Copyright (c) 2015, 2017, Oracle and/or its affiliates * * All rights reserved. */ @@ -238,20 +238,15 @@ public class ROptions { } case "editor": + if (value instanceof RFunction || value instanceof RNull) { + break; + } + coercedValue = coerceStringVector(value, name); + break; + case "continue": case "prompt": { - Object valueAbs = RRuntime.asAbstractVector(value); - // TODO supposed to be coerced - if (valueAbs instanceof RStringVector) { - String p = ((RStringVector) valueAbs).getDataAt(0); - if (p.length() == 0 || RRuntime.isNA(p)) { - throw OptionsException.createInvalid(name); - } else { - coercedValue = valueAbs; - } - } else { - throw OptionsException.createInvalid(name); - } + coercedValue = coerceStringVector(value, name); break; } @@ -379,4 +374,19 @@ public class ROptions { } return coercedValue; } + + private static Object coerceStringVector(Object value, String name) throws OptionsException { + Object valueAbs = RRuntime.asAbstractVector(value); + // TODO supposed to be coerced + if (valueAbs instanceof RStringVector) { + String p = ((RStringVector) valueAbs).getDataAt(0); + if (p.length() == 0 || RRuntime.isNA(p)) { + throw OptionsException.createInvalid(name); + } else { + return valueAbs; + } + } else { + throw OptionsException.createInvalid(name); + } + } } 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 9eceeafd7c2beebadca1ddfafe8ca60b63d6887d..56bce3bc119bc4027798338a14af68e23e6d0538 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 @@ -38353,6 +38353,26 @@ FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #argv <- list(150000, 3e+09);`<=`(argv[[1]],argv[[2]]); [1] TRUE +##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testContinue# +#{ options(continue="abc"); identical(getOption("continue"), "abc") } +[1] TRUE + +##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testContinue#Ignored.WrongCaller# +#{ options(continue=NULL) } +Error in options(continue = NULL) : invalid value for 'continue' + +##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testEditor# +#{ f<-function(){}; options(editor=f); identical(getOption("editor"), f) } +[1] TRUE + +##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testEditor# +#{ options(editor="vi"); identical(getOption("editor"), "vi") } +[1] TRUE + +##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testEditor# +#{ options(editor=NULL); identical(getOption("editor"), NULL) } +[1] TRUE + ##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testOptions# #{ getOption(NULL) } Error in getOption(NULL) : 'x' must be a character string @@ -38370,6 +38390,14 @@ $width [1] 80 +##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testPrompt# +#{ options(prompt="abc"); identical(getOption("prompt"), "abc") } +[1] TRUE + +##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testPrompt#Ignored.WrongCaller# +#{ options(prompt=NULL) } +Error in options(prompt = NULL) : invalid value for 'prompt' + ##com.oracle.truffle.r.test.builtins.TestBuiltin_options.testoptions1# #argv <- list('survfit.print.n'); .Internal(options(argv[[1]])) $survfit.print.n diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java index fcdff56933fddd01069b518af04d50d582e6407e..175a144bc53168546d920c487663124cadc29601 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2016, Oracle and/or its affiliates + * Copyright (c) 2014, 2017, Oracle and/or its affiliates * * All rights reserved. */ @@ -48,4 +48,24 @@ public class TestBuiltin_options extends TestBase { assertEval("{ getOption(character()) }"); assertEval("{ options(\"timeout\", \"width\") }"); } + + @Test + public void testEditor() { + assertEval("{ f<-function(){}; options(editor=f); identical(getOption(\"editor\"), f) }"); + assertEval("{ options(editor=\"vi\"); identical(getOption(\"editor\"), \"vi\") }"); + assertEval("{ options(editor=NULL); identical(getOption(\"editor\"), NULL) }"); + assertEval(Ignored.WrongCaller, "{ options(editor=\"\") }"); + } + + @Test + public void testPrompt() { + assertEval(Ignored.WrongCaller, "{ options(prompt=NULL) }"); + assertEval("{ options(prompt=\"abc\"); identical(getOption(\"prompt\"), \"abc\") }"); + } + + @Test + public void testContinue() { + assertEval(Ignored.WrongCaller, "{ options(continue=NULL) }"); + assertEval("{ options(continue=\"abc\"); identical(getOption(\"continue\"), \"abc\") }"); + } }