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