Commit ca6bdd4
committed
Delegate null-check-then-equals to Objects.equals
Motivation is to remove avoidable synthetic branches/instructions
for null data that are intepreted as uncovered code by JaCoCo etc.
Bytecode is also reduced.
Note that if either operand is potential `Number` or `Character`,
the backend delegates to `BoxesRuntime.equals` which handles Scala
semantic edge cases for boxed primitives. This PR does not change
that at all.
Before:
```
public boolean test1(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;)Z
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=4, args_size=3
0: aload_1
1: aload_2
2: astore_3
3: dup
4: ifnonnull 15
7: pop
8: aload_3
9: ifnull 22
12: goto 26
15: aload_3
16: invokevirtual #20 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
19: ifeq 26
22: iconst_1
23: goto 27
26: iconst_0
27: ireturn
```
After
```
public boolean test1(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;)Z
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: aload_1
1: aload_2
2: invokestatic #22 // Method java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z
5: ifeq 12
8: iconst_1
9: goto 13
12: iconst_0
13: ireturn
```1 parent e19b69f commit ca6bdd4
File tree
3 files changed
+12
-30
lines changed- src
- compiler/scala/tools/nsc/backend/jvm
- reflect/scala/reflect/internal
- test/junit/scala/tools/nsc/backend/jvm
3 files changed
+12
-30
lines changedLines changed: 2 additions & 17 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1584 | 1584 | | |
1585 | 1585 | | |
1586 | 1586 | | |
1587 | | - | |
1588 | | - | |
1589 | | - | |
1590 | | - | |
1591 | | - | |
| 1587 | + | |
1592 | 1588 | | |
1593 | 1589 | | |
1594 | | - | |
1595 | | - | |
1596 | | - | |
1597 | | - | |
1598 | | - | |
1599 | | - | |
1600 | | - | |
1601 | | - | |
1602 | | - | |
1603 | | - | |
1604 | | - | |
1605 | | - | |
| 1590 | + | |
1606 | 1591 | | |
1607 | 1592 | | |
1608 | 1593 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
290 | 290 | | |
291 | 291 | | |
292 | 292 | | |
293 | | - | |
294 | | - | |
295 | | - | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
296 | 297 | | |
297 | 298 | | |
298 | 299 | | |
| |||
1285 | 1286 | | |
1286 | 1287 | | |
1287 | 1288 | | |
| 1289 | + | |
1288 | 1290 | | |
1289 | 1291 | | |
1290 | 1292 | | |
| |||
Lines changed: 5 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
118 | | - | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
119 | 114 | | |
120 | 115 | | |
121 | 116 | | |
| |||
0 commit comments