From 0974d66e5d29275e87534f4505f067e551885b1b Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Wed, 9 Nov 2016 17:25:54 +0100
Subject: [PATCH] introduce Utils.isInterned

---
 .../com/oracle/truffle/r/nodes/builtin/base/Identical.java   | 3 ++-
 .../src/com/oracle/truffle/r/nodes/builtin/base/Slot.java    | 3 ++-
 .../src/com/oracle/truffle/r/nodes/RASTUtils.java            | 5 +++--
 .../com/oracle/truffle/r/nodes/access/AccessSlotNode.java    | 4 ++--
 .../com/oracle/truffle/r/nodes/access/UpdateSlotNode.java    | 4 ++--
 .../truffle/r/nodes/objects/CollectGenericArgumentsNode.java | 3 ++-
 .../src/com/oracle/truffle/r/runtime/RArguments.java         | 2 +-
 .../src/com/oracle/truffle/r/runtime/Utils.java              | 4 ++++
 .../src/com/oracle/truffle/r/runtime/data/RAttributes.java   | 3 ++-
 .../src/com/oracle/truffle/r/runtime/data/RDataFactory.java  | 3 ++-
 10 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Identical.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Identical.java
index 63b11a187c..600d84a3c0 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Identical.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Identical.java
@@ -37,6 +37,7 @@ import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
+import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RAttributable;
 import com.oracle.truffle.r.runtime.data.RAttributes;
