Skip to content
Snippets Groups Projects
Commit 989b34c4 authored by Adam Welc's avatar Adam Welc
Browse files

Rewritten parameter casts for as.function.default builtin.

parent 34478f44
No related branches found
No related tags found
No related merge requests found
......@@ -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());
}
}
......@@ -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"),
......
......@@ -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())) }");
}
}
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