9
9
*/
10
10
package org .truffleruby .language .control ;
11
11
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 ;
13
15
import org .truffleruby .core .cast .BooleanCastNode ;
14
16
import org .truffleruby .language .RubyContextSourceNode ;
15
17
import org .truffleruby .language .RubyNode ;
16
18
17
19
import com .oracle .truffle .api .frame .VirtualFrame ;
18
20
19
- public class OrNode extends RubyContextSourceNode {
21
+ public abstract class OrNode extends RubyContextSourceNode {
20
22
21
23
@ Child private RubyNode left ;
22
24
@ Child private RubyNode right ;
23
25
24
- @ Child private BooleanCastNode leftCast = BooleanCastNode .create ();
25
-
26
- private final CountingConditionProfile conditionProfile = CountingConditionProfile .create ();
27
-
28
26
public OrNode (RubyNode left , RubyNode right ) {
29
27
this .left = left ;
30
28
this .right = right ;
31
29
}
32
30
33
- @ Override
34
- public Object execute (VirtualFrame frame ) {
31
+ @ Specialization
32
+ protected Object doOr (VirtualFrame frame ,
33
+ @ Cached BooleanCastNode leftCast ,
34
+ @ Cached InlinedCountingConditionProfile conditionProfile ) {
35
35
final Object leftValue = left .execute (frame );
36
36
37
- if (conditionProfile .profile (leftCast .execute (leftValue ))) {
37
+ if (conditionProfile .profile (this , leftCast .execute (leftValue ))) {
38
38
return leftValue ;
39
39
} else {
40
40
return right .execute (frame );
@@ -43,7 +43,7 @@ public Object execute(VirtualFrame frame) {
43
43
44
44
@ Override
45
45
public RubyNode cloneUninitialized () {
46
- var copy = new OrNode (
46
+ var copy = OrNodeGen . create (
47
47
left .cloneUninitialized (),
48
48
right .cloneUninitialized ());
49
49
return copy .copyFlags (this );
0 commit comments