From 47c286f0b4f553a43367254eb3b99f383c668e1c Mon Sep 17 00:00:00 2001
From: Christian Humer <christian.humer@oracle.com>
Date: Fri, 9 Sep 2016 17:07:54 +0200
Subject: [PATCH] Fix slow type check for external TruffleObjects.

---
 .../access/variables/ReadVariableNode.java      | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
index 0482836c01..9797aab076 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
@@ -932,12 +932,17 @@ abstract class CheckTypeNode extends RBaseNode {
         return type == RType.Function || type == RType.Closure || type == RType.Builtin || type == RType.Special;
     }
 
+    @Specialization(guards = "isExternalObject(o)")
+    boolean checkType(@SuppressWarnings("unused") TruffleObject o) {
+        return type == RType.Function || type == RType.Closure || type == RType.Builtin || type == RType.Special;
+    }
+
+    protected static boolean isExternalObject(TruffleObject o) {
+        return !(o instanceof RTypedValue);
+    }
+
     @Fallback
-    boolean checkType(Object o) {
-        if (type == RType.Function || type == RType.Closure || type == RType.Builtin || type == RType.Special) {
-            return o instanceof TruffleObject && !(o instanceof RTypedValue);
-        } else {
-            return false;
-        }
+    boolean checkType(@SuppressWarnings("unused") Object o) {
+        return false;
     }
 }
-- 
GitLab