Skip to content

Commit 8cd0272

Browse files
committed
Refactor FlipFlopNode
1 parent 26ba660 commit 8cd0272

File tree

2 files changed

+23
-19
lines changed

2 files changed

+23
-19
lines changed

src/main/java/org/truffleruby/language/locals/FlipFlopNode.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@
99
*/
1010
package org.truffleruby.language.locals;
1111

12+
import com.oracle.truffle.api.dsl.Cached;
13+
import com.oracle.truffle.api.dsl.Specialization;
1214
import com.oracle.truffle.api.frame.Frame;
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
import org.truffleruby.language.arguments.RubyArguments;
2021

21-
public class FlipFlopNode extends RubyContextSourceNode {
22+
public abstract class FlipFlopNode extends RubyContextSourceNode {
2223

24+
@Child private RubyNode begin;
25+
@Child private RubyNode end;
2326
private final boolean exclusive;
24-
25-
@Child private BooleanCastNode begin;
26-
@Child private BooleanCastNode end;
2727
private final int frameLevel;
2828
private final int frameSlot;
2929

@@ -33,37 +33,40 @@ public FlipFlopNode(
3333
boolean exclusive,
3434
int frameLevel,
3535
int frameSlot) {
36+
this.begin = begin;
37+
this.end = end;
3638
this.exclusive = exclusive;
37-
this.begin = BooleanCastNodeGen.create(begin);
38-
this.end = BooleanCastNodeGen.create(end);
3939
this.frameLevel = frameLevel;
4040
this.frameSlot = frameSlot;
4141
}
4242

43-
@Override
44-
public Object execute(VirtualFrame frame) {
43+
@Specialization
44+
protected Object doFlipFlop(VirtualFrame frame,
45+
@Cached BooleanCastNode beginCast,
46+
@Cached BooleanCastNode endCast) {
47+
4548
if (exclusive) {
4649
if (getState(frame)) {
47-
if (end.execute(frame)) {
50+
if (endCast.execute(end.execute(frame))) {
4851
setState(frame, false);
4952
}
5053

5154
return true;
5255
} else {
53-
final boolean newState = begin.execute(frame);
56+
final boolean newState = beginCast.execute(begin.execute(frame));
5457
setState(frame, newState);
5558
return newState;
5659
}
5760
} else {
5861
if (getState(frame)) {
59-
if (end.execute(frame)) {
62+
if (endCast.execute(end.execute(frame))) {
6063
setState(frame, false);
6164
}
6265

6366
return true;
6467
} else {
65-
if (begin.execute(frame)) {
66-
setState(frame, !end.execute(frame));
68+
if (beginCast.execute(begin.execute(frame))) {
69+
setState(frame, !endCast.execute(end.execute(frame)));
6770
return true;
6871
}
6972

@@ -84,9 +87,9 @@ private void setState(VirtualFrame frame, boolean state) {
8487

8588
@Override
8689
public RubyNode cloneUninitialized() {
87-
var copy = new FlipFlopNode(
88-
begin.getValueNode().cloneUninitialized(),
89-
end.getValueNode().cloneUninitialized(),
90+
var copy = FlipFlopNodeGen.create(
91+
begin.cloneUninitialized(),
92+
end.cloneUninitialized(),
9093
exclusive,
9194
frameLevel,
9295
frameSlot);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
import org.truffleruby.language.literal.TruffleInternalModuleLiteralNode;
117117
import org.truffleruby.language.literal.TruffleKernelOperationsModuleLiteralNode;
118118
import org.truffleruby.language.locals.FindDeclarationVariableNodes.FrameSlotAndDepth;
119-
import org.truffleruby.language.locals.FlipFlopNode;
119+
import org.truffleruby.language.locals.FlipFlopNodeGen;
120120
import org.truffleruby.language.locals.InitFlipFlopSlotNode;
121121
import org.truffleruby.language.locals.ReadLocalNode;
122122
import org.truffleruby.language.locals.WriteLocalNode;
@@ -1503,7 +1503,8 @@ public RubyNode visitFlipNode(FlipParseNode node) {
15031503

15041504
final FrameSlotAndDepth slotAndDepth = createFlipFlopState(sourceSection, 0);
15051505

1506-
final RubyNode ret = new FlipFlopNode(begin, end, node.isExclusive(), slotAndDepth.depth, slotAndDepth.slot);
1506+
final RubyNode ret = FlipFlopNodeGen.create(begin, end, node.isExclusive(), slotAndDepth.depth,
1507+
slotAndDepth.slot);
15071508
ret.unsafeSetSourceSection(sourceSection);
15081509
return addNewlineIfNeeded(node, ret);
15091510
}

0 commit comments

Comments
 (0)