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 4c660421abd73dc5601c3835a5a627f533bf324e..79696556bbdfd1309cc948dce7a906df955b165c 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 00acaa92df3cfaee2b6b4dcac90c6a28e500bc8a..71b41c4f2e52cf50140843675e9d09ce7deb3476 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 60c3e761e3fac792e5c612f67fd60cb2c6709e9e..c33a7095da3def6c5a55322738ec874f4b0c1505 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()); } }