comparison 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
comparison
equal deleted inserted replaced
15562:de3dca7cc6fd 15564:a3b0ecef8a15
32 * This is runtime specific API. Do not use in a guest language. 32 * This is runtime specific API. Do not use in a guest language.
33 */ 33 */
34 public final class DefaultDirectCallNode extends DirectCallNode { 34 public final class DefaultDirectCallNode extends DirectCallNode {
35 35
36 private boolean inliningForced; 36 private boolean inliningForced;
37 private final DefaultTruffleRuntime defaultTruffleRuntime;
37 38
38 public DefaultDirectCallNode(CallTarget target) { 39 public DefaultDirectCallNode(CallTarget target, DefaultTruffleRuntime defaultTruffleRuntime) {
39 super(target); 40 super(target);
41 this.defaultTruffleRuntime = defaultTruffleRuntime;
40 } 42 }
41 43
42 @Override 44 @Override
43 public Object call(VirtualFrame frame, Object[] arguments) { 45 public Object call(final VirtualFrame frame, Object[] arguments) {
44 return getCurrentCallTarget().call(arguments); 46 final CallTarget currentCallTarget = defaultTruffleRuntime.getCurrentFrame().getCallTarget();
47 FrameInstance frameInstance = new FrameInstance() {
48
49 public Frame getFrame(FrameAccess access, boolean slowPath) {
50 return frame;
51 }
52
53 public boolean isVirtualFrame() {
54 return false;
55 }
56
57 public Node getCallNode() {
58 return DefaultDirectCallNode.this;
59 }
60
61 public CallTarget getCallTarget() {
62 return currentCallTarget;
63 }
64 };
65 defaultTruffleRuntime.pushFrame(frameInstance);
66 try {
67 return getCurrentCallTarget().call(arguments);
68 } finally {
69 defaultTruffleRuntime.popFrame();
70 }
45 } 71 }
46 72
47 @Override 73 @Override
48 public void forceInlining() { 74 public void forceInlining() {
49 inliningForced = true; 75 inliningForced = true;