From c8afa9d7ca49b8274a46c8f43996ef0cb6bb49e5 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Sat, 22 Aug 2015 15:26:51 -0700
Subject: [PATCH] serialize/quote fixes for ..n variables

---
 .../com/oracle/truffle/r/nodes/builtin/base/Quote.java |  3 +++
 .../src/com/oracle/truffle/r/nodes/RASTUtils.java      | 10 ++++++++--
 .../r/nodes/access/ReadVariadicComponentNode.java      |  9 ++++++---
 3 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java
index 4c660421ab..79696556bb 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java
@@ -39,6 +39,7 @@ public abstract class Quote extends RBuiltinNode {
     public abstract Object execute(VirtualFrame frame, RPromise expr);
 
     private final ConditionProfile rvn = ConditionProfile.createBinaryProfile();
+    private final ConditionProfile rvcn = ConditionProfile.createBinaryProfile();
     private final ConditionProfile cn = ConditionProfile.createBinaryProfile();
 
     @Specialization
@@ -57,6 +58,8 @@ public abstract class Quote extends RBuiltinNode {
         } else if (cn.profile(unode instanceof ConstantNode)) {
             ConstantNode cnode = (ConstantNode) unode;
             return cnode.getValue();
+        } else if (rvcn.profile(unode instanceof ReadVariadicComponentNode)) {
+            return RASTUtils.createRSymbol(unode);
         } else {
             return RDataFactory.createLanguage(unode);
         }
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 00acaa92df..71b41c4f2e 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
@@ -106,11 +106,17 @@ public class RASTUtils {
     }
 
     /**
-     * Creates an {@link RSymbol} from a {@link ReadVariableNode}.
+     * Creates an {@link RSymbol} from a {@link ReadVariableNode} o
+     * {@link ReadVariadicComponentNode}.
      */
     @TruffleBoundary
     public static RSymbol createRSymbol(Node readVariableNode) {
-        return RDataFactory.createSymbol(((ReadVariableNode) readVariableNode).getIdentifier());
+        if (readVariableNode instanceof ReadVariadicComponentNode) {
+            ReadVariadicComponentNode rvcn = (ReadVariadicComponentNode) readVariableNode;
+            return RDataFactory.createSymbol(rvcn.getPrintForm());
+        } else {
+            return RDataFactory.createSymbol(((ReadVariableNode) readVariableNode).getIdentifier());
+        }
     }
 
     /**
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariadicComponentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariadicComponentNode.java
index 60c3e761e3..c33a7095da 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariadicComponentNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariadicComponentNode.java
@@ -84,11 +84,14 @@ public class ReadVariadicComponentNode extends RNode implements RSyntaxNode {
         return ret == null ? RMissing.instance : ret;
     }
 
+    public String getPrintForm() {
+        return ".." + Integer.toString(index + 1);
+    }
+
     @Override
     public void deparseImpl(State state) {
         state.startNodeDeparse(this);
-        state.append("..");
-        state.append(Integer.toString(index + 1));
+        state.append(getPrintForm());
         state.endNodeDeparse(this);
     }
 
@@ -97,6 +100,6 @@ public class ReadVariadicComponentNode extends RNode implements RSyntaxNode {
     }
 
     public void serializeImpl(com.oracle.truffle.r.runtime.RSerialize.State state) {
-        throw RInternalError.unimplemented();
+        state.setCarAsSymbol(getPrintForm());
     }
 }
-- 
GitLab