1 .class public LB22881413; 2 .super Ljava/lang/Object; 3 4 # A couple of fields to allow "loading" resolved and unresolved types. Use non-final classes to 5 # avoid automatically getting precise reference types. 6 .field private static res1:Ljava/lang/Number; 7 .field private static res2:Ljava/lang/ClassLoader; 8 .field private static res3:Ljava/lang/Package; 9 .field private static res4:Ljava/lang/RuntimeException; 10 .field private static res5:Ljava/lang/Exception; 11 .field private static res6:Ljava/util/ArrayList; 12 .field private static res7:Ljava/util/LinkedList; 13 .field private static res8:Ljava/lang/Thread; 14 .field private static res9:Ljava/lang/ThreadGroup; 15 .field private static res10:Ljava/lang/Runtime; 16 17 .field private static unres1:La/b/c/d1; 18 .field private static unres2:La/b/c/d2; 19 .field private static unres3:La/b/c/d3; 20 .field private static unres4:La/b/c/d4; 21 .field private static unres5:La/b/c/d5; 22 .field private static unres6:La/b/c/d6; 23 .field private static unres7:La/b/c/d7; 24 .field private static unres8:La/b/c/d8; 25 .field private static unres9:La/b/c/d9; 26 .field private static unres10:La/b/c/d10; 27 28 .field private static unresBase0:La/b/c/dBase0; 29 .field private static unresBase1:La/b/c/dBase1; 30 .field private static unresBase2:La/b/c/dBase2; 31 .field private static unresBase3:La/b/c/dBase3; 32 .field private static unresBase4:La/b/c/dBase4; 33 .field private static unresBase5:La/b/c/dBase5; 34 .field private static unresBase6:La/b/c/dBase6; 35 .field private static unresBase7:La/b/c/dBase7; 36 .field private static unresBase8:La/b/c/dBase8; 37 38 # Empty, ignore this. We want to see if the other method can be verified in a reasonable amount of 39 # time. 40 .method public static run()V 41 .registers 2 42 return-void 43 .end method 44 45 .method public static foo(IZZ) V 46 .registers 11 47 # v8 = int, v9 = boolean, v10 = boolean 48 49 sget-object v0, LB22881413;->unresBase0:La/b/c/dBase0; 50 51 # Test an UnresolvedUninitializedReference type. 52 new-instance v0, La/b/c/dBaseInit; 53 54 const v1, 0 55 const v2, 0 56 57 # We're trying to create something like this (with more loops to amplify things). 58 # 59 # v0 = Unresolved1 60 # while (something) { 61 # 62 # [Repeatedly] 63 # if (cond) { 64 # v0 = ResolvedX; 65 # } else { 66 # v0 = UnresolvedX; 67 # } 68 # 69 # v0 = Unresolved2 70 # }; 71 # 72 # Important points: 73 # 1) Use a while, so that the end of the loop is a goto. That way, the merging of outer-loop 74 # unresolved classes is postponed. 75 # 2) Put the else cases after all if cases. That way there are backward gotos that will lead 76 # to stabilization loops in the body. 77 # 78 79 :Loop1 80 81 const v6, 0 82 add-int/lit16 v8, v8, -1 83 if-ge v8, v6, :Loop1End 84 85 :Loop2 86 87 const v6, 0 88 add-int/lit16 v8, v8, -1 89 if-ge v8, v6, :Loop2End 90 91 :Loop3 92 93 const v6, 0 94 add-int/lit16 v8, v8, -1 95 if-ge v8, v6, :Loop3End 96 97 :Loop4 98 99 const v6, 0 100 add-int/lit16 v8, v8, -1 101 if-ge v8, v6, :Loop4End 102 103 :Loop5 104 105 const v6, 0 106 add-int/lit16 v8, v8, -1 107 if-ge v8, v6, :Loop5End 108 109 :Loop6 110 111 const v6, 0 112 add-int/lit16 v8, v8, -1 113 if-ge v8, v6, :Loop6End 114 115 :Loop7 116 117 const v6, 0 118 add-int/lit16 v8, v8, -1 119 if-ge v8, v6, :Loop7End 120 121 :Loop8 122 123 const v6, 0 124 add-int/lit16 v8, v8, -1 125 if-ge v8, v6, :Loop8End 126 127 # Prototype: 128 # 129 # if-eqz v9, :ElseX 130 # sget-object v0, LB22881413;->res1:Ljava/lang/Number; 131 #:JoinX 132 # 133 # And somewhere at the end 134 # 135 #:ElseX 136 # sget-object v0, LB22881413;->unresX:La/b/c/dX; 137 # goto :JoinX 138 # 139 # 140 141 if-eqz v10, :Join1 142 if-eqz v9, :Else1 143 sget-object v0, LB22881413;->res1:Ljava/lang/Number; 144 :Join1 145 146 147 if-eqz v10, :Join2 148 if-eqz v9, :Else2 149 sget-object v0, LB22881413;->res2:Ljava/lang/ClassLoader; 150 :Join2 151 152 153 if-eqz v10, :Join3 154 if-eqz v9, :Else3 155 sget-object v0, LB22881413;->res3:Ljava/lang/Package; 156 :Join3 157 158 159 if-eqz v10, :Join4 160 if-eqz v9, :Else4 161 sget-object v0, LB22881413;->res4:Ljava/lang/RuntimeException; 162 :Join4 163 164 165 if-eqz v10, :Join5 166 if-eqz v9, :Else5 167 sget-object v0, LB22881413;->res5:Ljava/lang/Exception; 168 :Join5 169 170 171 if-eqz v10, :Join6 172 if-eqz v9, :Else6 173 sget-object v0, LB22881413;->res6:Ljava/util/ArrayList; 174 :Join6 175 176 177 if-eqz v10, :Join7 178 if-eqz v9, :Else7 179 sget-object v0, LB22881413;->res7:Ljava/util/LinkedList; 180 :Join7 181 182 183 if-eqz v10, :Join8 184 if-eqz v9, :Else8 185 sget-object v0, LB22881413;->res8:Ljava/lang/Thread; 186 :Join8 187 188 189 if-eqz v10, :Join9 190 if-eqz v9, :Else9 191 sget-object v0, LB22881413;->res9:Ljava/lang/ThreadGroup; 192 :Join9 193 194 195 if-eqz v10, :Join10 196 if-eqz v9, :Else10 197 sget-object v0, LB22881413;->res10:Ljava/lang/Runtime; 198 :Join10 199 200 201 goto :InnerMostLoopEnd 202 203 :Else1 204 sget-object v0, LB22881413;->unres1:La/b/c/d1; 205 goto :Join1 206 207 :Else2 208 sget-object v0, LB22881413;->unres2:La/b/c/d2; 209 goto :Join2 210 211 :Else3 212 sget-object v0, LB22881413;->unres3:La/b/c/d3; 213 goto :Join3 214 215 :Else4 216 sget-object v0, LB22881413;->unres4:La/b/c/d4; 217 goto :Join4 218 219 :Else5 220 sget-object v0, LB22881413;->unres5:La/b/c/d5; 221 goto :Join5 222 223 :Else6 224 sget-object v0, LB22881413;->unres6:La/b/c/d6; 225 goto :Join6 226 227 :Else7 228 sget-object v0, LB22881413;->unres7:La/b/c/d7; 229 goto :Join7 230 231 :Else8 232 sget-object v0, LB22881413;->unres8:La/b/c/d8; 233 goto :Join8 234 235 :Else9 236 sget-object v0, LB22881413;->unres9:La/b/c/d9; 237 goto :Join9 238 239 :Else10 240 sget-object v0, LB22881413;->unres10:La/b/c/d10; 241 goto :Join10 242 243 :InnerMostLoopEnd 244 245 # Loop 8 end of body. 246 sget-object v0, LB22881413;->unresBase8:La/b/c/dBase8; 247 goto :Loop8 248 249 :Loop8End 250 251 # Loop 7 end of body. 252 sget-object v0, LB22881413;->unresBase7:La/b/c/dBase7; 253 goto :Loop7 254 255 :Loop7End 256 257 # Loop 6 end of body. 258 sget-object v0, LB22881413;->unresBase6:La/b/c/dBase6; 259 goto :Loop6 260 261 :Loop6End 262 263 # Loop 5 end of body 264 sget-object v0, LB22881413;->unresBase5:La/b/c/dBase5; 265 goto :Loop5 266 267 :Loop5End 268 269 # Loop 4 end of body 270 sget-object v0, LB22881413;->unresBase4:La/b/c/dBase4; 271 goto :Loop4 272 273 :Loop4End 274 275 # Loop 3 end of body 276 sget-object v0, LB22881413;->unresBase3:La/b/c/dBase3; 277 goto :Loop3 278 279 :Loop3End 280 281 # Loop 2 end of body 282 sget-object v0, LB22881413;->unresBase2:La/b/c/dBase2; 283 goto :Loop2 284 285 :Loop2End 286 287 # Loop 1 end of body 288 sget-object v0, LB22881413;->unresBase1:La/b/c/dBase1; 289 goto :Loop1 290 291 :Loop1End 292 293 return-void 294 295 .end method 296