9
9
*/
10
10
package org .truffleruby .language .locals ;
11
11
12
+ import com .oracle .truffle .api .dsl .Cached ;
13
+ import com .oracle .truffle .api .dsl .Specialization ;
12
14
import com .oracle .truffle .api .frame .Frame ;
13
15
import org .truffleruby .core .cast .BooleanCastNode ;
14
- import org .truffleruby .core .cast .BooleanCastNodeGen ;
15
16
import org .truffleruby .language .RubyContextSourceNode ;
16
17
import org .truffleruby .language .RubyNode ;
17
18
18
19
import com .oracle .truffle .api .frame .VirtualFrame ;
19
20
import org .truffleruby .language .arguments .RubyArguments ;
20
21
21
- public class FlipFlopNode extends RubyContextSourceNode {
22
+ public abstract class FlipFlopNode extends RubyContextSourceNode {
22
23
24
+ @ Child private RubyNode begin ;
25
+ @ Child private RubyNode end ;
23
26
private final boolean exclusive ;
24
-
25
- @ Child private BooleanCastNode begin ;
26
- @ Child private BooleanCastNode end ;
27
27
private final int frameLevel ;
28
28
private final int frameSlot ;
29
29
@@ -33,37 +33,40 @@ public FlipFlopNode(
33
33
boolean exclusive ,
34
34
int frameLevel ,
35
35
int frameSlot ) {
36
+ this .begin = begin ;
37
+ this .end = end ;
36
38
this .exclusive = exclusive ;
37
- this .begin = BooleanCastNodeGen .create (begin );
38
- this .end = BooleanCastNodeGen .create (end );
39
39
this .frameLevel = frameLevel ;
40
40
this .frameSlot = frameSlot ;
41
41
}
42
42
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
+
45
48
if (exclusive ) {
46
49
if (getState (frame )) {
47
- if (end .execute (frame )) {
50
+ if (endCast . execute ( end .execute (frame ) )) {
48
51
setState (frame , false );
49
52
}
50
53
51
54
return true ;
52
55
} else {
53
- final boolean newState = begin .execute (frame );
56
+ final boolean newState = beginCast . execute ( begin .execute (frame ) );
54
57
setState (frame , newState );
55
58
return newState ;
56
59
}
57
60
} else {
58
61
if (getState (frame )) {
59
- if (end .execute (frame )) {
62
+ if (endCast . execute ( end .execute (frame ) )) {
60
63
setState (frame , false );
61
64
}
62
65
63
66
return true ;
64
67
} 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 ) ));
67
70
return true ;
68
71
}
69
72
@@ -84,9 +87,9 @@ private void setState(VirtualFrame frame, boolean state) {
84
87
85
88
@ Override
86
89
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 (),
90
93
exclusive ,
91
94
frameLevel ,
92
95
frameSlot );
0 commit comments