Skip to content

Commit c27c9b3

Browse files
committed
IfNode is converted to DSL node
1 parent 0d7d28f commit c27c9b3

File tree

2 files changed

+18
-22
lines changed

2 files changed

+18
-22
lines changed

src/main/java/org/truffleruby/language/control/IfNode.java

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,38 @@
99
*/
1010
package org.truffleruby.language.control;
1111

12-
import com.oracle.truffle.api.profiles.CountingConditionProfile;
12+
import com.oracle.truffle.api.dsl.Cached;
13+
import com.oracle.truffle.api.dsl.Specialization;
14+
import com.oracle.truffle.api.profiles.InlinedCountingConditionProfile;
1315
import org.truffleruby.core.cast.BooleanCastNode;
14-
import org.truffleruby.core.cast.BooleanCastNodeGen;
1516
import org.truffleruby.language.RubyContextSourceNode;
1617
import org.truffleruby.language.RubyNode;
1718

1819
import com.oracle.truffle.api.frame.VirtualFrame;
1920

20-
public class IfNode extends RubyContextSourceNode {
21+
public abstract class IfNode extends RubyContextSourceNode {
2122

22-
@Child private BooleanCastNode condition;
23+
@Child private RubyNode condition;
2324
@Child private RubyNode thenBody;
2425

25-
private final CountingConditionProfile conditionProfile = CountingConditionProfile.create();
26-
2726
public IfNode(RubyNode condition, RubyNode thenBody) {
28-
this(BooleanCastNodeGen.create(condition), thenBody);
29-
}
30-
31-
private IfNode(BooleanCastNode condition, RubyNode thenBody) {
3227
this.condition = condition;
3328
this.thenBody = thenBody;
3429
}
3530

36-
@Override
37-
public Object execute(VirtualFrame frame) {
38-
if (conditionProfile.profile(condition.execute(frame))) {
31+
@Specialization
32+
protected Object doIf(VirtualFrame frame,
33+
@Cached BooleanCastNode booleanCastNode,
34+
@Cached InlinedCountingConditionProfile conditionProfile) {
35+
final var conditionAsBoolean = booleanCastNode.execute(condition.execute(frame));
36+
if (conditionProfile.profile(this, conditionAsBoolean)) {
3937
return thenBody.execute(frame);
4038
} else {
4139
return nil;
4240
}
4341
}
4442

43+
4544
@Override
4645
public boolean canSubsumeFollowing() {
4746
return !thenBody.isContinuable();
@@ -54,17 +53,14 @@ public RubyNode subsumeFollowing(RubyNode following) {
5453

5554
@Override
5655
public RubyNode simplifyAsTailExpression() {
57-
return new IfNode(condition, thenBody.simplifyAsTailExpression()).copySourceSection(this);
56+
return IfNodeGen.create(condition, thenBody.simplifyAsTailExpression()).copySourceSection(this);
5857
}
5958

60-
private RubyNode getConditionBeforeCasting() {
61-
return condition.getValueNode();
62-
}
6359

6460
@Override
6561
public RubyNode cloneUninitialized() {
66-
var copy = new IfNode(
67-
getConditionBeforeCasting().cloneUninitialized(),
62+
var copy = IfNodeGen.create(
63+
condition.cloneUninitialized(),
6864
thenBody.cloneUninitialized());
6965
return copy.copyFlags(this);
7066
}

src/main/java/org/truffleruby/parser/BodyTranslator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
import org.truffleruby.language.control.DynamicReturnNode;
7777
import org.truffleruby.language.control.FrameOnStackNode;
7878
import org.truffleruby.language.control.IfElseNode;
79-
import org.truffleruby.language.control.IfNode;
79+
import org.truffleruby.language.control.IfNodeGen;
8080
import org.truffleruby.language.control.InvalidReturnNode;
8181
import org.truffleruby.language.control.LocalReturnNode;
8282
import org.truffleruby.language.control.NextNode;
@@ -1813,7 +1813,7 @@ public RubyNode visitIfNode(IfParseNode node) {
18131813
ret.unsafeSetSourceSection(sourceSection);
18141814
} else if (thenBody != null) {
18151815
final RubyNode thenBodyTranslated = thenBody.accept(this);
1816-
ret = new IfNode(condition, thenBodyTranslated);
1816+
ret = IfNodeGen.create(condition, thenBodyTranslated);
18171817
ret.unsafeSetSourceSection(sourceSection);
18181818
} else if (elseBody != null) {
18191819
final RubyNode elseBodyTranslated = elseBody.accept(this);
@@ -2308,7 +2308,7 @@ public RubyNode visitOpAsgnNode(OpAsgnParseNode node) {
23082308
final SourceIndexLength sourceSection = pos;
23092309

23102310
if (node.isLazy()) {
2311-
body = new IfNode(
2311+
body = IfNodeGen.create(
23122312
NotNodeGen.create(new IsNilNode(receiverValue.get(sourceSection).accept(this))),
23132313
body);
23142314
body.unsafeSetSourceSection(sourceSection);

0 commit comments

Comments
 (0)