| .class public LB22881413; |
| .super Ljava/lang/Object; |
| |
| # A couple of fields to allow "loading" resolved and unresolved types. Use non-final classes to |
| # avoid automatically getting precise reference types. |
| .field private static res1:Ljava/lang/Number; |
| .field private static res2:Ljava/lang/ClassLoader; |
| .field private static res3:Ljava/lang/Package; |
| .field private static res4:Ljava/lang/RuntimeException; |
| .field private static res5:Ljava/lang/Exception; |
| .field private static res6:Ljava/util/ArrayList; |
| .field private static res7:Ljava/util/LinkedList; |
| .field private static res8:Ljava/lang/Thread; |
| .field private static res9:Ljava/lang/ThreadGroup; |
| .field private static res10:Ljava/lang/Runtime; |
| |
| .field private static unres1:La/b/c/d1; |
| .field private static unres2:La/b/c/d2; |
| .field private static unres3:La/b/c/d3; |
| .field private static unres4:La/b/c/d4; |
| .field private static unres5:La/b/c/d5; |
| .field private static unres6:La/b/c/d6; |
| .field private static unres7:La/b/c/d7; |
| .field private static unres8:La/b/c/d8; |
| .field private static unres9:La/b/c/d9; |
| .field private static unres10:La/b/c/d10; |
| |
| .field private static unresBase0:La/b/c/dBase0; |
| .field private static unresBase1:La/b/c/dBase1; |
| .field private static unresBase2:La/b/c/dBase2; |
| .field private static unresBase3:La/b/c/dBase3; |
| .field private static unresBase4:La/b/c/dBase4; |
| .field private static unresBase5:La/b/c/dBase5; |
| .field private static unresBase6:La/b/c/dBase6; |
| .field private static unresBase7:La/b/c/dBase7; |
| .field private static unresBase8:La/b/c/dBase8; |
| |
| # Empty, ignore this. We want to see if the other method can be verified in a reasonable amount of |
| # time. |
| .method public static run()V |
| .registers 2 |
| return-void |
| .end method |
| |
| .method public static foo(IZZ) V |
| .registers 11 |
| # v8 = int, v9 = boolean, v10 = boolean |
| |
| sget-object v0, LB22881413;->unresBase0:La/b/c/dBase0; |
| |
| # Test an UnresolvedUninitializedReference type. |
| new-instance v0, La/b/c/dBaseInit; |
| |
| const v1, 0 |
| const v2, 0 |
| |
| # We're trying to create something like this (with more loops to amplify things). |
| # |
| # v0 = Unresolved1 |
| # while (something) { |
| # |
| # [Repeatedly] |
| # if (cond) { |
| # v0 = ResolvedX; |
| # } else { |
| # v0 = UnresolvedX; |
| # } |
| # |
| # v0 = Unresolved2 |
| # }; |
| # |
| # Important points: |
| # 1) Use a while, so that the end of the loop is a goto. That way, the merging of outer-loop |
| # unresolved classes is postponed. |
| # 2) Put the else cases after all if cases. That way there are backward gotos that will lead |
| # to stabilization loops in the body. |
| # |
| |
| :Loop1 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop1End |
| |
| :Loop2 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop2End |
| |
| :Loop3 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop3End |
| |
| :Loop4 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop4End |
| |
| :Loop5 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop5End |
| |
| :Loop6 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop6End |
| |
| :Loop7 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop7End |
| |
| :Loop8 |
| |
| const v6, 0 |
| add-int/lit16 v8, v8, -1 |
| if-ge v8, v6, :Loop8End |
| |
| # Prototype: |
| # |
| # if-eqz v9, :ElseX |
| # sget-object v0, LB22881413;->res1:Ljava/lang/Number; |
| #:JoinX |
| # |
| # And somewhere at the end |
| # |
| #:ElseX |
| # sget-object v0, LB22881413;->unresX:La/b/c/dX; |
| # goto :JoinX |
| # |
| # |
| |
| if-eqz v10, :Join1 |
| if-eqz v9, :Else1 |
| sget-object v0, LB22881413;->res1:Ljava/lang/Number; |
| :Join1 |
| |
| |
| if-eqz v10, :Join2 |
| if-eqz v9, :Else2 |
| sget-object v0, LB22881413;->res2:Ljava/lang/ClassLoader; |
| :Join2 |
| |
| |
| if-eqz v10, :Join3 |
| if-eqz v9, :Else3 |
| sget-object v0, LB22881413;->res3:Ljava/lang/Package; |
| :Join3 |
| |
| |
| if-eqz v10, :Join4 |
| if-eqz v9, :Else4 |
| sget-object v0, LB22881413;->res4:Ljava/lang/RuntimeException; |
| :Join4 |
| |
| |
| if-eqz v10, :Join5 |
| if-eqz v9, :Else5 |
| sget-object v0, LB22881413;->res5:Ljava/lang/Exception; |
| :Join5 |
| |
| |
| if-eqz v10, :Join6 |
| if-eqz v9, :Else6 |
| sget-object v0, LB22881413;->res6:Ljava/util/ArrayList; |
| :Join6 |
| |
| |
| if-eqz v10, :Join7 |
| if-eqz v9, :Else7 |
| sget-object v0, LB22881413;->res7:Ljava/util/LinkedList; |
| :Join7 |
| |
| |
| if-eqz v10, :Join8 |
| if-eqz v9, :Else8 |
| sget-object v0, LB22881413;->res8:Ljava/lang/Thread; |
| :Join8 |
| |
| |
| if-eqz v10, :Join9 |
| if-eqz v9, :Else9 |
| sget-object v0, LB22881413;->res9:Ljava/lang/ThreadGroup; |
| :Join9 |
| |
| |
| if-eqz v10, :Join10 |
| if-eqz v9, :Else10 |
| sget-object v0, LB22881413;->res10:Ljava/lang/Runtime; |
| :Join10 |
| |
| |
| goto :InnerMostLoopEnd |
| |
| :Else1 |
| sget-object v0, LB22881413;->unres1:La/b/c/d1; |
| goto :Join1 |
| |
| :Else2 |
| sget-object v0, LB22881413;->unres2:La/b/c/d2; |
| goto :Join2 |
| |
| :Else3 |
| sget-object v0, LB22881413;->unres3:La/b/c/d3; |
| goto :Join3 |
| |
| :Else4 |
| sget-object v0, LB22881413;->unres4:La/b/c/d4; |
| goto :Join4 |
| |
| :Else5 |
| sget-object v0, LB22881413;->unres5:La/b/c/d5; |
| goto :Join5 |
| |
| :Else6 |
| sget-object v0, LB22881413;->unres6:La/b/c/d6; |
| goto :Join6 |
| |
| :Else7 |
| sget-object v0, LB22881413;->unres7:La/b/c/d7; |
| goto :Join7 |
| |
| :Else8 |
| sget-object v0, LB22881413;->unres8:La/b/c/d8; |
| goto :Join8 |
| |
| :Else9 |
| sget-object v0, LB22881413;->unres9:La/b/c/d9; |
| goto :Join9 |
| |
| :Else10 |
| sget-object v0, LB22881413;->unres10:La/b/c/d10; |
| goto :Join10 |
| |
| :InnerMostLoopEnd |
| |
| # Loop 8 end of body. |
| sget-object v0, LB22881413;->unresBase8:La/b/c/dBase8; |
| goto :Loop8 |
| |
| :Loop8End |
| |
| # Loop 7 end of body. |
| sget-object v0, LB22881413;->unresBase7:La/b/c/dBase7; |
| goto :Loop7 |
| |
| :Loop7End |
| |
| # Loop 6 end of body. |
| sget-object v0, LB22881413;->unresBase6:La/b/c/dBase6; |
| goto :Loop6 |
| |
| :Loop6End |
| |
| # Loop 5 end of body |
| sget-object v0, LB22881413;->unresBase5:La/b/c/dBase5; |
| goto :Loop5 |
| |
| :Loop5End |
| |
| # Loop 4 end of body |
| sget-object v0, LB22881413;->unresBase4:La/b/c/dBase4; |
| goto :Loop4 |
| |
| :Loop4End |
| |
| # Loop 3 end of body |
| sget-object v0, LB22881413;->unresBase3:La/b/c/dBase3; |
| goto :Loop3 |
| |
| :Loop3End |
| |
| # Loop 2 end of body |
| sget-object v0, LB22881413;->unresBase2:La/b/c/dBase2; |
| goto :Loop2 |
| |
| :Loop2End |
| |
| # Loop 1 end of body |
| sget-object v0, LB22881413;->unresBase1:La/b/c/dBase1; |
| goto :Loop1 |
| |
| :Loop1End |
| |
| return-void |
| |
| .end method |