@@ -183,7 +184,7 @@ public abstract class Identical extends RBuiltinNode {
     @SuppressWarnings("unused")
     @Specialization
     protected byte doInternalIdentical(RSymbol x, RSymbol y, boolean numEq, boolean singleNA, boolean attribAsSet, boolean ignoreBytecode, boolean ignoreEnvironment) {
-        assert x.getName() == x.getName().intern() && y.getName() == y.getName().intern();
+        assert Utils.isInterned(x.getName()) && Utils.isInterned(y.getName());
         return x.getName() == y.getName() ? RRuntime.LOGICAL_TRUE : RRuntime.LOGICAL_FALSE;
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Slot.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Slot.java
index 2825463c76..6c4e907480 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Slot.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Slot.java
@@ -28,6 +28,7 @@ import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.function.WrapArgumentNode;
 import com.oracle.truffle.r.runtime.RError;
+import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RPromise;
 import com.oracle.truffle.r.runtime.data.RSymbol;
@@ -68,7 +69,7 @@ public abstract class Slot extends RBuiltinNode {
     protected Object getSlot(Object object, Object nameObj,
                     @Cached("createClassProfile()") ValueProfile nameObjProfile) {
         String name = getName(nameObjProfile.profile(nameObj));
-        assert name == name.intern();
+        assert Utils.isInterned(name);
         return accessSlotNode.executeAccess(object, name);
     }
 }
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 c8e50f12e0..910e062082 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
@@ -40,6 +40,7 @@ import com.oracle.truffle.r.nodes.function.WrapArgumentBaseNode;
 import com.oracle.truffle.r.nodes.function.WrapArgumentNode;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.RInternalError;
+import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.context.RContext;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.REmpty;
@@ -144,7 +145,7 @@ public class RASTUtils {
             return value;
         } else if (element instanceof RSyntaxLookup) {
             String id = ((RSyntaxLookup) element).getIdentifier();
-            assert id == id.intern() : element;
+            assert Utils.isInterned(id);
             return RDataFactory.createSymbol(id);
         } else {
             assert element instanceof RSyntaxCall || element instanceof RSyntaxFunction;
@@ -163,7 +164,7 @@ public class RASTUtils {
             return RDataFactory.createSymbolInterned(rvcn.getPrintForm());
         } else {
             String id = ((ReadVariableNode) readVariableNode).getIdentifier();
-            assert id == id.intern();
+            assert Utils.isInterned(id);
             return RDataFactory.createSymbol(id);
         }
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessSlotNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessSlotNode.java
index deb90eb664..697ec2da29 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessSlotNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessSlotNode.java
@@ -69,7 +69,7 @@ public abstract class AccessSlotNode extends RNode {
     private Object getSlotS4Internal(RAttributable object, String name, Object value) {
         if (value == null) {
             noSlot.enter();
-            assert name == name.intern();
+            assert Utils.isInterned(name);
             if (name == RRuntime.DOT_S3_CLASS) {
                 if (classHierarchy == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -158,7 +158,7 @@ public abstract class AccessSlotNode extends RNode {
     }
 
     protected boolean isDotData(String name) {
-        assert name == name.intern();
+        assert Utils.isInterned(name);
         return name == RRuntime.DOT_DATA;
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/UpdateSlotNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/UpdateSlotNode.java
index 6b0f907f45..a92d821b18 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/UpdateSlotNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/UpdateSlotNode.java
@@ -56,7 +56,7 @@ public abstract class UpdateSlotNode extends RNode {
 
     @Specialization(contains = "updateSlotS4Cached", guards = "!isData(name)")
     protected Object updateSlotS4(RAttributable object, String name, Object value) {
-        assert name == name.intern();
+        assert Utils.isInterned(name);
         object.setAttr(name, prepareValue(value));
         return object;
     }
@@ -75,7 +75,7 @@ public abstract class UpdateSlotNode extends RNode {
     }
 
     protected boolean isData(String name) {
-        assert name == name.intern();
+        assert Utils.isInterned(name);
         return name == RRuntime.DOT_DATA;
     }
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/CollectGenericArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/CollectGenericArgumentsNode.java
index bb5239193c..9c9ffffb38 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/CollectGenericArgumentsNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/CollectGenericArgumentsNode.java
@@ -37,6 +37,7 @@ import com.oracle.truffle.r.nodes.function.ClassHierarchyScalarNode;
 import com.oracle.truffle.r.nodes.function.ClassHierarchyScalarNodeGen;
 import com.oracle.truffle.r.nodes.function.PromiseHelperNode;
 import com.oracle.truffle.r.nodes.function.PromiseHelperNode.PromiseCheckHelperNode;
+import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RPromise;
@@ -82,7 +83,7 @@ public abstract class CollectGenericArgumentsNode extends RBaseNode {
         for (int i = 0; i < argReads.length; i++) {
             Object cachedId = argReads[i].getIdentifier();
             String id = ((RSymbol) (arguments.getDataAt(i))).getName();
-            assert cachedId instanceof String && cachedId == ((String) cachedId).intern() && id == id.intern();
+            assert cachedId instanceof String && Utils.isInterned((String) cachedId) && Utils.isInterned(id);
             if (cachedId != id) {
                 throw new SlowPathException();
             }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java
index 1b5a016fd9..aeec614642 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java
@@ -124,7 +124,7 @@ public final class RArguments {
         public S3Args(String generic, Object clazz, Object method, MaterializedFrame callEnv, MaterializedFrame defEnv, String group) {
             super(generic, method);
             assert generic != null && callEnv != null : generic + " " + callEnv;
-            assert generic.intern() == generic;
+            assert Utils.isInterned(generic);
             this.clazz = clazz;
             this.callEnv = callEnv;
             this.defEnv = defEnv;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
index 3e693cfc72..d1a1a0b209 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
@@ -897,6 +897,10 @@ public final class Utils {
         return s.intern();
     }
 
+    public static boolean isInterned(String s) {
+        return s == s.intern();
+    }
+
     @TruffleBoundary
     public static String toString(Object obj) {
         return obj.toString();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RAttributes.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RAttributes.java
index b2c771cdee..29c07ef768 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RAttributes.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RAttributes.java
@@ -33,6 +33,7 @@ import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.CompilerDirectives.ValueType;
 import com.oracle.truffle.api.utilities.CyclicAssumption;
+import com.oracle.truffle.r.runtime.Utils;
 
 /**
  * Provides the generic mechanism for associating attributes with a R object. It does no special
@@ -161,7 +162,7 @@ public final class RAttributes implements Iterable<RAttributes.RAttribute> {
 
     @TruffleBoundary
     private static boolean isInterned(String name) {
-        assert name == name.intern() : name;
+        assert Utils.isInterned(name) : name;
         return true;
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
index 1e91366055..4530068e0a 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
@@ -37,6 +37,7 @@ import com.oracle.truffle.r.runtime.FastROptions;
 import com.oracle.truffle.r.runtime.RCaller;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
+import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.builtins.RBuiltinDescriptor;
 import com.oracle.truffle.r.runtime.data.RPromise.Closure;
 import com.oracle.truffle.r.runtime.data.RPromise.EagerFeedback;
@@ -393,7 +394,7 @@ public final class RDataFactory {
     }
 
     public static RSymbol createSymbol(String name) {
-        assert name == name.intern();
+        assert Utils.isInterned(name);
         return traceDataCreated(new RSymbol(name));
     }
 
-- 
GitLab