From fd9e9e3f5f3d1bac776ba04eec8aebc99e3a1fdc Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Thu, 17 Dec 2015 17:33:25 -0800
Subject: [PATCH] Attribute objects cannot be shared.

---
 .../com/oracle/truffle/r/nodes/builtin/base/UnClass.java  | 8 ++++++--
 .../com/oracle/truffle/r/nodes/unary/DuplicateNode.java   | 7 ++++++-
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UnClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UnClass.java
index 9f988ced92..8bcbb06bd6 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UnClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UnClass.java
@@ -16,6 +16,7 @@ import com.oracle.truffle.api.utilities.BranchProfile;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.*;
 import com.oracle.truffle.r.runtime.data.*;
+import com.oracle.truffle.r.runtime.data.RAttributes.RAttribute;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 
 import static com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -109,8 +110,11 @@ public abstract class UnClass extends RBuiltinNode {
             objectProfile.enter();
             // TODO: should we make S4 objects shareable?
             RS4Object resultS4 = RDataFactory.createS4Object();
-            resultS4.initAttributes(arg.getAttributes());
-            resultS4.removeAttr(attrProfiles, RRuntime.CLASS_ATTR_KEY);
+            RAttributes newAttributes = resultS4.initAttributes();
+            for (RAttribute attr : arg.getAttributes()) {
+                newAttributes.put(attr.getName(), attr.getValue());
+            }
+            newAttributes.remove(RRuntime.CLASS_ATTR_KEY);
             return resultS4;
         }
         return arg;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/DuplicateNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/DuplicateNode.java
index 87c2c9de99..0c236232eb 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/DuplicateNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/DuplicateNode.java
@@ -24,9 +24,11 @@ package com.oracle.truffle.r.nodes.unary;
 
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.r.runtime.*;
+import com.oracle.truffle.r.runtime.data.RAttributes;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RS4Object;
+import com.oracle.truffle.r.runtime.data.RAttributes.RAttribute;
 import com.oracle.truffle.r.runtime.data.model.*;
 import com.oracle.truffle.r.runtime.nodes.RBaseNode;
 
@@ -49,7 +51,10 @@ public abstract class DuplicateNode extends RBaseNode {
     @Specialization
     protected Object duplicate(RS4Object object) {
         RS4Object newObject = RDataFactory.createS4Object();
-        newObject.initAttributes(object.getAttributes());
+        RAttributes newAttributes = newObject.initAttributes();
+        for (RAttribute attr : object.getAttributes()) {
+            newAttributes.put(attr.getName(), attr.getValue());
+        }
         return newObject;
     }
 
-- 
GitLab