From 07e9dc520a79e2ee1d6d498890e06d13d788d48b Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Mon, 3 Apr 2017 15:24:04 +0200 Subject: [PATCH] Fix: Invalid argument matching for primitive functions with different or implicit signature. --- .../oracle/truffle/r/nodes/builtin/base/Eval.java | 1 - .../truffle/r/nodes/objects/ExecuteMethod.java | 12 +++--------- .../oracle/truffle/r/test/ExpectedTestOutput.test | 8 ++++++-- .../src/com/oracle/truffle/r/test/S4/TestS4.java | 1 + 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java index a766098384..2164f840c0 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Eval.java @@ -44,7 +44,6 @@ import com.oracle.truffle.r.nodes.builtin.base.FrameFunctions.SysFrame; import com.oracle.truffle.r.nodes.builtin.base.GetFunctions.Get; import com.oracle.truffle.r.nodes.builtin.base.GetFunctionsFactory.GetNodeGen; import com.oracle.truffle.r.nodes.function.visibility.SetVisibilityNode; -import com.oracle.truffle.r.runtime.RArguments; import com.oracle.truffle.r.runtime.RCaller; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.ReturnException; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java index 4619df7873..636a8b4c95 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/ExecuteMethod.java @@ -6,7 +6,7 @@ * Copyright (c) 1995, 1996, 1997 Robert Gentleman and Ross Ihaka * Copyright (c) 1995-2014, The R Core Team * Copyright (c) 2002-2008, The R Foundation - * Copyright (c) 2015, 2016, Oracle and/or its affiliates + * Copyright (c) 2015, 2017, Oracle and/or its affiliates * * All rights reserved. */ @@ -14,14 +14,12 @@ package com.oracle.truffle.r.nodes.objects; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.r.nodes.RRootNode; import com.oracle.truffle.r.nodes.access.variables.LocalReadVariableNode; import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode; import com.oracle.truffle.r.nodes.function.CallMatcherNode; -import com.oracle.truffle.r.nodes.function.FormalArguments; import com.oracle.truffle.r.nodes.function.signature.CollectArgumentsNode; import com.oracle.truffle.r.nodes.function.signature.CollectArgumentsNodeGen; -import com.oracle.truffle.r.runtime.ArgumentsSignature; +import com.oracle.truffle.r.runtime.RArguments; import com.oracle.truffle.r.runtime.RArguments.S4Args; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RFunction; @@ -45,12 +43,8 @@ final class ExecuteMethod extends RBaseNode { callMatcher = insert(CallMatcherNode.create(false)); } - FormalArguments formals = ((RRootNode) fdef.getRootNode()).getFormalArguments(); - ArgumentsSignature signature = formals.getSignature(); - Object[] oldArgs = collectArgs.execute(frame, signature); - S4Args s4Args = new S4Args(readDefined.execute(frame), readMethod.execute(frame), readTarget.execute(frame), readGeneric.execute(frame), readMethods.execute(frame)); - return callMatcher.execute(frame, signature, oldArgs, fdef, fname, s4Args); + return callMatcher.execute(frame, RArguments.getSignature(frame), RArguments.getArguments(frame), fdef, fname, s4Args); } } 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 d76ce00c5a..322f7f2982 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 @@ -60,7 +60,7 @@ Error: invalid assignment for reference class field ‘a’, should be from clas [1] TRUE [1] TRUE -##com.oracle.truffle.r.test.S4.TestR5.testFieldAccess#Output.IgnoreWhitespace# +##com.oracle.truffle.r.test.S4.TestR5.testFieldAccess#Ignored.OutputFormatting# #print(suppressMessages({clazz <- setRefClass('Foo20R5', methods = list(foo = function() NULL)); clazz$methods('foo')})) function() NULL attr(,"mayCall") @@ -745,6 +745,10 @@ Error in (function (cl, name, valueClass) : ##com.oracle.truffle.r.test.S4.TestS4.testSlotUpdate# #{ x<-initialize@valueClass; initialize@valueClass<-"foo"; initialize@valueClass<-x } +##com.oracle.truffle.r.test.S4.TestS4.testStdGeneric# +#{ setClass('A4', representation(a = 'numeric')); setMethod('[[', 'A4', function(x, i, j, ...) NULL); obj <- new('A4'); obj[[1]] } +NULL + ##com.oracle.truffle.r.test.S4.TestS4.testStdGeneric# #{ standardGeneric("") } Error in standardGeneric("") : @@ -62345,7 +62349,7 @@ Error in seq.int(NaN) : 'from' cannot be NA, NaN or infinite #argv <- list(from = 0, to = 0.793110173512391, length.out = FALSE);do.call('seq.int', argv); integer(0) -##com.oracle.truffle.r.test.builtins.TestBuiltin_serialize.testserialize# +##com.oracle.truffle.r.test.builtins.TestBuiltin_serialize.testserialize#Ignored.ImplementationError# #options(keep.source=FALSE); fc <- setClass('FooSerial1', representation(a = 'call')); serialize(fc, connection=NULL) [1] 58 0a 00 00 00 02 00 03 03 02 00 02 03 00 00 01 07 03 00 00 04 02 00 00 00 [26] 01 00 04 00 09 00 00 00 09 63 6c 61 73 73 4e 61 6d 65 00 00 02 10 00 00 00 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java index 09a616189e..a69b6a84e1 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java @@ -142,6 +142,7 @@ public class TestS4 extends TestRBase { assertEval("{ standardGeneric(\"\") }"); assertEval(Output.IgnoreErrorContext, "{ standardGeneric(\"foo\", 42) }"); assertEval(Output.IgnoreErrorContext, "{ x<-42; class(x)<-character(); standardGeneric(\"foo\", x) }"); + assertEval("{ setClass('A4', representation(a = 'numeric')); setMethod('[[', 'A4', function(x, i, j, ...) NULL); obj <- new('A4'); obj[[1]] }"); } @Test -- GitLab