Mercurial > hg > graal-jvmci-8
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 |