comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/CallNode.java @ 13811:641f22b1c6b8

Truffle: further fixes to the new CallNode.
author Christian Humer <christian.humer@gmail.com>
date Wed, 29 Jan 2014 20:49:09 +0100
parents 3840d61e0e68
children e86d32f4803f
comparison
equal deleted inserted replaced
13810:44bcfc983adb 13811:641f22b1c6b8
83 * @return <code>true</code> if the inlining operation was successful. 83 * @return <code>true</code> if the inlining operation was successful.
84 */ 84 */
85 public abstract boolean inline(); 85 public abstract boolean inline();
86 86
87 /** 87 /**
88 * Returns the inlined root node if the call node was inlined. If the {@link CallNode} was not
89 * inlined <code>null</code> is returned.
90 *
91 * @return the inlined root node returned by {@link RootNode#inline()}
92 */
93 public RootNode getInlinedRoot() {
94 return null;
95 }
96
97 /**
88 * Creates a new {@link CallNode} using a {@link CallTarget}. 98 * Creates a new {@link CallNode} using a {@link CallTarget}.
89 * 99 *
90 * @param target the {@link CallTarget} to call 100 * @param target the {@link CallTarget} to call
91 * @return a call node that calls the provided target 101 * @return a call node that calls the provided target
92 */ 102 */
114 public static void internalResetCallCount(CallNode callNode) { 124 public static void internalResetCallCount(CallNode callNode) {
115 if (callNode.isInlinable() && !callNode.isInlined()) { 125 if (callNode.isInlinable() && !callNode.isInlined()) {
116 ((InlinableCallNode) callNode).resetCallCount(); 126 ((InlinableCallNode) callNode).resetCallCount();
117 return; 127 return;
118 } 128 }
119 throw new UnsupportedOperationException();
120 } 129 }
121 130
122 private static boolean isInlinable(CallTarget callTarget) { 131 private static boolean isInlinable(CallTarget callTarget) {
123 if (callTarget instanceof DefaultCallTarget) { 132 if (callTarget instanceof DefaultCallTarget) {
124 return (((DefaultCallTarget) callTarget).getRootNode()).isInlinable(); 133 return (((DefaultCallTarget) callTarget).getRootNode()).isInlinable();
125 } 134 }
126 return false; 135 return false;
136 }
137
138 @Override
139 public String toString() {
140 return getParent() != null ? getParent().toString() : super.toString();
127 } 141 }
128 142
129 static final class DefaultCallNode extends CallNode { 143 static final class DefaultCallNode extends CallNode {
130 144
131 public DefaultCallNode(CallTarget target) { 145 public DefaultCallNode(CallTarget target) {
172 186
173 @Override 187 @Override
174 public boolean inline() { 188 public boolean inline() {
175 DefaultCallTarget defaultTarget = (DefaultCallTarget) getCallTarget(); 189 DefaultCallTarget defaultTarget = (DefaultCallTarget) getCallTarget();
176 RootNode originalRootNode = defaultTarget.getRootNode(); 190 RootNode originalRootNode = defaultTarget.getRootNode();
177 boolean inlined = false;
178 if (originalRootNode.isInlinable()) { 191 if (originalRootNode.isInlinable()) {
179 RootNode inlinedRootNode = defaultTarget.getRootNode().inline(); 192 RootNode inlinedRootNode = defaultTarget.getRootNode().inline();
193 inlinedRootNode.setCallTarget(callTarget);
194 inlinedRootNode.setParentInlinedCall(this);
180 replace(new InlinedCallNode(defaultTarget, inlinedRootNode)); 195 replace(new InlinedCallNode(defaultTarget, inlinedRootNode));
181 inlined = true; 196 return true;
182 } 197 }
183 return inlined; 198 return false;
184 } 199 }
185 200
186 @Override 201 @Override
187 public boolean isInlined() { 202 public boolean isInlined() {
188 return false; 203 return false;
223 public InlinedCallNode copy() { 238 public InlinedCallNode copy() {
224 return new InlinedCallNode((DefaultCallTarget) getCallTarget(), NodeUtil.cloneNode(inlinedRoot)); 239 return new InlinedCallNode((DefaultCallTarget) getCallTarget(), NodeUtil.cloneNode(inlinedRoot));
225 } 240 }
226 241
227 @Override 242 @Override
243 public RootNode getInlinedRoot() {
244 return inlinedRoot;
245 }
246
247 @Override
228 public boolean inline() { 248 public boolean inline() {
229 return false; 249 return false;
230 } 250 }
231 251
232 @Override 252 @Override