296 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Smali
		
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Smali
		
	
	
	
| .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
 |