From 333db31324cc1f2a07aa94a9ac2fc0c424ae25ec Mon Sep 17 00:00:00 2001 From: Adam Welc <adam.welc@oracle.com> Date: Tue, 15 Mar 2016 20:07:30 -0700 Subject: [PATCH] Added support for accessing function arguments as part of RLanguage object. --- .../r/engine/RRuntimeASTAccessImpl.java | 31 +++++++++++++------ .../test/library/base/TestSimpleVectors.java | 5 +++ 2 files changed, 27 insertions(+), 9 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 1b4a5a81ea..2a3078a825 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 @@ -112,6 +112,18 @@ import com.oracle.truffle.r.runtime.nodes.RSyntaxNode; */ public class RRuntimeASTAccessImpl implements RRuntimeASTAccess { + private static Object getIntrinsicValue(Object result) { + if (result instanceof RSyntaxConstant) { + return ((RSyntaxConstant) result).getValue(); + } else if (result instanceof RSyntaxLookup) { + return RDataFactory.createSymbolInterned(((RSyntaxLookup) result).getIdentifier()); + } else { + assert result instanceof RSyntaxCall || result instanceof RSyntaxFunction : result.getClass(); + return RDataFactory.createLanguage(((RSyntaxNode) result).asRNode()); + } + + } + @TruffleBoundary @Override public int getLength(RLanguage rl) { @@ -152,7 +164,15 @@ public class RRuntimeASTAccessImpl implements RRuntimeASTAccess { result = RSyntaxLookup.createDummyLookup(null, "function", true); break; case 1: - throw RInternalError.unimplemented("arguments of 'function'"); + ArgumentsSignature sig = ((RSyntaxFunction) s).getSyntaxSignature(); + RSyntaxElement[] defaults = ((RSyntaxFunction) s).getSyntaxArgumentDefaults(); + + Object list = RNull.instance; + for (int i = sig.getLength() - 1; i >= 0; i--) { + list = RDataFactory.createPairList(defaults[i] == null ? RDataFactory.createSymbolInterned("") : getIntrinsicValue(defaults[i]), list, + RDataFactory.createSymbolInterned(sig.getName(i))); + } + return list; case 2: result = ((RSyntaxFunction) s).getSyntaxBody(); break; @@ -173,14 +193,7 @@ public class RRuntimeASTAccessImpl implements RRuntimeASTAccess { /* * Constants and lookups are converted to their intrinsic value: */ - if (result instanceof RSyntaxConstant) { - return ((RSyntaxConstant) result).getValue(); - } else if (result instanceof RSyntaxLookup) { - return RDataFactory.createSymbolInterned(((RSyntaxLookup) result).getIdentifier()); - } else { - assert result instanceof RSyntaxCall || result instanceof RSyntaxFunction : result.getClass(); - return RDataFactory.createLanguage(((RSyntaxNode) result).asRNode()); - } + return getIntrinsicValue(result); } @TruffleBoundary diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java index 2791f4a279..6a95850026 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java @@ -680,6 +680,11 @@ public class TestSimpleVectors extends TestBase { assertEval("{ e <- quote(f(x=a, b)); names(e) }"); assertEval("{ e <- quote(f(x=a, y=b)); names(e) }"); assertEval("{ e <- quote(f(x=a, y=b)); names(e[-1]) }"); + + assertEval("{ x<-quote(function(x, y) 42); x[[2]] }"); + assertEval("{ x<-quote(function(x, y) 42); typeof(x[[2]][[1]]) }"); + assertEval("{ x<-quote(function(x, y) 42); names(x[[2]]) }"); + assertEval("{ x<-quote(function(x, y=7) 42); x[[2]] }"); } @Test -- GitLab