# HG changeset patch # User Thomas Wuerthinger # Date 1397667114 -7200 # Node ID 258e3e0b5e2edc3ebf8fd0492cc42d2e6221e9eb # Parent 7bc92bdfd3225b03774478a9d230cfc4714f17e9 Change RootCallTarget from an abstract class into an interface. diff -r 7bc92bdfd322 -r 258e3e0b5e2e graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotFrameInstance.java --- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotFrameInstance.java Wed Apr 16 18:33:10 2014 +0200 +++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotFrameInstance.java Wed Apr 16 18:51:54 2014 +0200 @@ -154,7 +154,7 @@ public static final Method METHOD; static { try { - METHOD = RootCallTarget.class.getDeclaredMethod("callProxy", VirtualFrame.class); + METHOD = OptimizedCallTarget.class.getDeclaredMethod("callProxy", VirtualFrame.class); } catch (NoSuchMethodException | SecurityException e) { throw new GraalInternalError(e); } diff -r 7bc92bdfd322 -r 258e3e0b5e2e graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Wed Apr 16 18:33:10 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Wed Apr 16 18:51:54 2014 +0200 @@ -38,7 +38,7 @@ /** * Call target that is optimized by Graal upon surpassing a specific invocation threshold. */ -public abstract class OptimizedCallTarget extends RootCallTarget implements LoopCountReceiver, ReplaceObserver { +public abstract class OptimizedCallTarget extends InstalledCode implements RootCallTarget, LoopCountReceiver, ReplaceObserver { protected static final PrintStream OUT = TTY.out().out(); @@ -51,8 +51,16 @@ private OptimizedCallTarget splitSource; private final AtomicInteger callSitesKnown = new AtomicInteger(0); + private final RootNode rootNode; + + public final RootNode getRootNode() { + return rootNode; + } + public OptimizedCallTarget(RootNode rootNode, int invokeCounter, int compilationThreshold, boolean compilationEnabled, CompilationPolicy compilationPolicy) { - super(rootNode); + this.rootNode = rootNode; + this.rootNode.adoptChildren(); + this.rootNode.setCallTarget(this); this.installedCode = new InstalledCode(); this.compilationEnabled = compilationEnabled; this.compilationPolicy = compilationPolicy; @@ -62,6 +70,15 @@ } } + protected final Object callProxy(VirtualFrame frame) { + try { + return getRootNode().execute(frame); + } finally { + // this assertion is needed to keep the values from being cleared as non-live locals + assert frame != null && this != null; + } + } + public final int getKnownCallSiteCount() { return callSitesKnown.get(); } @@ -84,7 +101,7 @@ @Override public String toString() { - String superString = super.toString(); + String superString = rootNode.toString(); if (installedCode.isValid()) { superString += " "; } diff -r 7bc92bdfd322 -r 258e3e0b5e2e graal/com.oracle.truffle.api/src/com/oracle/truffle/api/RootCallTarget.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/RootCallTarget.java Wed Apr 16 18:33:10 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/RootCallTarget.java Wed Apr 16 18:51:54 2014 +0200 @@ -24,38 +24,13 @@ */ package com.oracle.truffle.api; -import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; /** * Represents the target of a call to a {@link RootNode}, i.e., to another tree of nodes. Instances * of this class can be created using {@link TruffleRuntime#createCallTarget(RootNode)}. */ -public abstract class RootCallTarget implements CallTarget { - - private final RootNode rootNode; - - public RootCallTarget(RootNode function) { - this.rootNode = function; - this.rootNode.adoptChildren(); - this.rootNode.setCallTarget(this); - } +public interface RootCallTarget extends CallTarget { - @Override - public String toString() { - return rootNode.toString(); - } - - public final RootNode getRootNode() { - return rootNode; - } - - protected final Object callProxy(VirtualFrame frame) { - try { - return getRootNode().execute(frame); - } finally { - // this assertion is needed to keep the values from being cleared as non-live locals - assert frame != null && this != null; - } - } + RootNode getRootNode(); } diff -r 7bc92bdfd322 -r 258e3e0b5e2e graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java Wed Apr 16 18:33:10 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java Wed Apr 16 18:51:54 2014 +0200 @@ -32,15 +32,28 @@ * This is an implementation-specific class. Do not use or instantiate it. Instead, use * {@link TruffleRuntime#createCallTarget(RootNode)} to create a {@link RootCallTarget}. */ -public class DefaultCallTarget extends RootCallTarget { +public class DefaultCallTarget implements RootCallTarget { + + private final RootNode rootNode; - protected DefaultCallTarget(RootNode function) { - super(function); + public DefaultCallTarget(RootNode function) { + this.rootNode = function; + this.rootNode.adoptChildren(); + this.rootNode.setCallTarget(this); + } + + @Override + public String toString() { + return rootNode.toString(); + } + + public final RootNode getRootNode() { + return rootNode; } @Override public Object call(Object... args) { VirtualFrame frame = new DefaultVirtualFrame(getRootNode().getFrameDescriptor(), args); - return callProxy(frame); + return getRootNode().execute(frame); } }