diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java index 554484bfbaf81cc00fadb4d45560c486dce529e6..bf5a5edc9eb0b96da3e592cfd45a4e5ef149cb9b 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java @@ -236,6 +236,10 @@ public abstract class RBuiltinPackage { return new RBuiltinBuilder(this, factory); } + /** + * A {@link NodeFactory} implementation used to create {@link RCustomBuiltinNode}s. + * {@link #createNode(Object...)} uses {@link RBuiltinCustomConstructors} is maintained by hand. + */ private static class ReflectiveNodeFactory implements NodeFactory<RBuiltinNode> { private final Class<? extends RBuiltinNode> clazz; @@ -268,9 +272,8 @@ public abstract class RBuiltinPackage { } public List<Class<? extends Node>> getExecutionSignature() { - return Arrays.<Class<? extends Node>> asList(RNode.class); + return Collections.emptyList(); } - } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Apply.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Apply.java index bdc74da217843a1a3398f82521b9f99723383faf..3eedf78efe64a65e8e1d6ebe0efb5fd5115a3d0e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Apply.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Apply.java @@ -31,6 +31,7 @@ import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.r.nodes.*; import com.oracle.truffle.r.nodes.access.*; import com.oracle.truffle.r.nodes.builtin.*; +import com.oracle.truffle.r.nodes.function.*; import com.oracle.truffle.r.runtime.*; import com.oracle.truffle.r.runtime.data.*; import com.oracle.truffle.r.runtime.data.model.*; @@ -119,7 +120,25 @@ public abstract class Apply extends RBuiltinNode { } private Object callFunction(VirtualFrame frame, RFunction fun, Object input) { - Object[] args = RArguments.create(fun, funCall.getSourceSection(), new Object[]{input}); + FormalArguments formals = ((RRootNode) fun.getTarget().getRootNode()).getFormalArguments(); + + // Create arguments: Set 1. to input and fill the rest with defaults + Object[] evaluatedArgs = new Object[formals.getArgsCount()]; + if (evaluatedArgs.length > 0) { + evaluatedArgs[0] = input; + } + for (int i = 1; i < evaluatedArgs.length; i++) { + RNode node = formals.getDefaultArgs()[i]; + if (node == null) { + evaluatedArgs[i] = RMissing.instance; + } else if (node instanceof ConstantNode) { + evaluatedArgs[i] = ((ConstantNode) node).getValue(); + } else { + // TODO Set default values in AccessArgumentNode instead of this?? + Utils.nyi(); + } + } + Object[] args = RArguments.create(fun, funCall.getSourceSection(), evaluatedArgs); return funCall.call(frame, fun.getTarget(), args); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java index e226d50d5e8a324777f80f621794c4c068ee19e2..161b1a6d802a37076b0f89db3a3fe38ef770990f 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java @@ -163,12 +163,6 @@ public class EvalFunctions { @RBuiltin(name = "local", nonEvalArgs = {0}, kind = SUBSTITUTE, parameterNames = {"expr", "envir"}) public abstract static class Local extends EvalAdapter { - @SuppressWarnings("hiding") protected static final String[] PARAMETER_NAMES = new String[]{"expr", "envir"}; - - @Override - public String[] getParameterNames() { - return PARAMETER_NAMES; - } @Override public RNode[] getParameterValues() { @@ -176,17 +170,17 @@ public class EvalFunctions { } @Specialization - protected Object doEval(VirtualFrame frame, RPromise expr, @SuppressWarnings("unused") RMissing envir, RMissing enclos) { - return doEval(expr, new REnvironment.NewEnv(REnvironment.frameToEnvironment(frame.materialize()), 0), enclos); + protected Object doEval(VirtualFrame frame, RPromise expr, @SuppressWarnings("unused") RMissing envir) { + return doEval(expr, new REnvironment.NewEnv(REnvironment.frameToEnvironment(frame.materialize()), 0)); } @Specialization - protected Object doEval(RPromise expr, REnvironment envir, RMissing enclos) { + protected Object doEval(RPromise expr, REnvironment envir) { /* * local does not evaluate it's first argument */ controlVisibility(); - return doEvalBody(RDataFactory.createLanguage(expr.getRep()), envir, enclos); + return doEvalBody(RDataFactory.createLanguage(expr.getRep()), envir, null); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java index 441012acb364b6ea110641cf9afa9f670302cc56..10b22cee008517c6676252a7ddd6521e50af02d4 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java @@ -25,13 +25,12 @@ package com.oracle.truffle.r.nodes.builtin.base; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.r.nodes.builtin.*; import com.oracle.truffle.r.runtime.*; -import com.oracle.truffle.r.runtime.data.*; @RBuiltin(name = ".isMethodsDispatchOn", kind = RBuiltinKind.PRIMITIVE, parameterNames = {}) public abstract class IsMethodsDispatchOn extends RBuiltinNode { @Specialization - protected byte doIsMethodsDispatchOn(@SuppressWarnings("unused") RMissing x) { + protected byte doIsMethodsDispatchOn() { controlVisibility(); return RRuntime.LOGICAL_TRUE; } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Max.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Max.java index 0cb54f6bedd6cb58288fe1573def96186c837cfd..9db2aa2cb91afe5124d2966f718464e0ca25a178 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Max.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Max.java @@ -42,16 +42,6 @@ public final class Max extends RWrapperBuiltinNode { return new RNode[]{ConstantNode.create(RMissing.instance), ConstantNode.create(RRuntime.LOGICAL_FALSE)}; } - @Override - public boolean matchArguments() { - return true; - } - - @Override - public int getExecutionSignatureSize() { - return 2; - } - public Max(RBuiltinNode prev) { super(prev); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Min.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Min.java index 8a34cfd8d5df56433f50816213c81f65ab41e24c..f53a5f44465e017125ab001e5728523838b64e59 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Min.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Min.java @@ -42,16 +42,6 @@ public final class Min extends RWrapperBuiltinNode { return new RNode[]{ConstantNode.create(RMissing.instance), ConstantNode.create(RRuntime.LOGICAL_FALSE)}; } - @Override - public boolean matchArguments() { - return true; - } - - @Override - public int getExecutionSignatureSize() { - return 2; - } - public Min(RBuiltinNode prev) { super(prev); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RVersion.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RVersion.java index 3168ac7176581ccc9fe84fe427a86b3e92fdfee3..7bceeca3a06c0d645bdd088294c69d7ec06a5069 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RVersion.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RVersion.java @@ -33,7 +33,7 @@ import com.oracle.truffle.r.runtime.data.*; public abstract class RVersion extends RBuiltinNode { @Specialization - protected Object doRVersion(@SuppressWarnings("unused") RMissing x) { + protected Object doRVersion() { controlVisibility(); return RDataFactory.createList(RVersionInfo.listValues(), RDataFactory.createStringVector(RVersionInfo.listNames(), RDataFactory.COMPLETE_VECTOR)); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sum.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sum.java index 50ce3e6096e23083cdd69c3a99384c063355f699..7ec74f008e2f1fdd14a8af3bad27512463991267 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sum.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sum.java @@ -45,16 +45,6 @@ public final class Sum extends RWrapperBuiltinNode { return new RNode[]{ConstantNode.create(RMissing.instance), ConstantNode.create(RRuntime.LOGICAL_FALSE)}; } - @Override - public boolean matchArguments() { - return true; - } - - @Override - public int getExecutionSignatureSize() { - return 2; - } - public Sum(RBuiltinNode prev) { super(prev); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java index 0d9c8ce629fa6a330995a82a86f80b6a17844685..86abf3a2635c2d40742801560ff628be2d09c6ed 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java @@ -136,7 +136,7 @@ public abstract class AccessArgumentNode extends RNode { return promise; } - public static class ReadArgumentNode extends RNode { + public static final class ReadArgumentNode extends RNode { private final int index; private ReadArgumentNode(int index) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java index bc6c7787e61d4e6a765986b00d2d433018739ff5..67715168921986298dc058797ac4450b546e7fde 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java @@ -22,6 +22,7 @@ */ package com.oracle.truffle.r.nodes.builtin; +import com.oracle.truffle.api.CompilerDirectives.SlowPath; import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; @@ -63,25 +64,6 @@ public abstract class RBuiltinNode extends RCallNode implements VisibilityContro */ public abstract RNode[] getArguments(); - /** - * In most cases, we do not match arguments for builtins, but in some cases (where this method - * needs to be overridden) we do. - * - * @return whether arguments should be matched - */ - public boolean matchArguments() { - return false; - } - - /** - * Meant to be overridded for special cases. - * - * @return size of the execution signature - */ - public int getExecutionSignatureSize() { - return getBuiltin().getFactory().getExecutionSignature().size(); - } - /** * Return the names of the builtin's formal arguments. Historically this was always manually * overridden by the subclass. Now the information is acquired from the {@link RBuiltin} @@ -118,7 +100,8 @@ public abstract class RBuiltinNode extends RCallNode implements VisibilityContro } private static RNode[] createAccessArgumentsNodes(RBuiltinFactory builtin) { - int total = builtin.getFactory().getExecutionSignature().size(); + int total = builtin.getRBuiltin().parameterNames().length; + // int total = builtin.getFactory().getExecutionSignature().size(); RNode[] args = new RNode[total]; EnvProvider envProvider = new EnvProvider(); for (int i = 0; i < total; i++) { @@ -190,32 +173,26 @@ public abstract class RBuiltinNode extends RCallNode implements VisibilityContro } protected RNode[] inlineStaticArguments(InlinedArguments args) { - int signatureSize = getExecutionSignatureSize(); - RNode[] children = new RNode[signatureSize]; - - // Fill with already determined arguments.. - RNode[] pureArgs = args.getInlinedArgs(); - int argsSize = pureArgs.length; - int di = Math.min(argsSize, signatureSize); - System.arraycopy(args.getInlinedArgs(), 0, children, 0, di); - - // ...and the rest with RMissing - // TODO Or default values??? - for (; di < signatureSize; di++) { - children[di] = ConstantNode.create(RMissing.instance); + int execSignatureSize = getBuiltin().getFactory().getExecutionSignature().size(); + int parameterLength = getBuiltin().getRBuiltin().parameterNames().length; + if (execSignatureSize > parameterLength) { + throwMissingFormalParameterError(parameterLength, execSignatureSize); } - return children; + return args.getInlinedArgs(); + } + + @SlowPath + private void throwMissingFormalParameterError(int argsLength, int specializationExpectesArgs) { + String name = getBuiltin().getRBuiltin().name(); + throw new IllegalStateException("Builtin '" + name + "': Length of 'parameterNames' (" + argsLength + ") and specialization signature (" + specializationExpectesArgs + ") must be consistent!"); } /** * A wrapper builtin is a {@link RCustomBuiltinNode} that is able to create any arbitrary node - * as builtin. It can be used as normal builtin. Implement {@link #createDelegate()} to create - * that node. Warning: setting argument count is not yet implemented. set {@link RBuiltin} to - * varargs to get all arguments in a single node in the arguments array. + * as builtin (e.g., 'max', 'sum', etc.). It can be used as normal builtin. Implement + * {@link #createDelegate()} to create that node. */ - // TODO support argument for number of arguments. Currently no arguments are passed - // or in case of var args exactly one. public abstract static class RWrapperBuiltinNode extends RCustomBuiltinNode { @Child private RNode delegate; @@ -304,6 +281,11 @@ public abstract class RBuiltinNode extends RCallNode implements VisibilityContro return builtin; } + @Override + protected RBuiltin getRBuiltin() { + return builtin.getRBuiltin(); + } + @Override public String[] getSuppliedArgsNames() { return suppliedArgsNames; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java index e0a4f484bbcc238b1657b256f34c84fba79c383a..3bc31043931dc3309df03642df0947867cf9859b 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java @@ -80,9 +80,4 @@ public final class RBuiltinRootNode extends RRootNode { public RootNode split() { return new RBuiltinRootNode(NodeUtil.cloneNode(uninitializedBuiltin), getFormalArguments(), getFrameDescriptor().shallowCopy()); } - - public boolean matchArguments() { - return builtin.matchArguments(); - } - } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java index 7ec91964b728c05702bd0bc7dd87eed92ca5d704..bf31da09e450c064cc4de3f8382473763b3219db 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java @@ -48,7 +48,7 @@ import com.oracle.truffle.r.runtime.data.RPromise.RPromiseFactory; * re-match parameters, e.g.: * {@link #matchArgumentsEvaluated(VirtualFrame, RFunction, EvaluatedArguments, SourceSection)} for * 'UseMethod' and - * {@link #matchArgumentsInlined(VirtualFrame, RFunction, UnmatchedArguments, SourceSection, SourceSection, boolean)} + * {@link #matchArgumentsInlined(VirtualFrame, RFunction, UnmatchedArguments, SourceSection, SourceSection)} * for builtins which are implemented in Java ( @see {@link RBuiltinNode#inline(InlinedArguments)} * </p> * @@ -161,7 +161,6 @@ public class ArgumentMatcher { * @param function The function which is to be called * @param suppliedArgs The arguments supplied to the call * @param callSrc The source of the function call currently executed - * @param matchArgs Determines if arguments should be matched * @param argsSrc The source code encapsulating the arguments, for debugging purposes * * @return A fresh {@link InlinedArguments} containing the arguments in correct order and @@ -169,8 +168,8 @@ public class ArgumentMatcher { * @see #matchNodes(VirtualFrame, RFunction, RNode[], String[], SourceSection, SourceSection, * boolean, ClosureCache) */ - public static InlinedArguments matchArgumentsInlined(VirtualFrame frame, RFunction function, UnmatchedArguments suppliedArgs, SourceSection callSrc, SourceSection argsSrc, boolean matchArgs) { - RNode[] wrappedArgs = matchNodes(frame, function, suppliedArgs.getArguments(), suppliedArgs.getNames(), callSrc, argsSrc, matchArgs, suppliedArgs); + public static InlinedArguments matchArgumentsInlined(VirtualFrame frame, RFunction function, UnmatchedArguments suppliedArgs, SourceSection callSrc, SourceSection argsSrc) { + RNode[] wrappedArgs = matchNodes(frame, function, suppliedArgs.getArguments(), suppliedArgs.getNames(), callSrc, argsSrc, true, suppliedArgs); return new InlinedArguments(wrappedArgs, suppliedArgs.getNames()); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java index aa4a95690c5b204998813a0b425cb4ccb87a9198..4b7541fc27c25c991b992bb6459c7bacc6f0ac75 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java @@ -73,13 +73,13 @@ import com.oracle.truffle.r.runtime.data.*; * U = {@link UninitializedCallNode}: Forms the uninitialized end of the function PIC * D = {@link DispatchedCallNode}: Function fixed, no varargs * G = {@link GenericCallNode}: Function fixed, no varargs (generic case) - * + * * UV = {@link UninitializedCallNode} with varargs, * UVC = {@link UninitializedVarArgsCacheCallNode} with varargs, for varargs cache * DV = {@link DispatchedVarArgsCallNode}: Function fixed, with cached varargs * DGV = {@link DispatchedGenericVarArgsCallNode}: Function fixed, with arbitrary varargs (generic case) * GV = {@link GenericVarArgsCallNode}: Function arbitrary, with arbitrary varargs (generic case) - * + * * (RB = {@link RBuiltinNode}: individual functions that are builtins are represented by this node * which is not aware of caching) * </pre> @@ -92,11 +92,11 @@ import com.oracle.truffle.r.runtime.data.*; * non varargs, max depth: * | * D-D-D-U - * + * * no varargs, generic (if max depth is exceeded): * | * G - * + * * varargs: * | * DV-DV-UV @@ -104,11 +104,11 @@ import com.oracle.truffle.r.runtime.data.*; * DV * | * UVC - * + * * varargs, max varargs depth exceeded: * | * DV-DGV-UV - * + * * varargs, max function depth exceeded: * | * GV @@ -380,7 +380,7 @@ public abstract class RCallNode extends RNode { if (root != null) { // We inline the given arguments here, as builtins are executed inside the same // frame as they are called. - InlinedArguments inlinedArgs = ArgumentMatcher.matchArgumentsInlined(frame, function, clonedArgs, callSrc, argsSrc, !root.matchArguments()); + InlinedArguments inlinedArgs = ArgumentMatcher.matchArgumentsInlined(frame, function, clonedArgs, callSrc, argsSrc); callNode = root.inline(inlinedArgs); } } else { 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 6fbc5803ce8fb7ba89cd49ae5443880f43684baf..1bf624c7ee725fcb5256ae7bdeb98e7441eab6e2 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 @@ -8945,6 +8945,18 @@ In max() : no non-missing arguments to max; returning -Inf #{ max(0/0, 1.1, NA) } [1] NA +##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testMaximum +#{ max(123, NA, TRUE, 12, FALSE) } +[1] NA + +##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testMaximum +#{ max(123, NA, TRUE, 12, FALSE, na.rm=FALSE) } +[1] NA + +##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testMaximum +#{ max(123, NA, TRUE, 12, FALSE, na.rm=TRUE) } +[1] 123 + ##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testMaximum #{ max(1:10, 100:200, c(4.0, 5.0)) } [1] 200 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java index e24018361ca2585b58adc178988e7632f30c00b3..38b5122ef447525271132496bcac40c1b928c6f6 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java @@ -10108,6 +10108,21 @@ public class AllTests extends TestBase { assertEval("{ max(\"42\", as.character(NA), \"7\", na.rm=FALSE) }"); } + @Test + public void TestSimpleBuiltins_testMaximum_f5adf3eb65411f16da79fcd519585f41() { + assertEval("{ max(123, NA, TRUE, 12, FALSE, na.rm=TRUE) }"); + } + + @Test + public void TestSimpleBuiltins_testMaximum_e9c2a4fbc3eed59f75b571edfa22fd88() { + assertEval("{ max(123, NA, TRUE, 12, FALSE, na.rm=FALSE) }"); + } + + @Test + public void TestSimpleBuiltins_testMaximum_e0b736d0d8c6f4e5b43783e862af2811() { + assertEval("{ max(123, NA, TRUE, 12, FALSE) }"); + } + @Test public void TestSimpleBuiltins_testMaximum_fb36815b5b8996417de7e952ad295967() { assertEvalError("{ max(as.raw(42), as.raw(7)) }"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java index 00ba2d923ea839cb055d8c65fcad30a0dd1f977a..c92e0ce5dea676ca32ab7adc8fd0f8f2d2fc3b14 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java @@ -218,6 +218,10 @@ public class TestSimpleBuiltins extends TestBase { assertEval("{ max(42, as.double(NA), 7, na.rm=FALSE) }"); assertEval("{ max(\"42\", as.character(NA), \"7\", na.rm=TRUE) }"); assertEval("{ max(\"42\", as.character(NA), \"7\", na.rm=FALSE) }"); + + assertEval("{ max(123, NA, TRUE, 12, FALSE, na.rm=TRUE) }"); + assertEval("{ max(123, NA, TRUE, 12, FALSE, na.rm=FALSE) }"); + assertEval("{ max(123, NA, TRUE, 12, FALSE) }"); } @Test