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