From fa9d20e1b33d2d759c8d811223c13c8d354b8398 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Wed, 12 Apr 2017 13:23:26 +0200
Subject: [PATCH] only deoptimize frame slots with String identifiers

---
 .../r/nodes/function/PromiseHelperNode.java        |  2 +-
 .../runtime/env/frame/FrameSlotChangeMonitor.java  | 14 +++++---------
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java
index f2407db524..b635984a2c 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java
@@ -96,7 +96,7 @@ public class PromiseHelperNode extends RBaseNode {
             boolean deoptOne = false;
             for (FrameSlot slot : frame.getFrameDescriptor().getSlots().toArray(new FrameSlot[0])) {
                 // We're only interested in RPromises
-                if (slot.getKind() != FrameSlotKind.Object) {
+                if (slot.getKind() != FrameSlotKind.Object || !(slot.getIdentifier() instanceof String)) {
                     continue;
                 }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/frame/FrameSlotChangeMonitor.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/frame/FrameSlotChangeMonitor.java
index 886f4922b6..cdb9f13b1c 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/frame/FrameSlotChangeMonitor.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/frame/FrameSlotChangeMonitor.java
@@ -681,7 +681,7 @@ public final class FrameSlotChangeMonitor {
         Object info = slot.getInfo();
         if (!(info instanceof FrameSlotInfoImpl)) {
             CompilerDirectives.transferToInterpreter();
-            throw RInternalError.shouldNotReachHere("Each FrameSlot should hold a FrameSlotInfo in its info field!");
+            throw RInternalError.shouldNotReachHere("Each FrameSlot should hold a FrameSlotInfo in its info field! " + slot.getIdentifier().getClass() + " " + slot.getIdentifier());
         }
         return (FrameSlotInfoImpl) info;
     }
@@ -703,14 +703,10 @@ public final class FrameSlotChangeMonitor {
         if (frameSlot != null) {
             return frameSlot;
         } else {
-            if (identifier instanceof String || ((RFrameSlot) identifier).isMultiSlot()) {
-                FrameDescriptorMetaData metaData = getMetaData(fd);
-                invalidateNames(metaData, Arrays.asList(identifier));
-                return fd.addFrameSlot(identifier, new FrameSlotInfoImpl(metaData.singletonFrame != null, "global".equals(metaData.name), identifier, metaData.name.startsWith("<new-env-")),
-                                initialKind);
-            } else {
-                return fd.addFrameSlot(identifier, initialKind);
-            }
+            FrameDescriptorMetaData metaData = getMetaData(fd);
+            invalidateNames(metaData, Arrays.asList(identifier));
+            return fd.addFrameSlot(identifier, new FrameSlotInfoImpl(metaData.singletonFrame != null, "global".equals(metaData.name), identifier, metaData.name.startsWith("<new-env-")),
+                            initialKind);
         }
     }
 
-- 
GitLab