From e9b27e01220ad00f8afa453eba7bd26a2fcd5c5e Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Fri, 17 Apr 2015 16:17:21 -0700
Subject: [PATCH] fix for match.call crash with VarArgNode

---
 .../src/com/oracle/truffle/r/nodes/RASTUtils.java      | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
index 6a67896121..23298349db 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
@@ -160,8 +160,14 @@ public class RASTUtils {
             RLanguage l = (RLanguage) value;
             return (RNode) NodeUtil.cloneNode((Node) l.getRep());
         } else if (value instanceof RPromise) {
-            // TODO: flatten nested promises?
-            return NodeUtil.cloneNode(((RNode) ((RPromise) value).getRep()).unwrap());
+            RPromise promise = (RPromise) value;
+            RNode promiseRep = ((RNode) ((RPromise) value).getRep()).unwrap();
+            if (promiseRep instanceof VarArgNode) {
+                VarArgNode varArgNode = (VarArgNode) promiseRep;
+                RPromise varArgPromise = varArgNode.executeNonEvaluated((VirtualFrame) promise.getFrame());
+                return createNodeForValue(varArgPromise);
+            }
+            return NodeUtil.cloneNode(promiseRep);
         } else {
             return ConstantNode.create(value);
         }
-- 
GitLab