ronnie
2022-10-14 1504bb53e29d3d46222c0b3ea994fc494b48e153
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.class public LB22411633_2;
.super Ljava/lang/Object;
 
 
.method public static run(Z)V
.registers 6
       # Make v3 & v4 defined, just use null.
       const v3, 0
       const v4, 0
 
       # Allocate a java.lang.Object (do not initialize).
       new-instance v4, Ljava/lang/Object;
 
       # Branch forward.
       if-eqz v5, :LabelMerge
 
       # Create a non-precise object reference. We can do this by merging to objects together
       # that only have Object as a common ancestor.
 
       # Allocate a java.lang.Object and initialize it.
       new-instance v4, Ljava/lang/Object;
       invoke-direct {v4}, Ljava/lang/Object;-><init>()V
 
       if-nez v5, :LabelMergeObject
 
       new-instance v4, Ljava/lang/Integer;
       invoke-direct {v4}, Ljava/lang/Integer;-><init>()V
 
:LabelMergeObject
 
       # Dummy work to separate blocks. At this point, v4 is of type Reference<Object>.
       add-int/lit16 v3, v3, 1
 
:LabelMerge
       # Merge the uninitialized Object from line 12 with the reference to Object from 31. Older
       # rules set any reference merged with Object to Object. This is wrong in the case of the
       # other reference being an uninitialized reference, as we'd suddenly allow calling on it.
 
       # Test whether it's some initialized reference by calling hashCode. This should fail, as we
       # merged initialized and uninitialized.
       invoke-virtual {v4}, Ljava/lang/Object;->hashCode()I
 
       return-void
 
.end method