diff graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultDirectCallNode.java @ 15564:a3b0ecef8a15

Truffle: Provide default implementation on non-Graal VMs for stack trace functionality.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Thu, 08 May 2014 22:53:28 +0200
parents 5634b199c4da
children 0a35e2789735
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultDirectCallNode.java	Thu May 08 15:00:52 2014 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultDirectCallNode.java	Thu May 08 22:53:28 2014 +0200
@@ -34,14 +34,40 @@
 public final class DefaultDirectCallNode extends DirectCallNode {
 
     private boolean inliningForced;
+    private final DefaultTruffleRuntime defaultTruffleRuntime;
 
-    public DefaultDirectCallNode(CallTarget target) {
+    public DefaultDirectCallNode(CallTarget target, DefaultTruffleRuntime defaultTruffleRuntime) {
         super(target);
+        this.defaultTruffleRuntime = defaultTruffleRuntime;
     }
 
     @Override
-    public Object call(VirtualFrame frame, Object[] arguments) {
-        return getCurrentCallTarget().call(arguments);
+    public Object call(final VirtualFrame frame, Object[] arguments) {
+        final CallTarget currentCallTarget = defaultTruffleRuntime.getCurrentFrame().getCallTarget();
+        FrameInstance frameInstance = new FrameInstance() {
+
+            public Frame getFrame(FrameAccess access, boolean slowPath) {
+                return frame;
+            }
+
+            public boolean isVirtualFrame() {
+                return false;
+            }
+
+            public Node getCallNode() {
+                return DefaultDirectCallNode.this;
+            }
+
+            public CallTarget getCallTarget() {
+                return currentCallTarget;
+            }
+        };
+        defaultTruffleRuntime.pushFrame(frameInstance);
+        try {
+            return getCurrentCallTarget().call(arguments);
+        } finally {
+            defaultTruffleRuntime.popFrame();
+        }
     }
 
     @Override