diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java
index 324249e38dd0faea4957f0c13ce9ccb2e940f4f1..70e06d1a1aa32c642169ba05311a2a54ef7a1e2b 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java
@@ -349,7 +349,7 @@ public class EnvFunctions {
             MaterializedFrame matFrame = callerFrame.execute(frame);
 
             matFrame = matFrame instanceof VirtualEvalFrame ? ((VirtualEvalFrame) matFrame).getOriginalFrame() : matFrame;
-            deoptFrameNode.deoptimizeFrame(matFrame);
+            deoptFrameNode.deoptimizeFrame(RArguments.getArguments(matFrame));
             return REnvironment.frameToEnvironment(matFrame);
         }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FrameFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FrameFunctions.java
index 9cc46a846c6409de9e221fff7a041e45ddc4c7ac..418fd51854110fa8e0a83ae1382fb5b290ffc833 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FrameFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FrameFunctions.java
@@ -444,7 +444,7 @@ public class FrameFunctions {
             }
 
             // Deoptimize every promise which is now in this frame, as it might leave it's stack
-            deoptFrameNode.deoptimizeFrame(result.getFrame());
+            deoptFrameNode.deoptimizeFrame(RArguments.getArguments(result.getFrame()));
             return result;
         }
     }
@@ -465,7 +465,7 @@ public class FrameFunctions {
                 RPairList next = result;
                 for (int i = 1; i < depth; i++) {
                     MaterializedFrame mf = helper.getNumberedFrame(frame, i).materialize();
-                    deoptFrameNode.deoptimizeFrame(mf);
+                    deoptFrameNode.deoptimizeFrame(RArguments.getArguments(mf));
                     next.setCar(REnvironment.frameToEnvironment(mf));
                     if (i != depth - 1) {
                         RPairList pl = RDataFactory.createPairList();
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/FunctionExpressionNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/FunctionExpressionNode.java
index f677a2ecfd1eafa8d83508c7a005c345d7ae131d..9c46ea23e765f8d32b78a6df739c19d75b859573 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/FunctionExpressionNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/FunctionExpressionNode.java
@@ -35,6 +35,7 @@ import com.oracle.truffle.r.nodes.function.opt.EagerEvalHelper;
 import com.oracle.truffle.r.nodes.function.visibility.SetVisibilityNode;
 import com.oracle.truffle.r.nodes.instrumentation.RInstrumentation;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
+import com.oracle.truffle.r.runtime.RArguments;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
@@ -68,7 +69,7 @@ public final class FunctionExpressionNode extends RSourceSectionNode implements
         MaterializedFrame matFrame = frame.materialize();
         if (deoptFrameNode != null) {
             // Deoptimize every promise which is now in this frame, as it might leave it's stack
-            deoptFrameNode.deoptimizeFrame(matFrame);
+            deoptFrameNode.deoptimizeFrame(RArguments.getArguments(matFrame));
         }
         if (!initialized) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
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 71968032f21c367cc1e6fedd27b6f6997aff8f04..1019494ed4976ec12d322611581121196262f50a 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
@@ -88,32 +88,18 @@ public final class PromiseHelperNode extends RBaseNode {
          * Guarantees, that all {@link RPromise}s in frame are deoptimized and thus are safe to
          * leave it's stack-branch.
          *
-         * @param frame The frame to check for {@link RPromise}s to deoptimize
+         * @param arguments The frame's arguments, which will be checked for {@link RPromise}s to deoptimize
          * @return Whether there was at least on {@link RPromise} which needed to be deoptimized.
          */
-        @TruffleBoundary
-        public boolean deoptimizeFrame(MaterializedFrame frame) {
+        public boolean deoptimizeFrame(Object[] arguments) {
             boolean deoptOne = false;
-            for (FrameSlot slot : frame.getFrameDescriptor().getSlots().toArray(new FrameSlot[0])) {
-                // We're only interested in RPromises
-                if (slot.getKind() != FrameSlotKind.Object || !(slot.getIdentifier() instanceof String)) {
-                    continue;
-                }
-
-                // Try to read it...
-                try {
-                    Object value = FrameSlotChangeMonitor.getObject(slot, frame);
-
-                    // If it's a promise, deoptimize it!
-                    if (value instanceof RPromise) {
-                        RPromise promise = (RPromise) value;
-                        if (!promise.isEvaluated()) {
-                            deoptOne |= deoptimize(promise);
-                        }
+            for (Object value : arguments) {
+                // If it's a promise, deoptimize it!
+                if (value instanceof RPromise) {
+                    RPromise promise = (RPromise) value;
+                    if (!promise.isEvaluated()) {
+                        deoptOne |= deoptimize(promise);
                     }
-                } catch (FrameSlotTypeException err) {
-                    // Should not happen after former check on FrameSlotKind!
-                    throw RInternalError.shouldNotReachHere();
                 }
             }
             return deoptOne;