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