diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java index 9b0c0e76b8e1f08e9b81f8135f91f73074363d03..3edeeca12f54968580af52923630e07ef930ebb2 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java @@ -57,10 +57,7 @@ import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; public class OptionsFunctions { - /* - * This could be refactored using a recursive child node to handle simple cases, but it's - * unlikely to be the fast path. - */ + @RBuiltin(name = "options", visibility = CUSTOM, kind = INTERNAL, parameterNames = {"..."}, behavior = MODIFIES_STATE) public abstract static class Options extends RBuiltinNode { @@ -107,7 +104,7 @@ public class OptionsFunctions { return result.value; } catch (OptionsException ex) { CompilerDirectives.transferToInterpreter(); - throw RError.error(this, ex); + throw RError.error(RError.SHOW_CALLER, ex); } } @@ -167,7 +164,7 @@ public class OptionsFunctions { names = newNames; } } else { - throw RError.error(this, Message.INVALID_UNNAMED_ARGUMENT); + throw RError.error(RError.SHOW_CALLER, Message.INVALID_UNNAMED_ARGUMENT); } Object optionVal = options.getValue(optionName); data[i] = optionVal == null ? RNull.instance : optionVal; @@ -203,7 +200,7 @@ public class OptionsFunctions { @Specialization protected Object getOption(RAbstractStringVector x) { if (x.getLength() != 1) { - throw RError.error(this, RError.Message.MUST_BE_STRING); + throw RError.error(RError.SHOW_CALLER, RError.Message.MUST_BE_STRING); } ROptions.ContextStateImpl options = RContext.getInstance().stateROptions; return options.getValue(x.getDataAt(0)); @@ -211,7 +208,7 @@ public class OptionsFunctions { @Fallback protected Object getOption(@SuppressWarnings("unused") Object x) { - throw RError.error(this, RError.Message.MUST_BE_STRING); + throw RError.error(RError.SHOW_CALLER, RError.Message.MUST_BE_STRING); } } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java index 7d7294095202e7f5ee95e789e947a12832a2e9c4..60c5f72e5830f273253b0b708b2c0b9b9961d67f 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -36,7 +36,8 @@ import com.oracle.truffle.r.nodes.unary.CastLogicalNodeGen; import com.oracle.truffle.r.nodes.unary.CastNode; import com.oracle.truffle.r.nodes.unary.CastToVectorNode; import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen; -import com.oracle.truffle.r.runtime.RInternalError; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RTypes; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; @@ -125,10 +126,14 @@ public abstract class RExternalBuiltinNode extends RBaseNode { } } - private static void checkLength(RArgsValuesAndNames args, int expectedLength) { + protected void checkLength(RArgsValuesAndNames args, int expectedLength) { if (args.getLength() != expectedLength) { CompilerDirectives.transferToInterpreter(); - throw RInternalError.shouldNotReachHere("mismatching number of arguments to foreign function"); + String name = this.getClass().getSimpleName(); + if (name.endsWith("NodeGen")) { + name = name.substring(0, name.length() - 7); + } + throw RError.error(this, Message.INCORRECT_NOF_ARGS, args.getLength(), expectedLength, name.toLowerCase()); } } 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 ea0079348269c1bfaff45ef530e280c38123ae01..adedfbb1e561359141ead1f3484d140d10b8bb70 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 @@ -778,7 +778,8 @@ public final class RError extends RuntimeException { MUST_BE_GE_ONE("'%s' must be of length >= 1"), MORE_THAN_ONE_MATCH("there is more than one match in '%s'"), TOO_MANY_ARGS("too many arguments"), - ARG_MUST_BE_CHARACTER("argument '%s' must be character"); + ARG_MUST_BE_CHARACTER("argument '%s' must be character"), + INCORRECT_NOF_ARGS("Incorrect number of arguments (%d), expecting %d for '%s'"); public final String message; final boolean hasArgs; diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java index 4bfe08721a679adf96f67887256232a0940fadbd..9344c42965fa52e26c5a5218ceef62f3efb4f81d 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java @@ -39,11 +39,7 @@ public class TestBuiltin_crc64 extends TestBase { assertEval(".Internal(crc64(paste(c(letters, LETTERS, 0:9), collapse=\"\")))"); assertEval(".Internal(crc64(c('a')))"); - // Expression: .Internal(crc64('a', 'b')) - // Expected output: Error: 2 arguments passed to .Internal(crc64) which requires 1 - // FastR output: Error in crc64("a", "b") : unused argument ('b') - // should be handled in .Internal-s impl ? - assertEval(Ignored.ImplementationError, ".Internal(crc64('a', 'b'))"); + assertEval(".Internal(crc64('a', 'b'))"); assertEval(".Internal(crc64(c(1, 2)))"); @@ -74,12 +70,8 @@ public class TestBuiltin_crc64 extends TestBase { assertEval(".Call(utils:::C_crc64, c('a'))"); - // // Expected output: Incorrect number of arguments (2), expecting 1 for 'crc64' - // // FastR output: throws com.oracle.truffle.r.runtime.RInternalError: should not reach - // here: mismatching number of arguments to foreign function - // // should be handled in .Call-s impl ? - assertEval(Ignored.ImplementationError, ".Call(utils:::C_crc64, 'a', 'b')"); - assertEval(Ignored.ImplementationError, ".Call(utils:::C_crc64)"); + assertEval(".Call(utils:::C_crc64, 'a', 'b')"); + assertEval(".Call(utils:::C_crc64)"); assertEval(".Call(utils:::C_crc64, c(1, 2))"); 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 175a144bc53168546d920c487663124cadc29601..894d7da3d6b0504510621d341e513a8b62e3abbb 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 @@ -54,18 +54,18 @@ public class TestBuiltin_options extends TestBase { 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=\"\") }"); + assertEval("{ options(editor=\"\") }"); } @Test public void testPrompt() { - assertEval(Ignored.WrongCaller, "{ options(prompt=NULL) }"); + assertEval("{ options(prompt=NULL) }"); assertEval("{ options(prompt=\"abc\"); identical(getOption(\"prompt\"), \"abc\") }"); } @Test public void testContinue() { - assertEval(Ignored.WrongCaller, "{ options(continue=NULL) }"); + assertEval("{ options(continue=NULL) }"); assertEval("{ options(continue=\"abc\"); identical(getOption(\"continue\"), \"abc\") }"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java index 0e2c0e52598ba1a865aa7d5b23ef4fac105eac09..2799e9a5ec964f71a3dcb2d8386ecf7b659e567c 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java @@ -64,8 +64,7 @@ public class TestBuiltin_strsplit extends TestBase { @Test public void teststrsplit10() { - assertEval(Ignored.Unknown, - "argv <- list('A shell of class documentation has been written to the file \\'./myTst2/man/DocLink-class.Rd\\'.\\n', '[ \\t\\n]', FALSE, TRUE, TRUE); .Internal(strsplit(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))"); + assertEval("argv <- list('A shell of class documentation has been written to the file \\'./myTst2/man/DocLink-class.Rd\\'.\\n', '[ \\t\\n]', FALSE, TRUE, TRUE); .Internal(strsplit(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java index c53b3e7847081d8b5d02e5d43a3b35b92813f8d4..811272afd42a247c5d2955715525e77e5d907825 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java @@ -104,7 +104,7 @@ public class TestBuiltin_sum extends TestBase { @Test public void testsum18() { - assertEval(Ignored.Unknown, "argv <- list(c(1073741824L, 1073741824L));sum(argv[[1]]);"); + assertEval("argv <- list(c(1073741824L, 1073741824L));sum(argv[[1]]);"); } @Test