From 4f855458a5efb0ca77078ee4cead4c66e8139f78 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Wed, 5 Oct 2016 16:39:34 +0200
Subject: [PATCH] add missing transferToInterpreter, remove Fallback in
 GetNonSharedNode

---
 .../r/nodes/builtin/base/IsFiniteFunctions.java    |  2 ++
 .../oracle/truffle/r/nodes/builtin/base/Rank.java  |  4 +++-
 .../r/nodes/builtin/base/StandardGeneric.java      |  1 +
 .../truffle/r/nodes/unary/GetNonSharedNode.java    | 14 ++++++++++++--
 4 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsFiniteFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsFiniteFunctions.java
index 600bd243f8..32634f3400 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsFiniteFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsFiniteFunctions.java
@@ -29,6 +29,7 @@ import java.util.Arrays;
 import java.util.function.DoublePredicate;
 import java.util.function.IntPredicate;
 
+import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
@@ -82,6 +83,7 @@ public class IsFiniteFunctions {
         @Fallback
         protected Object doIsFiniteOther(Object x) {
             if (typeofNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
                 typeofNode = insert(TypeofNodeGen.create());
             }
             String type = typeofNode.execute(x).getName();
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java
index 94e23564e1..f855a8a774 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java
@@ -31,13 +31,13 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
 import java.util.function.Function;
 
+import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.BranchProfile;
 import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.builtin.base.OrderNodeGen.CmpNodeGen;
 import com.oracle.truffle.r.nodes.builtin.base.OrderNodeGen.OrderVector1NodeGen;
-import com.oracle.truffle.r.nodes.builtin.casts.Filter;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
@@ -79,6 +79,7 @@ public abstract class Rank extends RBuiltinNode {
 
     private Order.OrderVector1Node initOrderVector1() {
         if (orderVector1Node == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             orderVector1Node = insert(OrderVector1NodeGen.create(false));
         }
         return orderVector1Node;
@@ -86,6 +87,7 @@ public abstract class Rank extends RBuiltinNode {
 
     private Order.CmpNode initOrderCmp() {
         if (orderCmpNode == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             orderCmpNode = insert(CmpNodeGen.create());
         }
         return orderCmpNode;
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java
index 1566030a47..fb44ec8b41 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java
@@ -84,6 +84,7 @@ public abstract class StandardGeneric extends RBuiltinNode {
 
     private String argClass(Object arg) {
         if (classNode == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             classNode = insert(ClassHierarchyScalarNodeGen.create());
         }
         return classNode.executeString(arg);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
index 82702afdce..b15d5556ee 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.nodes.unary;
 
-import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.NodeChild;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.ValueProfile;
@@ -39,12 +38,23 @@ public abstract class GetNonSharedNode extends RNode implements RSyntaxNode {
 
     private final ValueProfile shareableTypeProfile = ValueProfile.createClassProfile();
 
+    protected abstract RNode getN();
+
+    @Override
+    protected RSyntaxNode getRSyntaxNode() {
+        return getN().asRSyntaxNode();
+    }
+
     @Specialization
     protected RTypedValue getNonShared(RShareable shareable) {
         return shareableTypeProfile.profile(shareable).getNonShared();
     }
 
-    @Fallback
+    protected static boolean isRShareable(Object o) {
+        return o instanceof RShareable;
+    }
+
+    @Specialization(guards = "!isRShareable(o)")
     protected Object getNonShared(Object o) {
         return o;
     }
-- 
GitLab