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 15afd7016c8c3d076ca9af1e4cb7419320b4aa73..6e2f7dda034d4056c45c345461a5f00d5ab29686 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
@@ -544,9 +544,6 @@ public class FrameFunctions {
             RCaller call = RArguments.getCall(frame);
             int i = 0;
             while (i < n + 1) {
-                if (call.hasInternalParent()) {
-                    i--;    // in this loop iteration, we deal with the parent, but do not count it
-                }
                 call = call.getParent();
                 if (call == null) {
                     nullCallerProfile.enter();
@@ -616,7 +613,7 @@ public class FrameFunctions {
                         RCaller currentCall = RArguments.getCall(f);
                         if (!currentCall.isPromise() && currentCall.getDepth() <= depth) {
                             int currentCallIdx = currentCall.getDepth() - 1;
-                            while (currentCall != null && (currentCall.hasInternalParent() || currentCall.isPromise())) {
+                            while (currentCall != null && (currentCall.isPromise())) {
                                 currentCall = currentCall.getParent();
                             }
                             result[currentCallIdx] = currentCall == null ? 0 : currentCall.getParent().getDepth();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RCaller.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RCaller.java
index cf26ddb47f05a646d297a906ddfed00ef9c3721a..68acee4338a7f57060cf575d9039893c72a1e456 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RCaller.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RCaller.java
@@ -54,30 +54,24 @@ public final class RCaller {
     private final RCaller parent;
     /**
      * The payload can be an RSyntaxNode, a {@link Supplier}, or an {@link RCaller} (which marks
-     * promise evaluation frames).
+     * promise evaluation frames). Payload represents the syntax (AST) of how the function was
+     * invoked. If the function was invoked via regular call node, then the syntax can be that call
+     * node (RSyntaxNode case), if the function was invoked by other means and we do not have the
+     * actual syntax for the invocation, we only provide it lazily via Supplier, so that we do not
+     * have to always construct the AST nodes.
      */
     private final Object payload;
-    /**
-     * Marks those callers whose parent should not be taken into account when iterating R level
-     * frames using e.g. {@code parent.frame()}. This is the case for function invoked through
-     * {@code do.call} -- R pretends that they were called by the caller of {@code do.call} so that
-     * code like {@code eval(formula, parent.frame(2))} gives the same results regardless of whether
-     * the function was invoked directly or through {@code do.call}.
-     */
-    private final boolean parentIsInternal;
 
-    private RCaller(Frame callingFrame, Object nodeOrSupplier, boolean parentIsInternal) {
+    private RCaller(Frame callingFrame, Object nodeOrSupplier) {
         this.depth = depthFromFrame(callingFrame);
         this.parent = parentFromFrame(callingFrame);
         this.payload = nodeOrSupplier;
-        this.parentIsInternal = parentIsInternal;
     }
 
     private RCaller(int depth, RCaller parent, Object nodeOrSupplier) {
         this.depth = depth;
         this.parent = parent;
         this.payload = nodeOrSupplier;
-        this.parentIsInternal = false;
     }
 
     private static int depthFromFrame(Frame callingFrame) {
@@ -88,17 +82,6 @@ public final class RCaller {
         return callingFrame == null ? null : RArguments.getCall(callingFrame);
     }
 
-    private RCaller(int depth, RCaller parent, Object nodeOrSupplier, boolean parentIsInternal) {
-        this.depth = depth;
-        this.parent = parent;
-        this.payload = nodeOrSupplier;
-        this.parentIsInternal = parentIsInternal;
-    }
-
-    public RCaller withInternalParent() {
-        return new RCaller(depth, parent, payload, true);
-    }
-
     public int getDepth() {
         return depth;
     }
@@ -107,10 +90,6 @@ public final class RCaller {
         return parent;
     }
 
-    public boolean hasInternalParent() {
-        return parentIsInternal;
-    }
-
     public RSyntaxElement getSyntaxNode() {
         assert payload != null && !(payload instanceof RCaller) : payload == null ? "null RCaller" : "promise RCaller";
         return payload instanceof RSyntaxElement ? (RSyntaxElement) payload : (RSyntaxElement) ((Supplier<?>) payload).get();
@@ -129,47 +108,42 @@ public final class RCaller {
     }
 
     public static RCaller createInvalid(Frame callingFrame) {
-        return new RCaller(callingFrame, null, false);
+        return new RCaller(callingFrame, null);
     }
 
     public static RCaller createInvalid(Frame callingFrame, RCaller parent) {
-        return new RCaller(depthFromFrame(callingFrame), parent, null, false);
+        return new RCaller(depthFromFrame(callingFrame), parent, null);
     }
 
     public static RCaller create(Frame callingFrame, RSyntaxElement node) {
         assert node != null;
-        return new RCaller(callingFrame, node, false);
+        return new RCaller(callingFrame, node);
     }
 
     public static RCaller create(Frame callingFrame, RCaller parent, RSyntaxElement node) {
         assert node != null;
-        return new RCaller(depthFromFrame(callingFrame), parent, node, false);
-    }
-
-    public static RCaller createWithInternalParent(Frame callingFrame, Supplier<RSyntaxElement> supplier) {
-        assert supplier != null;
-        return new RCaller(callingFrame, supplier, true);
+        return new RCaller(depthFromFrame(callingFrame), parent, node);
     }
 
     public static RCaller create(Frame callingFrame, Supplier<RSyntaxElement> supplier) {
         assert supplier != null;
-        return new RCaller(callingFrame, supplier, false);
+        return new RCaller(callingFrame, supplier);
     }
 
     public static RCaller create(int depth, RCaller parent, Object payload) {
         assert payload != null;
-        return new RCaller(depth, parent, payload, false);
+        return new RCaller(depth, parent, payload);
     }
 
     public static RCaller create(Frame callingFrame, RCaller parent, Supplier<RSyntaxElement> supplier) {
         assert supplier != null;
-        return new RCaller(depthFromFrame(callingFrame), parent, supplier, false);
+        return new RCaller(depthFromFrame(callingFrame), parent, supplier);
     }
 
     public static RCaller createForPromise(RCaller originalCaller, Frame frame) {
         int newDepth = frame == null ? 0 : RArguments.getDepth(frame);
         RCaller originalCall = frame == null ? null : RArguments.getCall(frame);
-        return new RCaller(newDepth, originalCaller, originalCall, false);
+        return new RCaller(newDepth, originalCaller, originalCall);
     }
 
     public boolean getVisibility() {
@@ -179,8 +153,4 @@ public final class RCaller {
     public void setVisibility(boolean visibility) {
         this.visibility = visibility;
     }
-
-    public Object getPayload() {
-        return payload;
-    }
 }