|
14 | 14 | import com.oracle.truffle.api.dsl.GenerateInline;
|
15 | 15 | import com.oracle.truffle.api.dsl.GenerateUncached;
|
16 | 16 | import com.oracle.truffle.api.dsl.NeverDefault;
|
| 17 | +import com.oracle.truffle.api.dsl.NodeChild; |
| 18 | +import com.oracle.truffle.api.dsl.NodeField; |
17 | 19 | import com.oracle.truffle.api.nodes.Node;
|
18 | 20 | import com.oracle.truffle.api.profiles.InlinedConditionProfile;
|
19 | 21 | import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
|
@@ -391,29 +393,27 @@ Object newRange(RubyClass rubyClass, Object begin, Object end, Object maybeExclu
|
391 | 393 | }
|
392 | 394 | }
|
393 | 395 |
|
394 |
| - public static final class RangeLiteralNode extends RubyContextSourceNode { |
| 396 | + @NodeChild(value = "beginNode", type = RubyNode.class) |
| 397 | + @NodeChild(value = "endNode", type = RubyNode.class) |
| 398 | + @NodeField(name = "excludeEnd", type = Boolean.class) |
| 399 | + public abstract static class RangeLiteralNode extends RubyContextSourceNode { |
395 | 400 |
|
396 |
| - @Child RubyNode beginNode; |
397 |
| - @Child RubyNode endNode; |
398 |
| - @Child NewRangeNode newRangeNode = RangeNodesFactory.NewRangeNodeGen.create(); |
399 |
| - private final boolean excludeEnd; |
| 401 | + abstract RubyNode getBeginNode(); |
400 | 402 |
|
401 |
| - public RangeLiteralNode(RubyNode beginNode, RubyNode endNode, boolean excludeEnd) { |
402 |
| - this.beginNode = beginNode; |
403 |
| - this.endNode = endNode; |
404 |
| - this.excludeEnd = excludeEnd; |
405 |
| - } |
| 403 | + abstract RubyNode getEndNode(); |
406 | 404 |
|
407 |
| - @Override |
408 |
| - public Object execute(VirtualFrame frame) { |
409 |
| - Object begin = beginNode.execute(frame); |
410 |
| - Object end = endNode.execute(frame); |
411 |
| - return newRangeNode.execute(coreLibrary().rangeClass, begin, end, excludeEnd); |
| 405 | + abstract boolean getExcludeEnd(); |
| 406 | + |
| 407 | + @Specialization |
| 408 | + Object doRange(Object begin, Object end, |
| 409 | + @Cached NewRangeNode newRangeNode) { |
| 410 | + return newRangeNode.execute(coreLibrary().rangeClass, begin, end, getExcludeEnd()); |
412 | 411 | }
|
413 | 412 |
|
414 | 413 | @Override
|
415 | 414 | public RubyNode cloneUninitialized() {
|
416 |
| - return new RangeLiteralNode(beginNode.cloneUninitialized(), endNode.cloneUninitialized(), excludeEnd) |
| 415 | + return RangeNodesFactory.RangeLiteralNodeGen |
| 416 | + .create(getBeginNode().cloneUninitialized(), getEndNode().cloneUninitialized(), getExcludeEnd()) |
417 | 417 | .copyFlags(this);
|
418 | 418 | }
|
419 | 419 | }
|
|
0 commit comments