From 989b34c4cba70d28dafaac6d989cf5f5be1c3da9 Mon Sep 17 00:00:00 2001 From: Adam Welc <adam.welc@oracle.com> Date: Mon, 15 Aug 2016 20:18:31 -0700 Subject: [PATCH] Rewritten parameter casts for as.function.default builtin. --- .../r/nodes/builtin/base/AsFunction.java | 21 ++++++++++--------- .../com/oracle/truffle/r/runtime/RError.java | 2 +- .../test/builtins/TestBuiltin_asfunction.java | 2 ++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsFunction.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsFunction.java index 7afbe27d40..dbef318443 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsFunction.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsFunction.java @@ -22,19 +22,20 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.FrameDescriptor; import com.oracle.truffle.r.nodes.access.AccessArgumentNode; import com.oracle.truffle.r.nodes.access.ConstantNode; import com.oracle.truffle.r.nodes.access.WriteVariableNode; import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.function.FormalArguments; import com.oracle.truffle.r.nodes.function.FunctionDefinitionNode; @@ -50,11 +51,11 @@ 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.RList; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RSymbol; +import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.env.REnvironment; import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor; @@ -64,9 +65,16 @@ import com.oracle.truffle.r.runtime.nodes.RSyntaxNode; @RBuiltin(name = "as.function.default", kind = INTERNAL, parameterNames = {"x", "envir"}, behavior = PURE) public abstract class AsFunction extends RBuiltinNode { + + @Override + protected void createCasts(CastBuilder casts) { + casts.arg("x").mustBe(instanceOf(RAbstractListVector.class).or(instanceOf(RExpression.class)), RError.SHOW_CALLER2, RError.Message.TYPE_EXPECTED, RType.List.getName()); + casts.arg("envir").mustBe(instanceOf(REnvironment.class), RError.Message.INVALID_ENVIRONMENT); + } + @Specialization @TruffleBoundary - protected RFunction asFunction(RList x, REnvironment envir) { + protected RFunction asFunction(RAbstractListVector x, REnvironment envir) { if (x.getLength() == 0) { throw RError.error(this, RError.Message.GENERIC, "argument must have length at least 1"); } @@ -147,11 +155,4 @@ public abstract class AsFunction extends RBuiltinNode { protected RFunction asFunction(RExpression x, REnvironment envir) { return asFunction(x.getList(), envir); } - - @SuppressWarnings("unused") - @Fallback - @TruffleBoundary - protected RFunction asFunction(Object x, Object envir) { - throw RError.error(this, RError.Message.TYPE_EXPECTED, RType.List.getName()); - } } 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 b1e8b88094..a2527d8e6e 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 @@ -368,7 +368,7 @@ public final class RError extends RuntimeException { // below: not exactly GNU-R message PROMISE_CYCLE("promise already under evaluation: recursive default argument reference or earlier problems?"), MISSING_ARGUMENTS("'missing' can only be used for arguments"), - INVALID_ENVIRONMENT("invalid environment specified"), + INVALID_ENVIRONMENT("invalid environment"), ENVIR_NOT_LENGTH_ONE("numeric 'envir' arg not of length one"), FMT_NOT_CHARACTER("'fmt' is not a character vector"), UNSUPPORTED_TYPE("unsupported type"), diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asfunction.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asfunction.java index fd5ab3b839..b0432a40b7 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asfunction.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asfunction.java @@ -40,5 +40,7 @@ public class TestBuiltin_asfunction extends TestBase { assertEval("{ as.function(alist(\"foo\"))() }"); assertEval("{ as.function(alist(7+42i))() }"); assertEval("{ as.function(alist(as.raw(7)))() }"); + assertEval(Output.IgnoreErrorContext, "{ .Internal(as.function.default(alist(a+b), \"foo\")) }"); + assertEval(Output.IgnoreErrorContext, "{ .Internal(as.function.default(function() 42, parent.frame())) }"); } } -- GitLab