From 0ca10ed76c827e1ccadf615248994315073b02b7 Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Fri, 5 Jan 2018 11:33:21 +0100
Subject: [PATCH] Make sure TAG RFFI function always return RSymbol or RNull

---
 .../truffle/r/ffi/impl/nodes/AttributesAccessNodes.java  | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java
index 7f3ba16ac6..19f9d9ea72 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java
@@ -48,6 +48,7 @@ import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RAttributable;
 import com.oracle.truffle.r.runtime.data.RAttributeStorage;
+import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RExternalPtr;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
@@ -116,14 +117,16 @@ public final class AttributesAccessNodes {
 
         @Specialization
         public Object doPairlist(RPairList obj) {
-            return obj.getTag();
+            Object result = obj.getTag();
+            assert result instanceof RSymbol || result == RNull.instance;
+            return result;
         }
 
         @Specialization
         public Object doArgs(RArgsValuesAndNames obj) {
             ArgumentsSignature signature = obj.getSignature();
             if (signature.getLength() > 0 && signature.getName(0) != null) {
-                return signature.getName(0);
+                return RDataFactory.createSymbol(signature.getName(0));
             }
             return RNull.instance;
         }
@@ -138,7 +141,7 @@ public final class AttributesAccessNodes {
                         @Cached("create()") GetNamesAttributeNode getNamesAttributeNode) {
             RStringVector names = getNamesAttributeNode.getNames(obj);
             if (names != null && names.getLength() > 0) {
-                return names.getDataAt(0);
+                return RDataFactory.createSymbol(names.getDataAt(0));
             }
             return RNull.instance;
         }
-- 
GitLab