From f57136b9875ca99d929e44f7d8f3600a9edb5834 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Tue, 26 Sep 2017 10:31:54 +0200 Subject: [PATCH] Fix: Used invalid mode for function symbol lookup. --- .../truffle/r/engine/RRuntimeASTAccessImpl.java | 12 ++++++------ .../oracle/truffle/r/test/ExpectedTestOutput.test | 4 ++++ .../truffle/r/test/builtins/TestBuiltin_allvars.java | 5 +++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java index d0d48097d5..b3d2794751 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java @@ -233,7 +233,7 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { List<RCodeBuilder.Argument<RSyntaxNode>> argList = new ArrayList<>(length - 1); for (int i = 1; i < length; i++) { String formal = formals == null ? null : formals.getDataAt(i); - RSyntaxNode syntaxArg = (RSyntaxNode) unwrapToRNode(list.getDataAtAsObject(i)); + RSyntaxNode syntaxArg = (RSyntaxNode) unwrapToRNode(list.getDataAtAsObject(i), false); if (formal != null) { argList.add(RCodeBuilder.argument(RSourceSectionNode.LAZY_DEPARSE, formal, syntaxArg)); } else { @@ -241,7 +241,7 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { } } - RNode fn = unwrapToRNode(list.getDataAtAsObject(0)); + RNode fn = unwrapToRNode(list.getDataAtAsObject(0), true); RSyntaxNode call = RContext.getASTBuilder().call(RSourceSectionNode.LAZY_DEPARSE, fn.asRSyntaxNode(), argList); RLanguage result = RDataFactory.createLanguage(call.asRNode()); if (formals != null && formals.getLength() > 0 && formals.getDataAt(0).length() > 0) { @@ -250,13 +250,13 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { return addAttributes(result, list); } else if (repType == RLanguage.RepType.FUNCTION) { RList argsList = (RList) list.getDataAt(1); - RSyntaxNode body = (RSyntaxNode) unwrapToRNode(list.getDataAt(2)); + RSyntaxNode body = (RSyntaxNode) unwrapToRNode(list.getDataAt(2), false); List<Argument<RSyntaxNode>> resArgs = new LinkedList<>(); RStringVector argsNames = argsList.getNames(); for (int i = 0; i < argsList.getLength(); i++) { String argName = argsNames == null ? null : argsNames.getDataAt(i); Object argVal = argsList.getDataAt(i); - Argument<RSyntaxNode> arg = RCodeBuilder.argument(RSyntaxNode.LAZY_DEPARSE, argName, argVal == RSymbol.MISSING ? null : (RSyntaxNode) unwrapToRNode(argVal)); + Argument<RSyntaxNode> arg = RCodeBuilder.argument(RSyntaxNode.LAZY_DEPARSE, argName, argVal == RSymbol.MISSING ? null : (RSyntaxNode) unwrapToRNode(argVal, false)); resArgs.add(arg); } RootCallTarget rootCallTarget = RContext.getASTBuilder().rootFunction(RContext.getInstance().getLanguage(), RSyntaxNode.LAZY_DEPARSE, resArgs, body, null); @@ -276,14 +276,14 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { return result; } - private RNode unwrapToRNode(Object objArg) { + private RNode unwrapToRNode(Object objArg, boolean functionLookup) { Object obj = objArg; // obj is RSymbol or a primitive value. // A symbol needs to be converted back to a ReadVariableNode if (obj instanceof RLanguage) { return (RNode) RASTUtils.unwrap(((RLanguage) obj).getRep()); } else if (obj instanceof RSymbol) { - return RContext.getASTBuilder().lookup(RSyntaxNode.LAZY_DEPARSE, ((RSymbol) obj).getName(), false).asRNode(); + return RContext.getASTBuilder().lookup(RSyntaxNode.LAZY_DEPARSE, ((RSymbol) obj).getName(), functionLookup).asRNode(); } else if (obj instanceof RPromise) { // Evaluate promise and return the result as constant. return ConstantNode.create(forcePromise("unwrapToRNode", objArg)); 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 fa3a468fa0..1a9ebda521 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 @@ -2783,6 +2783,10 @@ character(0) #argv <- structure(list(expr = expression(quote(temp[1, ] ~ 3))), .Names = 'expr');do.call('all.vars', argv) [1] "temp" +##com.oracle.truffle.r.test.builtins.TestBuiltin_allvars.testallvars2# +#{ fml <- as.formula('v ~ a + b'); fml[[2]] <- NULL; all.vars(fml) } +[1] "a" "b" + ##com.oracle.truffle.r.test.builtins.TestBuiltin_and_octmode.testand_octmode1# #argv <- structure(list(a = structure(integer(0), class = 'octmode'), b = '400'), .Names = c('a', 'b'));do.call('&.octmode', argv) character(0) diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java index d7a2158250..0fa7a639c1 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java @@ -22,4 +22,9 @@ public class TestBuiltin_allvars extends TestBase { public void testallvars1() { assertEval("argv <- structure(list(expr = expression(quote(temp[1, ] ~ 3))), .Names = 'expr');do.call('all.vars', argv)"); } + + @Test + public void testallvars2() { + assertEval("{ fml <- as.formula('v ~ a + b'); fml[[2]] <- NULL; all.vars(fml) }"); + } } -- GitLab