1 /* 2 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package selectionresolution; 25 26 import java.util.function.BiConsumer; 27 import java.util.function.Consumer; 28 import java.util.Arrays; 29 import java.util.Collection; 30 import java.util.Collections; 31 import java.util.EnumSet; 32 import java.util.HashSet; 33 import java.util.LinkedList; 34 35 /** 36 * Templates are sets of transformations that are applied to a 37 * SelectionResolutionTestCase.Builder as part of building up a test 38 * case. Templates should contain a collection of different 39 * transforms, all of which represent an "interesting" case in a 40 * general category of cases. 41 * 42 */ 43 public class Template { 44 45 public enum Kind { CLASS, INTERFACE; } 46 47 public final Collection<Consumer<SelectionResolutionTestCase.Builder>> cases; 48 public final String name; 49 50 /** 51 * Create a template from a collection of lambdas that modify a Builder. 52 * 53 * @param name The name of the template. 54 * @param cases The cases in the template. 55 */ 56 public Template(final String name, 57 final Collection<Consumer<SelectionResolutionTestCase.Builder>> cases) { 58 this.cases = cases; 59 this.name = name; 60 } 61 62 /** 63 * Build a template out of a set of lambdas that modify a Builder. 64 * 65 * @param name The name of the template. 66 * @param cases The cases in the template. 67 */ 68 public Template(final String name, 69 final Consumer<SelectionResolutionTestCase.Builder>... cases) { 70 this(name, Arrays.asList(cases)); 71 } 72 73 /** 74 * Build a template out of a set of lambdas that modify a Builder. 75 * Also include all cases from another template. 76 * 77 * @param name The name of the template. 78 * @param include Include all cases from this template. 79 * @param cases The cases in the template. 80 */ 81 public Template(final String name, 82 final Template include, 83 final Consumer<SelectionResolutionTestCase.Builder>... cases) { 84 this(name, new LinkedList(include.cases)); 85 this.cases.addAll(Arrays.asList(cases)); 86 } 87 88 /** 89 * Build a template out of a set of lambdas that modify a Builder. 90 * Also include all cases from another template. 91 * 92 * @param name The name of the template. 93 * @param include Include all cases from this template. 94 * @param cases The cases in the template. 95 */ 96 public Template(final String name, 97 final Template... others) { 98 this(name, new LinkedList()); 99 100 for(final Template template : others) { 101 cases.addAll(template.cases); 102 } 103 } 104 105 /** 106 * Run all cases in the template. This will run each action in 107 * the template and then call the next action on a separate copy 108 * of the builder parameter. 109 * 110 * @param The next action to perform of the Builder. 111 * @param The Builder to modify. 112 */ 113 public void runCases(final Consumer<SelectionResolutionTestCase.Builder> next, 114 final SelectionResolutionTestCase.Builder builder) { 115 for(final Consumer<SelectionResolutionTestCase.Builder> thiscase : cases) { 116 final SelectionResolutionTestCase.Builder localbuilder = builder.copy(); 117 thiscase.accept(localbuilder); 118 next.accept(localbuilder); 119 } 120 } 121 122 public void printCases(final SelectionResolutionTestCase.Builder builder) { 123 int i = 1; 124 System.err.println("Template " + name + ":\n"); 125 for(final Consumer<SelectionResolutionTestCase.Builder> thiscase : cases) { 126 final SelectionResolutionTestCase.Builder localbuilder = builder.copy(); 127 thiscase.accept(localbuilder); 128 System.err.println("Case " + i++); 129 System.err.println(localbuilder); 130 } 131 } 132 133 /* Create an empty class in the given package */ 134 public static final ClassData emptyClass(final ClassData.Package pck) { 135 return new ClassData(pck, null); 136 } 137 138 /* These are functions that are used to build callsite templates */ 139 public static void callsiteIsMethodref(final SelectionResolutionTestCase.Builder builder) { 140 builder.callsite = builder.methodref; 141 } 142 143 public static void callsiteSubclassMethodref(final SelectionResolutionTestCase.Builder builder) { 144 final int callsite = 145 builder.addClass(Template.emptyClass(ClassData.Package.SAME)); 146 builder.hier.addInherit(callsite, builder.methodref); 147 builder.callsite = callsite; 148 } 149 150 public static void callsiteUnrelatedMethodref(final SelectionResolutionTestCase.Builder builder) { 151 final int callsite = 152 builder.addClass(Template.emptyClass(ClassData.Package.SAME)); 153 builder.callsite = callsite; 154 } 155 156 public static void methodrefIsExpected(final SelectionResolutionTestCase.Builder builder) { 157 builder.methodref = builder.expected; 158 } 159 160 public static final Template MethodrefEqualsExpected = 161 new Template("MethodrefEqualsExpected", 162 Template::methodrefIsExpected); 163 164 /***************************** 165 * Set Invoke Template * 166 *****************************/ 167 168 public static final Template SetInvoke(final SelectionResolutionTestCase.InvokeInstruction invoke) { 169 return new Template("SetInvoke(" + invoke + ")", 170 Collections.singleton((builder) -> { 171 builder.invoke = invoke; 172 })); 173 } 174 175 /***************************** 176 * Result Combo Template * 177 *****************************/ 178 public static Template ResultCombo(final EnumSet<Kind> kinds, 179 final EnumSet<MethodData.Access> accesses, 180 final EnumSet<MethodData.Context> contexts, 181 final EnumSet<ClassData.Package> packages) { 182 final LinkedList<Consumer<SelectionResolutionTestCase.Builder>> cases = 183 new LinkedList<>(); 184 185 for (final Kind kind : kinds) { 186 for (final MethodData.Access acc : accesses) { 187 for (final MethodData.Context ctx : contexts) { 188 if (!(acc == MethodData.Access.PRIVATE && 189 ctx == MethodData.Context.ABSTRACT)) { 190 for (final ClassData.Package pck : packages) { 191 cases.add((builder) -> { 192 final MethodData meth = new MethodData(acc, ctx); 193 final ClassData cls = new ClassData(pck, meth); 194 switch(kind) { 195 case CLASS: 196 builder.expected = builder.addClass(cls); 197 break; 198 case INTERFACE: 199 builder.expected = builder.addInterface(cls); 200 break; 201 } 202 }); 203 } 204 } 205 } 206 } 207 } 208 209 return new Template("ResultCombo", cases); 210 } 211 212 public static Template ResolutionOverride(final EnumSet<Kind> kinds, 213 final EnumSet<MethodData.Access> accesses, 214 final EnumSet<MethodData.Context> contexts, 215 final EnumSet<ClassData.Package> packages) { 216 final LinkedList<Consumer<SelectionResolutionTestCase.Builder>> cases = 217 new LinkedList<>(); 218 219 for (final Kind kind : kinds) { 220 for (final MethodData.Access acc : accesses) { 221 for (final MethodData.Context ctx : contexts) { 222 if (!(acc == MethodData.Access.PRIVATE && 223 ctx == MethodData.Context.ABSTRACT)) { 224 for (final ClassData.Package pck : packages) { 225 cases.add((builder) -> { 226 final MethodData meth = new MethodData(acc, ctx); 227 final ClassData cls = new ClassData(pck, meth); 228 int override = -1; 229 switch(kind) { 230 case CLASS: 231 override = builder.addClass(cls); 232 break; 233 case INTERFACE: 234 override = builder.addInterface(cls); 235 break; 236 } 237 builder.hier.addInherit(override, builder.expected); 238 }); 239 } 240 } 241 } 242 } 243 } 244 245 return new Template("ResultCombo", cases); 246 } 247 248 /****************************** 249 * Resolution Templates * 250 ******************************/ 251 252 private static MethodData getMethodData(final MethodData.Access acc, 253 final MethodData.Context ctx) { 254 if (!(acc == MethodData.Access.PUBLIC || 255 acc == MethodData.Access.PLACEHOLDER) && 256 ctx != MethodData.Context.STATIC) { 257 return null; 258 } else { 259 return new MethodData(MethodData.Access.PUBLIC, ctx); 260 } 261 } 262 263 public static final Template MethodrefNotEqualsExpectedClass = 264 new Template("MethodrefNotEqualsExpectedClass", 265 /* Case 1: Inherit from super. 266 * 267 * C2[](res) 268 * C1[C2]() = mref 269 */ 270 (final SelectionResolutionTestCase.Builder builder) -> { 271 final int C2 = builder.expected; 272 final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); 273 builder.hier.addInherit(C1, C2); 274 builder.methodref = C1; 275 }, 276 /* Case 2: Inherit from super. 277 * 278 * C2[](res), I[](def) 279 * C1[C2,I]() = mref 280 */ 281 (final SelectionResolutionTestCase.Builder builder) -> { 282 final ClassData.Package pck = 283 builder.classdata.get(builder.expected).packageId; 284 final MethodData.Context ctx = 285 builder.classdata.get(builder.expected).methoddata.context; 286 final MethodData.Access acc = 287 builder.classdata.get(builder.expected).methoddata.access; 288 final MethodData mdata = getMethodData(acc, ctx); 289 final ClassData withDef = new ClassData(pck, mdata); 290 final int C2 = builder.expected; 291 final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); 292 final int I = builder.addInterface(withDef); 293 builder.hier.addInherit(C1, C2); 294 builder.hier.addInherit(C1, I); 295 builder.methodref = C1; 296 }, 297 /* Case 3: Inherit from super's super. 298 * 299 * C3[](res) 300 * C2[](), I[](def) 301 * C1[C2,I]() = mref 302 */ 303 (final SelectionResolutionTestCase.Builder builder) -> { 304 final ClassData.Package pck = 305 builder.classdata.get(builder.expected).packageId; 306 final MethodData.Context ctx = 307 builder.classdata.get(builder.expected).methoddata.context; 308 final MethodData.Access acc = 309 builder.classdata.get(builder.expected).methoddata.access; 310 final MethodData mdata = getMethodData(acc, ctx); 311 final ClassData withDef = new ClassData(pck, mdata); 312 final int C3 = builder.expected; 313 final int C2 = builder.addClass(emptyClass(pck)); 314 final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); 315 final int I = builder.addInterface(withDef); 316 builder.hier.addInherit(C2, C3); 317 builder.hier.addInherit(C1, C2); 318 builder.hier.addInherit(C1, I); 319 builder.methodref = C1; 320 }); 321 322 public static final Template IfaceMethodrefNotEqualsExpected = 323 new Template("IfaceMethodrefNotEqualsExpected", 324 /* Case 1: Inherit from super. 325 * 326 * I2[](res) 327 * I1[I2]() = mref 328 */ 329 (final SelectionResolutionTestCase.Builder builder) -> { 330 final ClassData.Package pck = 331 builder.classdata.get(builder.expected).packageId; 332 final int I2 = builder.expected; 333 final int I1 = builder.addInterface(emptyClass(pck)); 334 builder.hier.addInherit(I1, I2); 335 builder.methodref = I1; 336 }, 337 /* Case 2: Inherit from super, skip private. 338 * 339 * I2[](res) 340 * I2[I3](priv) 341 * I1[I2]() = mref 342 */ 343 (final SelectionResolutionTestCase.Builder builder) -> { 344 final ClassData.Package pck = 345 builder.classdata.get(builder.expected).packageId; 346 final MethodData meth = 347 new MethodData(MethodData.Access.PRIVATE, 348 MethodData.Context.INSTANCE); 349 final ClassData withPrivDef = new ClassData(pck, meth); 350 final int I3 = builder.expected; 351 final int I2 = builder.addInterface(withPrivDef); 352 final int I1 = builder.addInterface(emptyClass(pck)); 353 builder.hier.addInherit(I1, I2); 354 builder.hier.addInherit(I2, I3); 355 builder.methodref = I1; 356 }, 357 /* Case 3: Inherit from super, skip static. 358 * 359 * I2[](res) 360 * I2[I3](stat) 361 * I1[I2]() = mref 362 */ 363 (final SelectionResolutionTestCase.Builder builder) -> { 364 final ClassData.Package pck = 365 builder.classdata.get(builder.expected).packageId; 366 final MethodData meth = 367 new MethodData(MethodData.Access.PUBLIC, 368 MethodData.Context.STATIC); 369 final ClassData withStatDef = new ClassData(pck, meth); 370 final int I3 = builder.expected; 371 final int I2 = builder.addInterface(withStatDef); 372 final int I1 = builder.addInterface(emptyClass(pck)); 373 builder.hier.addInherit(I1, I2); 374 builder.hier.addInherit(I2, I3); 375 builder.methodref = I1; 376 }, 377 /* Case 4: Maximally-specific. 378 * 379 * I3[](def) 380 * I2[I3](res) 381 * I1[I2]() = mref 382 */ 383 (final SelectionResolutionTestCase.Builder builder) -> { 384 final ClassData.Package pck = 385 builder.classdata.get(builder.expected).packageId; 386 final MethodData.Context ctx = 387 builder.classdata.get(builder.expected).methoddata.context; 388 final MethodData.Access acc = 389 builder.classdata.get(builder.expected).methoddata.access; 390 final MethodData mdata = getMethodData(acc, ctx); 391 final ClassData withDef = new ClassData(pck, mdata); 392 final int I3 = builder.addInterface(withDef); 393 final int I2 = builder.expected; 394 final int I1 = builder.addInterface(emptyClass(pck)); 395 builder.hier.addInherit(I1, I2); 396 builder.hier.addInherit(I2, I3); 397 builder.methodref = I1; 398 }, 399 /* Case 5: Diamond, expected at top. 400 * 401 * I4[](res) 402 * I2[I4](), I3[I4]() 403 * I1[I2,I3]() = mref 404 */ 405 (final SelectionResolutionTestCase.Builder builder) -> { 406 final ClassData.Package pck = 407 builder.classdata.get(builder.expected).packageId; 408 final int I4 = builder.expected; 409 final int I3 = builder.addInterface(emptyClass(pck)); 410 final int I2 = builder.addInterface(emptyClass(pck)); 411 final int I1 = builder.addInterface(emptyClass(pck)); 412 builder.hier.addInherit(I1, I2); 413 builder.hier.addInherit(I1, I3); 414 builder.hier.addInherit(I2, I4); 415 builder.hier.addInherit(I3, I4); 416 builder.methodref = I1; 417 }, 418 /* Case 6: Diamond, skip private. 419 * 420 * I4[](res) 421 * I2[I4](priv), I3[I4]() 422 * I1[I2,I3]() = mref 423 */ 424 (final SelectionResolutionTestCase.Builder builder) -> { 425 final ClassData.Package pck = 426 builder.classdata.get(builder.expected).packageId; 427 final MethodData.Context ctx = 428 builder.classdata.get(builder.expected).methoddata.context; 429 final MethodData.Access acc = 430 builder.classdata.get(builder.expected).methoddata.access; 431 final MethodData mdata = getMethodData(acc, ctx); 432 final MethodData meth = 433 new MethodData(MethodData.Access.PRIVATE, 434 MethodData.Context.INSTANCE); 435 final ClassData withPrivDef = new ClassData(pck, meth); 436 final int I4 = builder.expected; 437 final int I3 = builder.addInterface(emptyClass(pck)); 438 final int I2 = builder.addInterface(withPrivDef); 439 final int I1 = builder.addInterface(emptyClass(pck)); 440 builder.hier.addInherit(I1, I2); 441 builder.hier.addInherit(I1, I3); 442 builder.hier.addInherit(I2, I4); 443 builder.hier.addInherit(I3, I4); 444 builder.methodref = I1; 445 }, 446 /* Case 7: Diamond, skip static. 447 * 448 * I4[](res) 449 * I2[I4](stat), I3[I4]() 450 * I1[I2,I3]() = mref 451 */ 452 (final SelectionResolutionTestCase.Builder builder) -> { 453 final ClassData.Package pck = 454 builder.classdata.get(builder.expected).packageId; 455 final MethodData.Context ctx = 456 builder.classdata.get(builder.expected).methoddata.context; 457 final MethodData.Access acc = 458 builder.classdata.get(builder.expected).methoddata.access; 459 final MethodData mdata = getMethodData(acc, ctx); 460 final MethodData meth = 461 new MethodData(MethodData.Access.PUBLIC, 462 MethodData.Context.STATIC); 463 final ClassData withStatDef = new ClassData(pck, meth); 464 final int I4 = builder.expected; 465 final int I3 = builder.addInterface(emptyClass(pck)); 466 final int I2 = builder.addInterface(withStatDef); 467 final int I1 = builder.addInterface(emptyClass(pck)); 468 builder.hier.addInherit(I1, I2); 469 builder.hier.addInherit(I1, I3); 470 builder.hier.addInherit(I2, I4); 471 builder.hier.addInherit(I3, I4); 472 builder.methodref = I1; 473 }, 474 /* Case 8: Diamond, maximally-specific. 475 * 476 * I4[](def) 477 * I2[I4](res), I3[I4]() 478 * I1[I2,I3]() = mref 479 */ 480 (final SelectionResolutionTestCase.Builder builder) -> { 481 final ClassData.Package pck = 482 builder.classdata.get(builder.expected).packageId; 483 final MethodData.Context ctx = 484 builder.classdata.get(builder.expected).methoddata.context; 485 final MethodData.Access acc = 486 builder.classdata.get(builder.expected).methoddata.access; 487 final MethodData mdata = getMethodData(acc, ctx); 488 final ClassData withDef = new ClassData(pck, mdata); 489 final int I4 = builder.addInterface(withDef); 490 final int I3 = builder.addInterface(emptyClass(pck)); 491 final int I2 = builder.expected; 492 final int I1 = builder.addInterface(emptyClass(pck)); 493 builder.hier.addInherit(I1, I2); 494 builder.hier.addInherit(I1, I3); 495 builder.hier.addInherit(I2, I4); 496 builder.hier.addInherit(I3, I4); 497 builder.methodref = I1; 498 }, 499 /* Case 9: Diamond, maximally-specific, skipping private. 500 * 501 * I4[](def) 502 * I2[I4](res), I3[I4](priv) 503 * I1[I2,I3]() = mref 504 */ 505 (final SelectionResolutionTestCase.Builder builder) -> { 506 final ClassData.Package pck = 507 builder.classdata.get(builder.expected).packageId; 508 final MethodData.Context ctx = 509 builder.classdata.get(builder.expected).methoddata.context; 510 final MethodData.Access acc = 511 builder.classdata.get(builder.expected).methoddata.access; 512 final MethodData mdata = getMethodData(acc, ctx); 513 final ClassData withDef = new ClassData(pck, mdata); 514 final MethodData meth = 515 new MethodData(MethodData.Access.PRIVATE, 516 MethodData.Context.INSTANCE); 517 final ClassData withPrivDef = new ClassData(pck, meth); 518 final int I4 = builder.addInterface(withDef); 519 final int I3 = builder.addInterface(withPrivDef); 520 final int I2 = builder.expected; 521 final int I1 = builder.addInterface(emptyClass(pck)); 522 builder.hier.addInherit(I1, I2); 523 builder.hier.addInherit(I1, I3); 524 builder.hier.addInherit(I2, I4); 525 builder.hier.addInherit(I3, I4); 526 builder.methodref = I1; 527 }, 528 /* Case 10: Diamond, maximally-specific, skipping static. 529 * 530 * I4[](def) 531 * I2[I4](res), I3[I4](stat) 532 * I1[I2,I3]() = mref 533 */ 534 (final SelectionResolutionTestCase.Builder builder) -> { 535 final ClassData.Package pck = 536 builder.classdata.get(builder.expected).packageId; 537 final MethodData.Context ctx = 538 builder.classdata.get(builder.expected).methoddata.context; 539 final MethodData.Access acc = 540 builder.classdata.get(builder.expected).methoddata.access; 541 final MethodData mdata = getMethodData(acc, ctx); 542 final ClassData withDef = new ClassData(pck, mdata); 543 final MethodData meth = 544 new MethodData(MethodData.Access.PUBLIC, 545 MethodData.Context.STATIC); 546 final ClassData withStatDef = new ClassData(pck, meth); 547 final int I4 = builder.addInterface(withDef); 548 final int I3 = builder.addInterface(withStatDef); 549 final int I2 = builder.expected; 550 final int I1 = builder.addInterface(emptyClass(pck)); 551 builder.hier.addInherit(I1, I2); 552 builder.hier.addInherit(I1, I3); 553 builder.hier.addInherit(I2, I4); 554 builder.hier.addInherit(I3, I4); 555 builder.methodref = I1; 556 }); 557 558 public static final Template MethodrefNotEqualsExpectedIface = 559 new Template("MethodrefNotEqualsExpectedIface", 560 /* Case 1: Inherit from superinterface. 561 * 562 * I[](res) 563 * C[I]() = mref 564 */ 565 (final SelectionResolutionTestCase.Builder builder) -> { 566 final ClassData.Package pck = 567 builder.classdata.get(builder.expected).packageId; 568 final int I = builder.expected; 569 final int C = builder.addClass(emptyClass(pck)); 570 builder.hier.addInherit(C, I); 571 builder.methodref = C; 572 }, 573 /* Case 2: Diamond, expected at top. 574 * 575 * I3[](res) 576 * I1[I3](), I2[I3]() 577 * C[I1,I2]() = mref 578 */ 579 (final SelectionResolutionTestCase.Builder builder) -> { 580 final ClassData.Package pck = 581 builder.classdata.get(builder.expected).packageId; 582 final int I3 = builder.expected; 583 final int I2 = builder.addInterface(emptyClass(pck)); 584 final int I1 = builder.addInterface(emptyClass(pck)); 585 final int C = builder.addClass(emptyClass(pck)); 586 builder.hier.addInherit(C, I1); 587 builder.hier.addInherit(C, I2); 588 builder.hier.addInherit(I1, I3); 589 builder.hier.addInherit(I2, I3); 590 builder.methodref = C; 591 }, 592 /* Case 3: Diamond, skipping private. 593 * 594 * I3[](def) 595 * I1[I3](priv), I2[I3]() 596 * C[I1,I2]() = mref 597 */ 598 (final SelectionResolutionTestCase.Builder builder) -> { 599 final ClassData.Package pck = 600 builder.classdata.get(builder.expected).packageId; 601 final MethodData.Context ctx = 602 builder.classdata.get(builder.expected).methoddata.context; 603 final MethodData.Access acc = 604 builder.classdata.get(builder.expected).methoddata.access; 605 final MethodData meth = 606 new MethodData(MethodData.Access.PRIVATE, 607 MethodData.Context.INSTANCE); 608 final ClassData withPrivDef = new ClassData(pck, meth); 609 final int I3 = builder.expected; 610 final int I2 = builder.addInterface(emptyClass(pck)); 611 final int I1 = builder.addInterface(withPrivDef); 612 final int C = builder.addClass(emptyClass(pck)); 613 builder.hier.addInherit(C, I1); 614 builder.hier.addInherit(C, I2); 615 builder.hier.addInherit(I1, I3); 616 builder.hier.addInherit(I2, I3); 617 builder.methodref = C; 618 }, 619 /* Case 4: Diamond, skipping static. 620 * 621 * I3[](def) 622 * I1[I3](stat), I2[I3]() 623 * C[I1,I2]() = mref 624 */ 625 (final SelectionResolutionTestCase.Builder builder) -> { 626 final ClassData.Package pck = 627 builder.classdata.get(builder.expected).packageId; 628 final MethodData.Context ctx = 629 builder.classdata.get(builder.expected).methoddata.context; 630 final MethodData.Access acc = 631 builder.classdata.get(builder.expected).methoddata.access; 632 final MethodData meth = 633 new MethodData(MethodData.Access.PUBLIC, 634 MethodData.Context.STATIC); 635 final ClassData withStatDef = new ClassData(pck, meth); 636 final int I3 = builder.expected; 637 final int I2 = builder.addInterface(emptyClass(pck)); 638 final int I1 = builder.addInterface(withStatDef); 639 final int C = builder.addClass(emptyClass(pck)); 640 builder.hier.addInherit(C, I1); 641 builder.hier.addInherit(C, I2); 642 builder.hier.addInherit(I1, I3); 643 builder.hier.addInherit(I2, I3); 644 builder.methodref = C; 645 }, 646 /* Case 5: Diamond, maximally-specific. 647 * 648 * I3[](def) 649 * I1[I3](res), I2[I3]() 650 * C[I1,I2]() = mref 651 */ 652 (final SelectionResolutionTestCase.Builder builder) -> { 653 final ClassData.Package pck = 654 builder.classdata.get(builder.expected).packageId; 655 final MethodData.Context ctx = 656 builder.classdata.get(builder.expected).methoddata.context; 657 final MethodData.Access acc = 658 builder.classdata.get(builder.expected).methoddata.access; 659 final MethodData mdata = getMethodData(acc, ctx); 660 final ClassData withDef = new ClassData(pck, mdata); 661 final int I3 = builder.addInterface(withDef); 662 final int I2 = builder.addInterface(emptyClass(pck)); 663 final int I1 = builder.expected; 664 final int C = builder.addClass(emptyClass(pck)); 665 builder.hier.addInherit(C, I1); 666 builder.hier.addInherit(C, I2); 667 builder.hier.addInherit(I1, I3); 668 builder.hier.addInherit(I2, I3); 669 builder.methodref = C; 670 }, 671 /* Case 6: Diamond, maximally-specific, skipping private. 672 * 673 * I3[](def) 674 * I1[I3](res), I2[I3](priv) 675 * C[I1,I2]() = mref 676 */ 677 (final SelectionResolutionTestCase.Builder builder) -> { 678 final ClassData.Package pck = 679 builder.classdata.get(builder.expected).packageId; 680 final MethodData.Context ctx = 681 builder.classdata.get(builder.expected).methoddata.context; 682 final MethodData.Access acc = 683 builder.classdata.get(builder.expected).methoddata.access; 684 final MethodData mdata = getMethodData(acc, ctx); 685 final ClassData withDef = new ClassData(pck, mdata); 686 final MethodData meth = 687 new MethodData(MethodData.Access.PRIVATE, 688 MethodData.Context.INSTANCE); 689 final ClassData withPrivDef = new ClassData(pck, meth); 690 final int I3 = builder.addInterface(withDef); 691 final int I2 = builder.addInterface(withPrivDef); 692 final int I1 = builder.expected; 693 final int C = builder.addClass(emptyClass(pck)); 694 builder.hier.addInherit(C, I1); 695 builder.hier.addInherit(C, I2); 696 builder.hier.addInherit(I1, I3); 697 builder.hier.addInherit(I2, I3); 698 builder.methodref = C; 699 }, 700 /* Case 7: Diamond, maximally-specific, skipping static. 701 * 702 * I3[](def) 703 * I1[I3](res), I2[I3](stat) 704 * C[I1,I2]() = mref 705 */ 706 (final SelectionResolutionTestCase.Builder builder) -> { 707 final ClassData.Package pck = 708 builder.classdata.get(builder.expected).packageId; 709 final MethodData.Context ctx = 710 builder.classdata.get(builder.expected).methoddata.context; 711 final MethodData.Access acc = 712 builder.classdata.get(builder.expected).methoddata.access; 713 final MethodData mdata = getMethodData(acc, ctx); 714 final ClassData withDef = new ClassData(pck, mdata); 715 final MethodData meth = 716 new MethodData(MethodData.Access.PUBLIC, 717 MethodData.Context.STATIC); 718 final ClassData withStatDef = new ClassData(pck, meth); 719 final int I3 = builder.addInterface(withDef); 720 final int I2 = builder.addInterface(withStatDef); 721 final int I1 = builder.expected; 722 final int C = builder.addClass(emptyClass(pck)); 723 builder.hier.addInherit(C, I1); 724 builder.hier.addInherit(C, I2); 725 builder.hier.addInherit(I1, I3); 726 builder.hier.addInherit(I2, I3); 727 builder.methodref = C; 728 }, 729 /* Case 8: Diamond, with superclass, expected at top. 730 * 731 * I2[](res) 732 * C2[I2](), I1[I2]() 733 * C1[I1,C2]() = mref 734 */ 735 (final SelectionResolutionTestCase.Builder builder) -> { 736 final ClassData.Package pck = 737 builder.classdata.get(builder.expected).packageId; 738 final int I2 = builder.expected; 739 final int I1 = builder.addInterface(emptyClass(pck)); 740 final int C2 = builder.addInterface(emptyClass(pck)); 741 final int C1 = builder.addClass(emptyClass(pck)); 742 builder.hier.addInherit(C1, I1); 743 builder.hier.addInherit(C1, C2); 744 builder.hier.addInherit(I1, I2); 745 builder.hier.addInherit(C2, I2); 746 builder.methodref = C1; 747 }, 748 /* Case 9: Diamond with superclass, maximally-specific. 749 * 750 * I2[](def) 751 * C2[I2](), I1[I2](res), 752 * C1[I1,C2]() = mref 753 */ 754 (final SelectionResolutionTestCase.Builder builder) -> { 755 final ClassData.Package pck = 756 builder.classdata.get(builder.expected).packageId; 757 final MethodData.Context ctx = 758 builder.classdata.get(builder.expected).methoddata.context; 759 final MethodData.Access acc = 760 builder.classdata.get(builder.expected).methoddata.access; 761 final MethodData mdata = getMethodData(acc, ctx); 762 final ClassData withDef = new ClassData(pck, mdata); 763 final int I2 = builder.addInterface(withDef); 764 final int C2 = builder.addClass(emptyClass(pck)); 765 final int I1 = builder.expected; 766 final int C1 = builder.addClass(emptyClass(pck)); 767 builder.hier.addInherit(C1, I1); 768 builder.hier.addInherit(C1, C2); 769 builder.hier.addInherit(I1, I2); 770 builder.hier.addInherit(C2, I2); 771 builder.methodref = C1; 772 }, 773 /* Case 10: Inherit through superclass. 774 * 775 * I[](res) 776 * C2[I]() 777 * C1[C2]() = mref 778 */ 779 (final SelectionResolutionTestCase.Builder builder) -> { 780 final ClassData.Package pck = 781 builder.classdata.get(builder.expected).packageId; 782 final int I = builder.expected; 783 final int C2 = builder.addInterface(emptyClass(pck)); 784 final int C1 = builder.addClass(emptyClass(pck)); 785 builder.hier.addInherit(C1, I); 786 builder.hier.addInherit(C1, C2); 787 builder.hier.addInherit(C2, I); 788 builder.methodref = C1; 789 }, 790 /* Case 11: Diamond, inherit through superclass, 791 * expected at top. 792 * 793 * I3[](res) 794 * I1[I3](), I2[I3]() 795 * C2[I1,I2]() 796 * C1[C2]() = mref 797 */ 798 (final SelectionResolutionTestCase.Builder builder) -> { 799 final ClassData.Package pck = 800 builder.classdata.get(builder.expected).packageId; 801 final int I3 = builder.expected; 802 final int I2 = builder.addInterface(emptyClass(pck)); 803 final int I1 = builder.addInterface(emptyClass(pck)); 804 final int C2 = builder.addClass(emptyClass(pck)); 805 final int C1 = builder.addClass(emptyClass(pck)); 806 builder.hier.addInherit(C2, I1); 807 builder.hier.addInherit(C2, I2); 808 builder.hier.addInherit(I1, I3); 809 builder.hier.addInherit(I2, I3); 810 builder.hier.addInherit(C1, C2); 811 builder.methodref = C1; 812 }, 813 /* Case 12: Diamond through superclass, skip private. 814 * 815 * I3[](res) 816 * I1[I3](priv), I2[I3]() 817 * C2[I1,I2]() 818 * C1[C2]() = mref 819 */ 820 (final SelectionResolutionTestCase.Builder builder) -> { 821 final ClassData.Package pck = 822 builder.classdata.get(builder.expected).packageId; 823 final MethodData.Context ctx = 824 builder.classdata.get(builder.expected).methoddata.context; 825 final MethodData.Access acc = 826 builder.classdata.get(builder.expected).methoddata.access; 827 final MethodData mdata = getMethodData(acc, ctx); 828 final ClassData withDef = new ClassData(pck, mdata); 829 final MethodData meth = 830 new MethodData(MethodData.Access.PRIVATE, 831 MethodData.Context.INSTANCE); 832 final ClassData withPrivDef = new ClassData(pck, meth); 833 final int I3 = builder.expected; 834 final int I2 = builder.addInterface(emptyClass(pck)); 835 final int I1 = builder.addInterface(withPrivDef); 836 final int C2 = builder.addClass(emptyClass(pck)); 837 final int C1 = builder.addClass(emptyClass(pck)); 838 builder.hier.addInherit(C2, I1); 839 builder.hier.addInherit(C2, I2); 840 builder.hier.addInherit(I1, I3); 841 builder.hier.addInherit(I2, I3); 842 builder.hier.addInherit(C1, C2); 843 builder.methodref = C1; 844 }, 845 /* Case 13: Diamond through superclass, skip static. 846 * 847 * I3[](def) 848 * I1[I3](stat), I2[I3]() 849 * C2[I1,I2]() 850 * C1[C2]() = mref 851 */ 852 (final SelectionResolutionTestCase.Builder builder) -> { 853 final ClassData.Package pck = 854 builder.classdata.get(builder.expected).packageId; 855 final MethodData.Context ctx = 856 builder.classdata.get(builder.expected).methoddata.context; 857 final MethodData.Access acc = 858 builder.classdata.get(builder.expected).methoddata.access; 859 final MethodData mdata = getMethodData(acc, ctx); 860 final ClassData withDef = new ClassData(pck, mdata); 861 final MethodData meth = 862 new MethodData(MethodData.Access.PUBLIC, 863 MethodData.Context.STATIC); 864 final ClassData withStatDef = new ClassData(pck, meth); 865 final int I3 = builder.expected; 866 final int I2 = builder.addInterface(emptyClass(pck)); 867 final int I1 = builder.addInterface(withStatDef); 868 final int C2 = builder.addClass(emptyClass(pck)); 869 final int C1 = builder.addClass(emptyClass(pck)); 870 builder.hier.addInherit(C2, I1); 871 builder.hier.addInherit(C2, I2); 872 builder.hier.addInherit(I1, I3); 873 builder.hier.addInherit(I2, I3); 874 builder.hier.addInherit(C1, C2); 875 builder.methodref = C1; 876 }, 877 /* Case 14: Diamond through superclass, maximally-specific. 878 * 879 * I3[](def) 880 * I1[I3](res), I2[I3]() 881 * C2[I1,I2]() 882 * C1[C2]() = mref 883 */ 884 (final SelectionResolutionTestCase.Builder builder) -> { 885 final ClassData.Package pck = 886 builder.classdata.get(builder.expected).packageId; 887 final MethodData.Context ctx = 888 builder.classdata.get(builder.expected).methoddata.context; 889 final MethodData.Access acc = 890 builder.classdata.get(builder.expected).methoddata.access; 891 final MethodData mdata = getMethodData(acc, ctx); 892 final ClassData withDef = new ClassData(pck, mdata); 893 final int I3 = builder.addInterface(withDef); 894 final int I2 = builder.addInterface(emptyClass(pck)); 895 final int I1 = builder.expected; 896 final int C2 = builder.addClass(emptyClass(pck)); 897 final int C1 = builder.addClass(emptyClass(pck)); 898 builder.hier.addInherit(C2, I1); 899 builder.hier.addInherit(C2, I2); 900 builder.hier.addInherit(I1, I3); 901 builder.hier.addInherit(I2, I3); 902 builder.hier.addInherit(C1, C2); 903 builder.methodref = C1; 904 }, 905 /* Case 15: Diamond through superclass, 906 * maximally-specific, skip private. 907 * 908 * I3[](def) 909 * I1[I3](res), I2[I3](priv) 910 * C2[I1,I2]() 911 * C1[C2]() = mref 912 */ 913 (final SelectionResolutionTestCase.Builder builder) -> { 914 final ClassData.Package pck = 915 builder.classdata.get(builder.expected).packageId; 916 final MethodData.Context ctx = 917 builder.classdata.get(builder.expected).methoddata.context; 918 final MethodData.Access acc = 919 builder.classdata.get(builder.expected).methoddata.access; 920 final MethodData mdata = getMethodData(acc, ctx); 921 final ClassData withDef = new ClassData(pck, mdata); 922 final MethodData meth = 923 new MethodData(MethodData.Access.PRIVATE, 924 MethodData.Context.INSTANCE); 925 final ClassData withPrivDef = new ClassData(pck, meth); 926 final int I3 = builder.addInterface(withDef); 927 final int I2 = builder.addInterface(withPrivDef); 928 final int I1 = builder.expected; 929 final int C2 = builder.addClass(emptyClass(pck)); 930 final int C1 = builder.addClass(emptyClass(pck)); 931 builder.hier.addInherit(C2, I1); 932 builder.hier.addInherit(C2, I2); 933 builder.hier.addInherit(I1, I3); 934 builder.hier.addInherit(I2, I3); 935 builder.hier.addInherit(C1, C2); 936 builder.methodref = C1; 937 }, 938 /* Case 16: Diamond through superclass, 939 * maximally-specific, skip static. 940 * 941 * I3[](pub) 942 * I1[I3](res), I2[I3](stat) 943 * C2[I1,I2]() 944 * C1[C2]() = mref 945 */ 946 (final SelectionResolutionTestCase.Builder builder) -> { 947 final ClassData.Package pck = 948 builder.classdata.get(builder.expected).packageId; 949 final MethodData.Context ctx = 950 builder.classdata.get(builder.expected).methoddata.context; 951 final MethodData.Access acc = 952 builder.classdata.get(builder.expected).methoddata.access; 953 final MethodData mdata = getMethodData(acc, ctx); 954 final ClassData withDef = new ClassData(pck, mdata); 955 final MethodData meth = 956 new MethodData(MethodData.Access.PUBLIC, 957 MethodData.Context.STATIC); 958 final ClassData withStatDef = new ClassData(pck, meth); 959 final int I3 = builder.addInterface(withDef); 960 final int I2 = builder.addInterface(withStatDef); 961 final int I1 = builder.expected; 962 final int C2 = builder.addClass(emptyClass(pck)); 963 final int C1 = builder.addClass(emptyClass(pck)); 964 builder.hier.addInherit(C2, I1); 965 builder.hier.addInherit(C2, I2); 966 builder.hier.addInherit(I1, I3); 967 builder.hier.addInherit(I2, I3); 968 builder.hier.addInherit(C1, C2); 969 builder.methodref = C1; 970 }, 971 /* Case 17: Diamond, with superclass, inherit through 972 * superclass, expected at top. 973 * 974 * I2[](res) 975 * C3[I2](), I1[I2]() 976 * C2[I1,C3]() 977 * C1[C2]() = mref 978 */ 979 (final SelectionResolutionTestCase.Builder builder) -> { 980 final ClassData.Package pck = 981 builder.classdata.get(builder.expected).packageId; 982 final int I2 = builder.expected; 983 final int I1 = builder.addInterface(emptyClass(pck)); 984 final int C3 = builder.addInterface(emptyClass(pck)); 985 final int C2 = builder.addClass(emptyClass(pck)); 986 final int C1 = builder.addClass(emptyClass(pck)); 987 builder.hier.addInherit(C2, I1); 988 builder.hier.addInherit(C2, C3); 989 builder.hier.addInherit(I1, I2); 990 builder.hier.addInherit(C3, I2); 991 builder.hier.addInherit(C1, C2); 992 builder.methodref = C1; 993 }, 994 /* Case 18: Diamond, with superclass, inherit through 995 * superclass, maximally-specific. 996 * 997 * I2[](def) 998 * C3[I2](), I1[I2](res), 999 * C2[I1,C3]() 1000 * C1[I1,C2]() = mref 1001 */ 1002 (final SelectionResolutionTestCase.Builder builder) -> { 1003 final ClassData.Package pck = 1004 builder.classdata.get(builder.expected).packageId; 1005 final MethodData.Context ctx = 1006 builder.classdata.get(builder.expected).methoddata.context; 1007 final MethodData.Access acc = 1008 builder.classdata.get(builder.expected).methoddata.access; 1009 final MethodData mdata = getMethodData(acc, ctx); 1010 final ClassData withDef = new ClassData(pck, mdata); 1011 final int I2 = builder.addInterface(withDef); 1012 final int C3 = builder.addClass(emptyClass(pck)); 1013 final int I1 = builder.expected; 1014 final int C2 = builder.addClass(emptyClass(pck)); 1015 final int C1 = builder.addClass(emptyClass(pck)); 1016 builder.hier.addInherit(C2, I1); 1017 builder.hier.addInherit(C2, C3); 1018 builder.hier.addInherit(I1, I2); 1019 builder.hier.addInherit(C3, I2); 1020 builder.hier.addInherit(C1, C2); 1021 builder.methodref = C1; 1022 }); 1023 1024 public static final Template IfaceMethodrefAmbiguous = 1025 new Template("IfaceMethodrefAmbiguous", 1026 /* Ambiguous. 1027 * 1028 * I2[](def), I3[](def) 1029 * I1[I2]() = mref 1030 */ 1031 (final SelectionResolutionTestCase.Builder builder) -> { 1032 final ClassData.Package pck = 1033 builder.classdata.get(builder.expected).packageId; 1034 final ClassData expected = 1035 builder.classdata.get(builder.expected); 1036 final int I3 = builder.addInterface(expected); 1037 final int I2 = builder.expected; 1038 final int I1 = builder.addInterface(emptyClass(pck)); 1039 builder.hier.addInherit(I1, I2); 1040 builder.hier.addInherit(I1, I3); 1041 builder.methodref = I1; 1042 }); 1043 1044 public static final Template MethodrefAmbiguous = 1045 new Template("MethodrefAmbiguous", 1046 /* Ambiguous. 1047 * 1048 * I1[](def), I2[](def) 1049 * C[I2]() = mref 1050 */ 1051 (final SelectionResolutionTestCase.Builder builder) -> { 1052 final ClassData.Package pck = 1053 builder.classdata.get(builder.expected).packageId; 1054 final ClassData expected = 1055 builder.classdata.get(builder.expected); 1056 final int I1 = builder.addInterface(expected); 1057 final int I2 = builder.expected; 1058 final int C = builder.addClass(emptyClass(pck)); 1059 builder.hier.addInherit(C, I2); 1060 builder.hier.addInherit(C, I1); 1061 builder.methodref = C; 1062 }); 1063 1064 /****************************** 1065 * Callsite Templates * 1066 ******************************/ 1067 1068 public static final Template AllCallsiteCases = 1069 new Template("AllCallsiteCases", 1070 Template::callsiteIsMethodref, 1071 Template::callsiteSubclassMethodref, 1072 Template::callsiteUnrelatedMethodref); 1073 1074 public static final Template InvokespecialCallsiteCases = 1075 new Template("InvokespecialCallsiteCases", 1076 Template::callsiteIsMethodref, 1077 Template::callsiteSubclassMethodref); 1078 1079 public static final Template CallsiteEqualsMethodref = 1080 new Template("CallsiteEqualsMethodref", 1081 Template::callsiteIsMethodref); 1082 1083 public static final Template CallsiteSubclassMethodref = 1084 new Template("CallsiteSubclassMethodref", 1085 Template::callsiteSubclassMethodref); 1086 1087 public static final Template CallsiteUnrelatedToMethodref = 1088 new Template("CallsiteUnrelatedToMethodref", 1089 Template::callsiteUnrelatedMethodref); 1090 1091 public static final Template CallsiteNotEqualsMethodref = 1092 new Template("CallsiteNotEqualsMethodref", 1093 Template::callsiteSubclassMethodref, 1094 Template::callsiteUnrelatedMethodref); 1095 1096 /********************************* 1097 * AbstractMethodError Templates * 1098 *********************************/ 1099 1100 public static final Template ReabstractExpectedIface = 1101 new Template("ReabstractExpectedIface", 1102 (builder) -> {}, 1103 (final SelectionResolutionTestCase.Builder builder) -> { 1104 final ClassData expected = 1105 builder.classdata.get(builder.expected); 1106 final ClassData.Package pck = expected.packageId; 1107 final MethodData.Access acc = 1108 builder.classdata.get(builder.expected).methoddata.access; 1109 final MethodData mdata = 1110 getMethodData(acc, MethodData.Context.STATIC); 1111 final ClassData withDef = new ClassData(pck, mdata); 1112 final int C2 = builder.addInterface(withDef); 1113 final int C1 = builder.expected; 1114 builder.hier.addInherit(C1, C2); 1115 }, 1116 (final SelectionResolutionTestCase.Builder builder) -> { 1117 final ClassData expected = 1118 builder.classdata.get(builder.expected); 1119 final ClassData.Package pck = expected.packageId; 1120 final MethodData.Access acc = 1121 builder.classdata.get(builder.expected).methoddata.access; 1122 final MethodData mdata = 1123 getMethodData(acc, MethodData.Context.INSTANCE); 1124 final ClassData withDef = new ClassData(pck, mdata); 1125 final int C2 = builder.addInterface(withDef); 1126 final int C1 = builder.expected; 1127 builder.hier.addInherit(C1, C2); 1128 }); 1129 1130 public static final Template ReabstractExpectedClass = 1131 new Template("ReabstractExpectedClass", 1132 ReabstractExpectedIface, 1133 (final SelectionResolutionTestCase.Builder builder) -> { 1134 final ClassData expected = 1135 builder.classdata.get(builder.expected); 1136 final ClassData.Package pck = expected.packageId; 1137 final MethodData.Access acc = 1138 builder.classdata.get(builder.expected).methoddata.access; 1139 final MethodData mdata = 1140 getMethodData(acc, MethodData.Context.STATIC); 1141 final ClassData withDef = new ClassData(pck, mdata); 1142 final int C2 = builder.addClass(withDef); 1143 final int C1 = builder.expected; 1144 builder.hier.addInherit(C1, C2); 1145 }, 1146 (final SelectionResolutionTestCase.Builder builder) -> { 1147 final ClassData expected = 1148 builder.classdata.get(builder.expected); 1149 final ClassData.Package pck = expected.packageId; 1150 final MethodData.Access acc = 1151 builder.classdata.get(builder.expected).methoddata.access; 1152 final MethodData mdata = 1153 getMethodData(acc, MethodData.Context.INSTANCE); 1154 final ClassData withDef = new ClassData(pck, mdata); 1155 final int C2 = builder.addClass(withDef); 1156 final int C1 = builder.expected; 1157 builder.hier.addInherit(C1, C2); 1158 }); 1159 1160 public static final Template ReabstractMethodrefResolvedClass = 1161 new Template("ReabstractMethodrefResolvedClass", 1162 /* Case 1: Objectref overrides. 1163 * 1164 * C2[](*) = mref 1165 * C1[C2](res) = oref = expected 1166 */ 1167 (final SelectionResolutionTestCase.Builder builder) -> { 1168 final ClassData.Package pck = 1169 builder.classdata.get(builder.methodref).packageId; 1170 final ClassData oldexpected = 1171 builder.classdata.get(builder.expected); 1172 final MethodData.Access acc = 1173 builder.classdata.get(builder.expected).methoddata.access; 1174 final ClassData withDef = 1175 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1176 final int C2 = builder.methodref; 1177 final int C1 = builder.addClass(withDef); 1178 builder.hier.addInherit(C1, C2); 1179 builder.objectref = C1; 1180 builder.expected = C1; 1181 }, 1182 /* Case 2: Objectref's super overrides. 1183 * 1184 * C3[*](*) = mref 1185 * C2[C3](res) = expected 1186 * C1[C2]() = oref 1187 */ 1188 (final SelectionResolutionTestCase.Builder builder) -> { 1189 final ClassData.Package pck = 1190 builder.classdata.get(builder.methodref).packageId; 1191 final ClassData oldexpected = 1192 builder.classdata.get(builder.expected); 1193 final MethodData.Access acc = 1194 builder.classdata.get(builder.expected).methoddata.access; 1195 final ClassData withDef = 1196 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1197 final int C3 = builder.methodref; 1198 final int C2 = builder.addClass(withDef); 1199 final int C1 = builder.addClass(emptyClass(pck)); 1200 builder.hier.addInherit(C2, C3); 1201 builder.hier.addInherit(C1, C2); 1202 builder.objectref = C1; 1203 builder.expected = C2; 1204 }, 1205 /* Case 3: Objectref's super overrides, skip private. 1206 * 1207 * C3[*](*) = mref 1208 * C2[C3](res) = expected 1209 * C1[C2](priv) = oref 1210 */ 1211 (final SelectionResolutionTestCase.Builder builder) -> { 1212 final ClassData.Package pck = 1213 builder.classdata.get(builder.methodref).packageId; 1214 final ClassData oldexpected = 1215 builder.classdata.get(builder.expected); 1216 final MethodData.Access acc = 1217 builder.classdata.get(builder.expected).methoddata.access; 1218 final ClassData withDef = 1219 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1220 final MethodData meth = 1221 new MethodData(MethodData.Access.PRIVATE, 1222 MethodData.Context.INSTANCE); 1223 final ClassData withPrivDef = new ClassData(pck, meth); 1224 final int C3 = builder.methodref; 1225 final int C2 = builder.addClass(withDef); 1226 final int C1 = builder.addClass(withPrivDef); 1227 builder.hier.addInherit(C2, C3); 1228 builder.hier.addInherit(C1, C2); 1229 builder.objectref = C1; 1230 builder.expected = C2; 1231 }, 1232 /* Case 4: Objectref's super overrides, skip static. 1233 * 1234 * C3[*](*) = mref 1235 * C2[C3](res) = expected 1236 * C1[C2](stat) = oref 1237 */ 1238 (final SelectionResolutionTestCase.Builder builder) -> { 1239 final ClassData.Package pck = 1240 builder.classdata.get(builder.methodref).packageId; 1241 final ClassData oldexpected = 1242 builder.classdata.get(builder.expected); 1243 final MethodData.Access acc = 1244 builder.classdata.get(builder.expected).methoddata.access; 1245 final ClassData withDef = 1246 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1247 final MethodData meth = 1248 new MethodData(MethodData.Access.PUBLIC, 1249 MethodData.Context.STATIC); 1250 final ClassData withStatDef = new ClassData(pck, meth); 1251 final int C3 = builder.methodref; 1252 final int C2 = builder.addClass(withDef); 1253 final int C1 = builder.addClass(withStatDef); 1254 builder.hier.addInherit(C2, C3); 1255 builder.hier.addInherit(C1, C2); 1256 builder.objectref = C1; 1257 builder.expected = C2; 1258 }); 1259 1260 public static final Template ReabstractMethodrefResolvedIface = 1261 new Template("ReabstractMethodrefResolvedIface", 1262 /* Case 1: Objectref overrides. 1263 * 1264 * C2[](*) = mref 1265 * C1[C2](res) = oref = expected 1266 */ 1267 (final SelectionResolutionTestCase.Builder builder) -> { 1268 final ClassData.Package pck = 1269 builder.classdata.get(builder.methodref).packageId; 1270 final ClassData oldexpected = 1271 builder.classdata.get(builder.expected); 1272 final MethodData.Access acc = 1273 builder.classdata.get(builder.expected).methoddata.access; 1274 final ClassData withDef = 1275 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1276 final int C2 = builder.methodref; 1277 final int C1 = builder.addClass(withDef); 1278 builder.hier.addInherit(C1, C2); 1279 builder.objectref = C1; 1280 builder.expected = C1; 1281 }, 1282 /* Case 2: Objectref's super overrides. 1283 * 1284 * C3[](*) = mref 1285 * C2[C3](res) = expected 1286 * C1[C2]() = oref 1287 */ 1288 (final SelectionResolutionTestCase.Builder builder) -> { 1289 final ClassData.Package pck = 1290 builder.classdata.get(builder.methodref).packageId; 1291 final ClassData oldexpected = 1292 builder.classdata.get(builder.expected); 1293 final MethodData.Access acc = 1294 builder.classdata.get(builder.expected).methoddata.access; 1295 final ClassData withDef = 1296 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1297 final int C3 = builder.methodref; 1298 final int C2 = builder.addClass(withDef); 1299 final int C1 = builder.addClass(emptyClass(pck)); 1300 builder.hier.addInherit(C2, C3); 1301 builder.hier.addInherit(C1, C2); 1302 builder.objectref = C1; 1303 builder.expected = C2; 1304 }, 1305 /* Case 3: Objectref's super overrides, skip private. 1306 * 1307 * C3[*](*) = mref 1308 * C2[C3](res) = expected 1309 * C1[C2](priv) = oref 1310 */ 1311 (final SelectionResolutionTestCase.Builder builder) -> { 1312 final ClassData.Package pck = 1313 builder.classdata.get(builder.methodref).packageId; 1314 final ClassData oldexpected = 1315 builder.classdata.get(builder.expected); 1316 final MethodData.Access acc = 1317 builder.classdata.get(builder.expected).methoddata.access; 1318 final ClassData withDef = 1319 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1320 final MethodData meth = 1321 new MethodData(MethodData.Access.PRIVATE, 1322 MethodData.Context.INSTANCE); 1323 final ClassData withPrivDef = new ClassData(pck, meth); 1324 final int C3 = builder.methodref; 1325 final int C2 = builder.addClass(withDef); 1326 final int C1 = builder.addClass(withPrivDef); 1327 builder.hier.addInherit(C2, C3); 1328 builder.hier.addInherit(C1, C2); 1329 builder.objectref = C1; 1330 builder.expected = C2; 1331 }, 1332 /* Case 4: Objectref's super overrides, skip static. 1333 * 1334 * C3[*](*) = mref 1335 * C2[C3](res) = expected 1336 * C1[C2](stat) = oref 1337 */ 1338 (final SelectionResolutionTestCase.Builder builder) -> { 1339 final ClassData.Package pck = 1340 builder.classdata.get(builder.methodref).packageId; 1341 final ClassData oldexpected = 1342 builder.classdata.get(builder.expected); 1343 final MethodData.Access acc = 1344 builder.classdata.get(builder.expected).methoddata.access; 1345 final ClassData withDef = 1346 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1347 final MethodData meth = 1348 new MethodData(MethodData.Access.PUBLIC, 1349 MethodData.Context.STATIC); 1350 final ClassData withStatDef = new ClassData(pck, meth); 1351 final int C3 = builder.methodref; 1352 final int C2 = builder.addClass(withDef); 1353 final int C1 = builder.addClass(withStatDef); 1354 builder.hier.addInherit(C2, C3); 1355 builder.hier.addInherit(C1, C2); 1356 builder.objectref = C1; 1357 builder.expected = C2; 1358 }, 1359 /* Case 5: Overlapping with new interface overriding. 1360 * 1361 * I2[*](def) = old expected 1362 * C2[*](*) = mref, I1[I2](res) = expected 1363 * C1[C2,I2]() = oref 1364 */ 1365 (final SelectionResolutionTestCase.Builder builder) -> { 1366 final ClassData.Package pck = 1367 builder.classdata.get(builder.methodref).packageId; 1368 final ClassData oldexpected = 1369 builder.classdata.get(builder.expected); 1370 final MethodData.Access acc = 1371 builder.classdata.get(builder.expected).methoddata.access; 1372 final ClassData withDef = 1373 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1374 final int C2 = builder.methodref; 1375 final int I2 = builder.expected; 1376 final int I1 = builder.addInterface(withDef); 1377 final int C1 = builder.addClass(emptyClass(pck)); 1378 builder.hier.addInherit(C1, C2); 1379 builder.hier.addInherit(C1, I1); 1380 builder.hier.addInherit(I1, I2); 1381 builder.objectref = C1; 1382 builder.expected = I1; 1383 }, 1384 /* Case 6: Overlapping with new interface, skip private. 1385 * 1386 * I2[*](def) = old expected 1387 * C2[*](*) = mref, I1[I2](res) = expected 1388 * C1[C2,I2](priv) = oref 1389 */ 1390 (final SelectionResolutionTestCase.Builder builder) -> { 1391 final ClassData.Package pck = 1392 builder.classdata.get(builder.methodref).packageId; 1393 final ClassData oldexpected = 1394 builder.classdata.get(builder.expected); 1395 final MethodData.Access acc = 1396 builder.classdata.get(builder.expected).methoddata.access; 1397 final ClassData withDef = 1398 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1399 final MethodData meth = 1400 new MethodData(MethodData.Access.PRIVATE, 1401 MethodData.Context.INSTANCE); 1402 final ClassData withPrivDef = new ClassData(pck, meth); 1403 final int C2 = builder.methodref; 1404 final int I2 = builder.expected; 1405 final int I1 = builder.addInterface(withDef); 1406 final int C1 = builder.addClass(withPrivDef); 1407 builder.hier.addInherit(C1, C2); 1408 builder.hier.addInherit(C1, I1); 1409 builder.hier.addInherit(I1, I2); 1410 builder.objectref = C1; 1411 builder.expected = I1; 1412 }, 1413 /* Case 7: Overlapping with new interface, skip static. 1414 * 1415 * I2[*](def) = old expected 1416 * C2[*](*) = mref, I1[I2](res) = expected 1417 * C1[C2,I2](stat) = oref 1418 */ 1419 (final SelectionResolutionTestCase.Builder builder) -> { 1420 final ClassData.Package pck = 1421 builder.classdata.get(builder.methodref).packageId; 1422 final ClassData oldexpected = 1423 builder.classdata.get(builder.expected); 1424 final MethodData.Access acc = 1425 builder.classdata.get(builder.expected).methoddata.access; 1426 final ClassData withDef = 1427 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1428 final MethodData meth = 1429 new MethodData(MethodData.Access.PUBLIC, 1430 MethodData.Context.STATIC); 1431 final ClassData withStatDef = new ClassData(pck, meth); 1432 final int C2 = builder.methodref; 1433 final int I2 = builder.expected; 1434 final int I1 = builder.addInterface(withDef); 1435 final int C1 = builder.addClass(withStatDef); 1436 builder.hier.addInherit(C1, C2); 1437 builder.hier.addInherit(C1, I1); 1438 builder.hier.addInherit(I1, I2); 1439 builder.objectref = C1; 1440 builder.expected = I1; 1441 }, 1442 /* Case 8: Overlap with objectref's super with new 1443 * interface overriding, inherit through class. 1444 * 1445 * I2[*](def) = old expected 1446 * C3[](*) = mref, I1[I2](res) = expected 1447 * C2[C3,I1]() 1448 * C1[C2]() = oref 1449 */ 1450 (final SelectionResolutionTestCase.Builder builder) -> { 1451 final ClassData.Package pck = 1452 builder.classdata.get(builder.methodref).packageId; 1453 final ClassData oldexpected = 1454 builder.classdata.get(builder.expected); 1455 final MethodData.Access acc = 1456 builder.classdata.get(builder.expected).methoddata.access; 1457 final ClassData withDef = 1458 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1459 final int C3 = builder.methodref; 1460 final int C2 = builder.addClass(emptyClass(pck)); 1461 final int I2 = builder.expected; 1462 final int I1 = builder.addInterface(withDef); 1463 final int C1 = builder.addClass(emptyClass(pck)); 1464 builder.hier.addInherit(C2, C3); 1465 builder.hier.addInherit(C1, C2); 1466 builder.hier.addInherit(C2, I1); 1467 builder.hier.addInherit(I1, I2); 1468 builder.objectref = C1; 1469 builder.expected = I1; 1470 }, 1471 /* Case 9: Overlap with objectref's super with new 1472 * interface double diamond, overriding. 1473 * 1474 * I3[*](def) = old expected 1475 * C3[](*) = mref, I2[I3](def) 1476 * C2[C3,I2](), I1[I2](res) = expected 1477 * C1[C2,I1]() = oref 1478 */ 1479 (final SelectionResolutionTestCase.Builder builder) -> { 1480 final ClassData.Package pck = 1481 builder.classdata.get(builder.methodref).packageId; 1482 final ClassData oldexpected = 1483 builder.classdata.get(builder.expected); 1484 final MethodData.Access acc = 1485 builder.classdata.get(builder.expected).methoddata.access; 1486 final ClassData withDef = 1487 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1488 final int C3 = builder.methodref; 1489 final int C2 = builder.addClass(emptyClass(pck)); 1490 final int I3 = builder.expected; 1491 final int I2 = builder.addInterface(withDef); 1492 final int I1 = builder.addInterface(withDef); 1493 final int C1 = builder.addClass(emptyClass(pck)); 1494 builder.hier.addInherit(C2, C3); 1495 builder.hier.addInherit(C1, C2); 1496 builder.hier.addInherit(C1, I1); 1497 builder.hier.addInherit(C2, I2); 1498 builder.hier.addInherit(I1, I2); 1499 builder.hier.addInherit(I2, I3); 1500 builder.objectref = C1; 1501 builder.expected = I1; 1502 }, 1503 /* Case 10: Overlap with objectref's super with new 1504 * interface double diamond, skip private. 1505 * 1506 * I3[*](def) = old expected 1507 * C3[](*) = mref, I2[I3](res) = expected 1508 * C2[C3,I2](), I1[I2](priv) 1509 * C1[C2,I1]() = oref 1510 */ 1511 (final SelectionResolutionTestCase.Builder builder) -> { 1512 final ClassData.Package pck = 1513 builder.classdata.get(builder.methodref).packageId; 1514 final ClassData oldexpected = 1515 builder.classdata.get(builder.expected); 1516 final MethodData.Access acc = 1517 builder.classdata.get(builder.expected).methoddata.access; 1518 final ClassData withDef = 1519 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1520 final MethodData meth = 1521 new MethodData(MethodData.Access.PRIVATE, 1522 MethodData.Context.INSTANCE); 1523 final ClassData withPrivDef = new ClassData(pck, meth); 1524 final int C3 = builder.methodref; 1525 final int C2 = builder.addClass(emptyClass(pck)); 1526 final int I3 = builder.expected; 1527 final int I2 = builder.addInterface(withDef); 1528 final int I1 = builder.addInterface(withPrivDef); 1529 final int C1 = builder.addClass(emptyClass(pck)); 1530 builder.hier.addInherit(C2, C3); 1531 builder.hier.addInherit(C1, C2); 1532 builder.hier.addInherit(C1, I1); 1533 builder.hier.addInherit(C2, I2); 1534 builder.hier.addInherit(I1, I2); 1535 builder.hier.addInherit(I2, I3); 1536 builder.objectref = C1; 1537 builder.expected = I2; 1538 }, 1539 /* Case 11: Overlap with objectref's super with new 1540 * interface double diamond, skip static. 1541 * 1542 * I3[*](def) = old expected 1543 * C3[](*) = mref, I2[I3](res) = expected 1544 * C2[C3,I2](), I1[I2](stat) 1545 * C1[C2,I1]() = oref 1546 */ 1547 (final SelectionResolutionTestCase.Builder builder) -> { 1548 final ClassData.Package pck = 1549 builder.classdata.get(builder.methodref).packageId; 1550 final ClassData oldexpected = 1551 builder.classdata.get(builder.expected); 1552 final MethodData.Access acc = 1553 builder.classdata.get(builder.expected).methoddata.access; 1554 final ClassData withDef = 1555 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1556 final MethodData meth = 1557 new MethodData(MethodData.Access.PUBLIC, 1558 MethodData.Context.STATIC); 1559 final ClassData withStatDef = new ClassData(pck, meth); 1560 final int C3 = builder.methodref; 1561 final int C2 = builder.addClass(emptyClass(pck)); 1562 final int I3 = builder.expected; 1563 final int I2 = builder.addInterface(withDef); 1564 final int I1 = builder.addInterface(withStatDef); 1565 final int C1 = builder.addClass(emptyClass(pck)); 1566 builder.hier.addInherit(C2, C3); 1567 builder.hier.addInherit(C1, C2); 1568 builder.hier.addInherit(C1, I1); 1569 builder.hier.addInherit(C2, I2); 1570 builder.hier.addInherit(I1, I2); 1571 builder.hier.addInherit(I2, I3); 1572 builder.objectref = C1; 1573 builder.expected = I2; 1574 }, 1575 /* Case 12: Objectref's super overrides, skip interface below. 1576 * 1577 * C3[](*) = mref 1578 * C2[C3](res) = expected, I[](def) 1579 * C1[C2,I]() = oref 1580 */ 1581 (final SelectionResolutionTestCase.Builder builder) -> { 1582 final ClassData.Package pck = 1583 builder.classdata.get(builder.methodref).packageId; 1584 final ClassData oldexpected = 1585 builder.classdata.get(builder.expected); 1586 final MethodData.Access acc = 1587 builder.classdata.get(builder.expected).methoddata.access; 1588 final ClassData withDef = 1589 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1590 final int C3 = builder.methodref; 1591 final int C2 = builder.addClass(withDef); 1592 final int C1 = builder.addClass(emptyClass(pck)); 1593 final int I = builder.addInterface(withDef); 1594 builder.hier.addInherit(C2, C3); 1595 builder.hier.addInherit(C1, C2); 1596 builder.hier.addInherit(C1, I); 1597 builder.objectref = C1; 1598 builder.expected = C2; 1599 }, 1600 /* Case 13: Objectref's super overrides, skip interface above. 1601 * 1602 * C3[](*) = mref, I[](def) 1603 * C2[C3,I](res) = expected 1604 * C1[C2]() = oref 1605 */ 1606 (final SelectionResolutionTestCase.Builder builder) -> { 1607 final ClassData.Package pck = 1608 builder.classdata.get(builder.methodref).packageId; 1609 final ClassData oldexpected = 1610 builder.classdata.get(builder.expected); 1611 final MethodData.Access acc = 1612 builder.classdata.get(builder.expected).methoddata.access; 1613 final ClassData withDef = 1614 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1615 final int C3 = builder.methodref; 1616 final int C2 = builder.addClass(withDef); 1617 final int C1 = builder.addClass(emptyClass(pck)); 1618 final int I = builder.addInterface(withDef); 1619 builder.hier.addInherit(C2, C3); 1620 builder.hier.addInherit(C1, C2); 1621 builder.hier.addInherit(C2, I); 1622 builder.objectref = C1; 1623 builder.expected = C2; 1624 }); 1625 1626 public static final Template ReabstractIfaceMethodrefResolved = 1627 new Template("ReabstractIfaceMethodrefResolved", 1628 /* Case 1: Objectref overrides. 1629 * 1630 * I[](*) = mref 1631 * C[I](res) = oref = expected 1632 */ 1633 (final SelectionResolutionTestCase.Builder builder) -> { 1634 final ClassData.Package pck = 1635 builder.classdata.get(builder.methodref).packageId; 1636 final ClassData oldexpected = 1637 builder.classdata.get(builder.expected); 1638 final MethodData.Access acc = 1639 builder.classdata.get(builder.expected).methoddata.access; 1640 final ClassData withDef = 1641 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1642 final int I = builder.methodref; 1643 final int C = builder.addClass(withDef); 1644 builder.hier.addInherit(C, I); 1645 builder.objectref = C; 1646 builder.expected = C; 1647 }, 1648 /* Case 2: Diamond, methodref at top, overriding. 1649 * 1650 * I3[](*) = mref 1651 * I1[I3](), I2[I3](res) = expected 1652 * C[I1,I2]() = oref 1653 */ 1654 (final SelectionResolutionTestCase.Builder builder) -> { 1655 final ClassData.Package pck = 1656 builder.classdata.get(builder.expected).packageId; 1657 final ClassData oldexpected = 1658 builder.classdata.get(builder.expected); 1659 final MethodData.Access acc = 1660 builder.classdata.get(builder.expected).methoddata.access; 1661 final ClassData withDef = 1662 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1663 final int I3 = builder.methodref; 1664 final int I2 = builder.addInterface(withDef); 1665 final int I1 = builder.addInterface(emptyClass(pck)); 1666 final int C = builder.addClass(emptyClass(pck)); 1667 builder.hier.addInherit(C, I1); 1668 builder.hier.addInherit(C, I2); 1669 builder.hier.addInherit(I1, I3); 1670 builder.hier.addInherit(I2, I3); 1671 builder.objectref = C; 1672 builder.expected = I2; 1673 }, 1674 /* Case 3: Diamond, methodref at top, skip static. 1675 * 1676 * I3[](*) = mref 1677 * I1[I3](), I2[I3](res) = expected 1678 * C[I1,I2](stat) = oref 1679 */ 1680 (final SelectionResolutionTestCase.Builder builder) -> { 1681 final ClassData.Package pck = 1682 builder.classdata.get(builder.expected).packageId; 1683 final ClassData oldexpected = 1684 builder.classdata.get(builder.expected); 1685 final MethodData.Access acc = 1686 builder.classdata.get(builder.expected).methoddata.access; 1687 final ClassData withDef = 1688 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1689 final MethodData meth = 1690 new MethodData(MethodData.Access.PUBLIC, 1691 MethodData.Context.STATIC); 1692 final ClassData withStatDef = new ClassData(pck, meth); 1693 final int I3 = builder.methodref; 1694 final int I2 = builder.addInterface(withDef); 1695 final int I1 = builder.addInterface(emptyClass(pck)); 1696 final int C = builder.addClass(withStatDef); 1697 builder.hier.addInherit(C, I1); 1698 builder.hier.addInherit(C, I2); 1699 builder.hier.addInherit(I1, I3); 1700 builder.hier.addInherit(I2, I3); 1701 builder.objectref = C; 1702 builder.expected = I2; 1703 }, 1704 /* Case 4: Diamond, with superclass, methodref at top, 1705 * class overriding. 1706 * 1707 * I2[](*) = mref 1708 * C2[I2](res) = expected, I1[I2]() 1709 * C1[I1,C2]() = oref 1710 */ 1711 (final SelectionResolutionTestCase.Builder builder) -> { 1712 final ClassData.Package pck = 1713 builder.classdata.get(builder.expected).packageId; 1714 final ClassData oldexpected = 1715 builder.classdata.get(builder.expected); 1716 final MethodData.Access acc = 1717 builder.classdata.get(builder.expected).methoddata.access; 1718 final ClassData withDef = 1719 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1720 final int I2 = builder.methodref; 1721 final int I1 = builder.addInterface(emptyClass(pck)); 1722 final int C2 = builder.addClass(withDef); 1723 final int C1 = builder.addClass(emptyClass(pck)); 1724 builder.hier.addInherit(C1, I1); 1725 builder.hier.addInherit(C1, C2); 1726 builder.hier.addInherit(I1, I2); 1727 builder.hier.addInherit(C2, I2); 1728 builder.objectref = C1; 1729 builder.expected = C2; 1730 }, 1731 /* Case 5: Diamond, with superclass, methodref at top, 1732 * class overriding, skip static. 1733 * 1734 * I2[](*) = mref 1735 * C2[I2](res) = expected, I1[I2]() 1736 * C1[I1,C2](stat) = oref 1737 */ 1738 (final SelectionResolutionTestCase.Builder builder) -> { 1739 final ClassData.Package pck = 1740 builder.classdata.get(builder.expected).packageId; 1741 final ClassData oldexpected = 1742 builder.classdata.get(builder.expected); 1743 final MethodData.Access acc = 1744 builder.classdata.get(builder.expected).methoddata.access; 1745 final ClassData withDef = 1746 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1747 final MethodData meth = 1748 new MethodData(MethodData.Access.PUBLIC, 1749 MethodData.Context.STATIC); 1750 final ClassData withStatDef = new ClassData(pck, meth); 1751 final int I2 = builder.methodref; 1752 final int I1 = builder.addInterface(emptyClass(pck)); 1753 final int C2 = builder.addClass(withDef); 1754 final int C1 = builder.addClass(withStatDef); 1755 builder.hier.addInherit(C1, I1); 1756 builder.hier.addInherit(C1, C2); 1757 builder.hier.addInherit(I1, I2); 1758 builder.hier.addInherit(C2, I2); 1759 builder.objectref = C1; 1760 builder.expected = C2; 1761 }, 1762 /* Case 6: Diamond, with superclass, expected at top, 1763 * interface overriding 1764 * 1765 * I2[](*) = mref 1766 * C2[I2](), I1[I2](res) = expected 1767 * C1[I1,C2]() = oref 1768 */ 1769 (final SelectionResolutionTestCase.Builder builder) -> { 1770 final ClassData.Package pck = 1771 builder.classdata.get(builder.expected).packageId; 1772 final ClassData oldexpected = 1773 builder.classdata.get(builder.expected); 1774 final MethodData.Access acc = 1775 builder.classdata.get(builder.expected).methoddata.access; 1776 final ClassData withDef = 1777 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1778 final int I2 = builder.methodref; 1779 final int I1 = builder.addInterface(withDef); 1780 final int C2 = builder.addClass(emptyClass(pck)); 1781 final int C1 = builder.addClass(emptyClass(pck)); 1782 builder.hier.addInherit(C1, I1); 1783 builder.hier.addInherit(C1, C2); 1784 builder.hier.addInherit(I1, I2); 1785 builder.hier.addInherit(C2, I2); 1786 builder.objectref = C1; 1787 builder.expected = I1; 1788 }, 1789 /* Case 7: Diamond, with superclass, expected at top, 1790 * interface skip static 1791 * 1792 * I2[](*) = mref 1793 * C2[I2](), I1[I2](res) = expected 1794 * C1[I1,C2](stat) = oref 1795 */ 1796 (final SelectionResolutionTestCase.Builder builder) -> { 1797 final ClassData.Package pck = 1798 builder.classdata.get(builder.expected).packageId; 1799 final ClassData oldexpected = 1800 builder.classdata.get(builder.expected); 1801 final MethodData.Access acc = 1802 builder.classdata.get(builder.expected).methoddata.access; 1803 final ClassData withDef = 1804 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1805 final MethodData meth = 1806 new MethodData(MethodData.Access.PUBLIC, 1807 MethodData.Context.STATIC); 1808 final ClassData withStatDef = new ClassData(pck, meth); 1809 final int I2 = builder.methodref; 1810 final int I1 = builder.addInterface(withDef); 1811 final int C2 = builder.addClass(emptyClass(pck)); 1812 final int C1 = builder.addClass(withStatDef); 1813 builder.hier.addInherit(C1, I1); 1814 builder.hier.addInherit(C1, C2); 1815 builder.hier.addInherit(I1, I2); 1816 builder.hier.addInherit(C2, I2); 1817 builder.objectref = C1; 1818 builder.expected = I1; 1819 }, 1820 /* Case 8: Y, with superclass, overlaping, expected 1821 * at top, class overrides 1822 * 1823 * C2[I2](res) = expected, I1[](*) = mref 1824 * C1[I1,C2]() = oref 1825 */ 1826 (final SelectionResolutionTestCase.Builder builder) -> { 1827 final ClassData.Package pck = 1828 builder.classdata.get(builder.expected).packageId; 1829 final ClassData oldexpected = 1830 builder.classdata.get(builder.expected); 1831 final MethodData.Access acc = 1832 builder.classdata.get(builder.expected).methoddata.access; 1833 final ClassData withDef = 1834 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1835 final int I1 = builder.methodref; 1836 final int C2 = builder.addClass(withDef); 1837 final int C1 = builder.addClass(emptyClass(pck)); 1838 builder.hier.addInherit(C1, I1); 1839 builder.hier.addInherit(C1, C2); 1840 builder.objectref = C1; 1841 builder.expected = C2; 1842 }, 1843 /* Case 9: Diamond, with superclass, overlaping, expected 1844 * at top, class overrides 1845 * 1846 * I2[](def) = old expected 1847 * C2[I2](res) = expected, I1[](*) = mref 1848 * C1[I1,C2]() = oref 1849 */ 1850 (final SelectionResolutionTestCase.Builder builder) -> { 1851 final ClassData.Package pck = 1852 builder.classdata.get(builder.expected).packageId; 1853 final ClassData oldexpected = 1854 builder.classdata.get(builder.expected); 1855 final MethodData.Access acc = 1856 builder.classdata.get(builder.expected).methoddata.access; 1857 final ClassData withDef = 1858 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1859 final int I2 = builder.expected; 1860 final int I1 = builder.methodref; 1861 final int C2 = builder.addClass(withDef); 1862 final int C1 = builder.addClass(emptyClass(pck)); 1863 builder.hier.addInherit(C1, I1); 1864 builder.hier.addInherit(C1, C2); 1865 builder.hier.addInherit(C2, I2); 1866 builder.objectref = C1; 1867 builder.expected = C2; 1868 }, 1869 /* Case 10: Diamond, with superclass, overlaping, expected 1870 * at top, class overrides, skipping static 1871 * 1872 * I2[](def) = old expected 1873 * C2[I2](res) = expected, I1[](*) = mref 1874 * C1[I1,C2](stat) = oref 1875 */ 1876 (final SelectionResolutionTestCase.Builder builder) -> { 1877 final ClassData.Package pck = 1878 builder.classdata.get(builder.expected).packageId; 1879 final ClassData oldexpected = 1880 builder.classdata.get(builder.expected); 1881 final MethodData.Access acc = 1882 builder.classdata.get(builder.expected).methoddata.access; 1883 final ClassData withDef = 1884 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1885 final MethodData meth = 1886 new MethodData(MethodData.Access.PUBLIC, 1887 MethodData.Context.STATIC); 1888 final ClassData withStatDef = new ClassData(pck, meth); 1889 final int I2 = builder.expected; 1890 final int I1 = builder.methodref; 1891 final int C2 = builder.addClass(withDef); 1892 final int C1 = builder.addClass(withStatDef); 1893 builder.hier.addInherit(C1, I1); 1894 builder.hier.addInherit(C1, C2); 1895 builder.hier.addInherit(C2, I2); 1896 builder.objectref = C1; 1897 builder.expected = C2; 1898 }, 1899 /* Case 11: Superclass overrides. 1900 * 1901 * I[](*) = mref 1902 * C2[I](res) = expected 1903 * C1[C2]() = oref 1904 */ 1905 (final SelectionResolutionTestCase.Builder builder) -> { 1906 final ClassData.Package pck = 1907 builder.classdata.get(builder.expected).packageId; 1908 final MethodData.Access acc = 1909 builder.classdata.get(builder.expected).methoddata.access; 1910 final ClassData withDef = 1911 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1912 final int I = builder.methodref; 1913 final int C2 = builder.addClass(withDef); 1914 final int C1 = builder.addClass(emptyClass(pck)); 1915 builder.hier.addInherit(C1, I); 1916 builder.hier.addInherit(C1, C2); 1917 builder.hier.addInherit(C2, I); 1918 builder.objectref = C1; 1919 }, 1920 /* Case 12: Superclass overrides, skipping static. 1921 * 1922 * I[](*) = mref 1923 * C2[I](res) = expected 1924 * C1[C2](stat) = oref 1925 */ 1926 (final SelectionResolutionTestCase.Builder builder) -> { 1927 final ClassData.Package pck = 1928 builder.classdata.get(builder.expected).packageId; 1929 final MethodData.Access acc = 1930 builder.classdata.get(builder.expected).methoddata.access; 1931 final ClassData withDef = 1932 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1933 final MethodData meth = 1934 new MethodData(MethodData.Access.PUBLIC, 1935 MethodData.Context.STATIC); 1936 final ClassData withStatDef = new ClassData(pck, meth); 1937 final int I = builder.methodref; 1938 final int C2 = builder.addClass(withDef); 1939 final int C1 = builder.addClass(withStatDef); 1940 builder.hier.addInherit(C1, I); 1941 builder.hier.addInherit(C1, C2); 1942 builder.hier.addInherit(C2, I); 1943 builder.objectref = C1; 1944 }, 1945 /* Case 13: Double diamond, with superclass, inherit through 1946 * superclass, expected at top. 1947 * 1948 * I3[](def) = old expected 1949 * C3[I3](), I2[*](*) = mref 1950 * C2[I2,C3](), I1[I2](res) = expected 1951 * C1[C2,I1]() = oref 1952 */ 1953 (final SelectionResolutionTestCase.Builder builder) -> { 1954 final ClassData.Package pck = 1955 builder.classdata.get(builder.expected).packageId; 1956 final ClassData oldexpected = 1957 builder.classdata.get(builder.expected); 1958 final MethodData.Access acc = 1959 builder.classdata.get(builder.expected).methoddata.access; 1960 final ClassData withDef = 1961 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1962 final int I3 = builder.expected; 1963 final int I2 = builder.methodref; 1964 final int I1 = builder.addInterface(withDef); 1965 final int C3 = builder.addClass(emptyClass(pck)); 1966 final int C2 = builder.addClass(emptyClass(pck)); 1967 final int C1 = builder.addClass(emptyClass(pck)); 1968 builder.hier.addInherit(C2, I2); 1969 builder.hier.addInherit(C2, C3); 1970 builder.hier.addInherit(C3, I3); 1971 builder.hier.addInherit(C1, C2); 1972 builder.hier.addInherit(I1, I2); 1973 builder.hier.addInherit(C1, I1); 1974 builder.objectref = C1; 1975 builder.expected = I1; 1976 }, 1977 /* Case 14: Double diamond, with superclass, inherit through 1978 * superclass, expected at top. 1979 * 1980 * I3[](def) = mref 1981 * C3[I3](), I2[*](*) = expected 1982 * C2[I2,C3](), I1[I2](priv) 1983 * C1[C2,I1]() = oref 1984 */ 1985 (final SelectionResolutionTestCase.Builder builder) -> { 1986 final ClassData.Package pck = 1987 builder.classdata.get(builder.expected).packageId; 1988 final ClassData oldexpected = 1989 builder.classdata.get(builder.expected); 1990 final MethodData.Access acc = 1991 builder.classdata.get(builder.expected).methoddata.access; 1992 final ClassData withDef = 1993 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1994 final MethodData meth = 1995 new MethodData(MethodData.Access.PRIVATE, 1996 MethodData.Context.INSTANCE); 1997 final ClassData withPrivDef = new ClassData(pck, meth); 1998 final int I3 = builder.methodref; 1999 final int I2 = builder.addInterface(withDef); 2000 final int I1 = builder.addInterface(withPrivDef); 2001 final int C3 = builder.addClass(emptyClass(pck)); 2002 final int C2 = builder.addClass(emptyClass(pck)); 2003 final int C1 = builder.addClass(emptyClass(pck)); 2004 builder.hier.addInherit(C2, I2); 2005 builder.hier.addInherit(C2, C3); 2006 builder.hier.addInherit(C3, I3); 2007 builder.hier.addInherit(C1, C2); 2008 builder.hier.addInherit(I2, I3); 2009 builder.hier.addInherit(I1, I2); 2010 builder.hier.addInherit(C1, I1); 2011 builder.objectref = C1; 2012 builder.expected = I2; 2013 }, 2014 /* Case 15: Double diamond, with superclass, inherit through 2015 * superclass, expected at top. 2016 * 2017 * I3[](def) = mref 2018 * C3[I3](), I2[*](*) = expected 2019 * C2[I2,C3](), I1[I2](stat) 2020 * C1[C2,I1]() = oref 2021 */ 2022 (final SelectionResolutionTestCase.Builder builder) -> { 2023 final ClassData.Package pck = 2024 builder.classdata.get(builder.expected).packageId; 2025 final ClassData oldexpected = 2026 builder.classdata.get(builder.expected); 2027 final MethodData.Access acc = 2028 builder.classdata.get(builder.expected).methoddata.access; 2029 final ClassData withDef = 2030 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 2031 final MethodData meth = 2032 new MethodData(MethodData.Access.PUBLIC, 2033 MethodData.Context.STATIC); 2034 final ClassData withStatDef = new ClassData(pck, meth); 2035 final int I3 = builder.methodref; 2036 final int I2 = builder.addInterface(withDef); 2037 final int I1 = builder.addInterface(withStatDef); 2038 final int C3 = builder.addClass(emptyClass(pck)); 2039 final int C2 = builder.addClass(emptyClass(pck)); 2040 final int C1 = builder.addClass(emptyClass(pck)); 2041 builder.hier.addInherit(C2, I2); 2042 builder.hier.addInherit(C2, C3); 2043 builder.hier.addInherit(C3, I3); 2044 builder.hier.addInherit(C1, C2); 2045 builder.hier.addInherit(I2, I3); 2046 builder.hier.addInherit(I1, I2); 2047 builder.hier.addInherit(C1, I1); 2048 builder.objectref = C1; 2049 builder.expected = I2; 2050 }); 2051 2052 /****************************** 2053 * Abstract Overrides * 2054 ******************************/ 2055 2056 public static final Template OverrideAbstractExpectedIface = 2057 Template.ResolutionOverride(EnumSet.of(Template.Kind.INTERFACE), 2058 EnumSet.of(MethodData.Access.PUBLIC), 2059 EnumSet.allOf(MethodData.Context.class), 2060 EnumSet.of(ClassData.Package.SAME)); 2061 2062 public static final Template OverrideAbstractExpectedClass = 2063 Template.ResolutionOverride(EnumSet.allOf(Template.Kind.class), 2064 EnumSet.of(MethodData.Access.PUBLIC), 2065 EnumSet.allOf(MethodData.Context.class), 2066 EnumSet.of(ClassData.Package.SAME)); 2067 2068 public static final Template SelectionOverrideAbstract = 2069 new Template("SelectionOverrideAbstract", 2070 (final SelectionResolutionTestCase.Builder builder) -> { 2071 final ClassData expected = 2072 builder.classdata.get(builder.expected); 2073 final MethodData olddef = 2074 expected.methoddata; 2075 if (MethodData.Context.ABSTRACT == olddef.context) { 2076 final ClassData.Package pck = expected.packageId; 2077 final MethodData.Access acc = olddef.access; 2078 final MethodData mdata = 2079 getMethodData(MethodData.Access.PUBLIC, 2080 MethodData.Context.INSTANCE); 2081 final ClassData withDef = new ClassData(pck, mdata); 2082 final int C2 = builder.objectref; 2083 final int C1 = builder.addClass(withDef); 2084 builder.hier.addInherit(C1, C2); 2085 builder.objectref = C1; 2086 builder.expected = C1; 2087 } 2088 }); 2089 2090 2091 /****************************** 2092 * Ignored Abstract Templates * 2093 ******************************/ 2094 2095 public static final Template IgnoredAbstract = 2096 new Template("IgnoredAbstract", 2097 (builder) -> {}, 2098 (final SelectionResolutionTestCase.Builder builder) -> { 2099 final ClassData methodref = 2100 builder.classdata.get(builder.methodref); 2101 final ClassData.Package pck = methodref.packageId; 2102 final MethodData mdata = 2103 getMethodData(MethodData.Access.PUBLIC, 2104 MethodData.Context.ABSTRACT); 2105 final ClassData withDef = new ClassData(pck, mdata); 2106 final int C2 = builder.addInterface(withDef); 2107 final int C1 = builder.methodref; 2108 builder.hier.addInherit(C1, C2); 2109 }); 2110 2111 /****************************** 2112 * Selection Templates * 2113 ******************************/ 2114 2115 2116 2117 public static final Template TrivialObjectref = 2118 new Template("TrivialObjectref", 2119 Collections.singleton((builder) -> { 2120 builder.objectref = builder.methodref; 2121 })); 2122 2123 public static final Template TrivialObjectrefNotEqualMethodref = 2124 new Template("TrivialObjectrefNotEqualMethodref", 2125 Collections.singleton( 2126 (final SelectionResolutionTestCase.Builder builder) -> { 2127 final ClassData oldexpected = 2128 builder.classdata.get(builder.expected); 2129 final ClassData.Package pck = oldexpected.packageId; 2130 final int C2 = builder.methodref; 2131 final int C1 = builder.addClass(emptyClass(pck)); 2132 builder.hier.addInherit(C1, C2); 2133 builder.objectref = C1; 2134 })); 2135 2136 public static final Template MethodrefSelectionResolvedIsClassNoOverride = 2137 new Template("MethodrefSelectionResolvedIsClassNoOverride", 2138 /* Trivial. 2139 * 2140 * C[](*) = mref = oref 2141 */ 2142 (builder) -> { 2143 builder.objectref = builder.methodref; 2144 }, 2145 /* Case 1: Inherit from super. 2146 * 2147 * C2[](*) = mref 2148 * C1[C2]() = oref 2149 */ 2150 (final SelectionResolutionTestCase.Builder builder) -> { 2151 final ClassData.Package pck = 2152 builder.classdata.get(builder.methodref).packageId; 2153 final int C2 = builder.methodref; 2154 final int C1 = builder.addClass(emptyClass(pck)); 2155 builder.hier.addInherit(C1, C2); 2156 builder.objectref = C1; 2157 }, 2158 /* Case 2: Objectref has private def. 2159 * 2160 * C2[](*) = mref 2161 * C1[C2](priv) = oref 2162 */ 2163 (final SelectionResolutionTestCase.Builder builder) -> { 2164 final ClassData.Package pck = 2165 builder.classdata.get(builder.methodref).packageId; 2166 final ClassData oldexpected = 2167 builder.classdata.get(builder.expected); 2168 final MethodData meth = 2169 new MethodData(MethodData.Access.PRIVATE, 2170 MethodData.Context.INSTANCE); 2171 final ClassData withDef = new ClassData(pck, meth); 2172 final int C2 = builder.methodref; 2173 final int C1 = builder.addClass(withDef); 2174 builder.hier.addInherit(C1, C2); 2175 builder.objectref = C1; 2176 }, 2177 /* Case 3: Objectref has static def. 2178 * 2179 * C2[](*) = mref 2180 * C1[C2](stat) = oref 2181 */ 2182 (final SelectionResolutionTestCase.Builder builder) -> { 2183 final ClassData.Package pck = 2184 builder.classdata.get(builder.methodref).packageId; 2185 final ClassData oldexpected = 2186 builder.classdata.get(builder.expected); 2187 final MethodData meth = 2188 new MethodData(MethodData.Access.PUBLIC, 2189 MethodData.Context.STATIC); 2190 final ClassData withDef = new ClassData(pck, meth); 2191 final int C2 = builder.methodref; 2192 final int C1 = builder.addClass(withDef); 2193 builder.hier.addInherit(C1, C2); 2194 builder.objectref = C1; 2195 }, 2196 /* Case 4: Skip inherit from interface. 2197 * 2198 * C2[](*) = mref, I[](def) 2199 * C1[C2,I]() = oref 2200 */ 2201 (final SelectionResolutionTestCase.Builder builder) -> { 2202 final ClassData oldexpected = 2203 builder.classdata.get(builder.expected); 2204 final ClassData.Package pck = oldexpected.packageId; 2205 final MethodData.Context ctx = 2206 builder.classdata.get(builder.expected).methoddata.context; 2207 final MethodData.Access acc = 2208 builder.classdata.get(builder.expected).methoddata.access; 2209 final MethodData mdata = getMethodData(acc, ctx); 2210 final ClassData withDef = new ClassData(pck, mdata); 2211 final int C2 = builder.methodref; 2212 final int C1 = builder.addClass(emptyClass(pck)); 2213 final int I = builder.addInterface(withDef); 2214 builder.hier.addInherit(C1, C2); 2215 builder.hier.addInherit(C1, I); 2216 builder.objectref = C1; 2217 }, 2218 /* Case 5: Objectref's super has a private def. 2219 * 2220 * C3[*](*) = mref 2221 * C2[C3](res) = expected 2222 * C1[C2]() = oref 2223 */ 2224 (final SelectionResolutionTestCase.Builder builder) -> { 2225 final ClassData.Package pck = 2226 builder.classdata.get(builder.methodref).packageId; 2227 final ClassData oldexpected = 2228 builder.classdata.get(builder.expected); 2229 final MethodData meth = 2230 new MethodData(MethodData.Access.PRIVATE, 2231 MethodData.Context.INSTANCE); 2232 final ClassData withDef = 2233 new ClassData(pck, meth); 2234 final int C3 = builder.methodref; 2235 final int C2 = builder.addClass(withDef); 2236 final int C1 = builder.addClass(emptyClass(pck)); 2237 builder.hier.addInherit(C2, C3); 2238 builder.hier.addInherit(C1, C2); 2239 builder.objectref = C1; 2240 }, 2241 /* Case 6: Objectref's super has a static def. 2242 * 2243 * C3[*](*) = mref 2244 * C2[C3](res) = expected 2245 * C1[C2]() = oref 2246 */ 2247 (final SelectionResolutionTestCase.Builder builder) -> { 2248 final ClassData.Package pck = 2249 builder.classdata.get(builder.methodref).packageId; 2250 final ClassData oldexpected = 2251 builder.classdata.get(builder.expected); 2252 final MethodData meth = 2253 new MethodData(MethodData.Access.PUBLIC, 2254 MethodData.Context.STATIC); 2255 final ClassData withDef = 2256 new ClassData(pck, meth); 2257 final int C3 = builder.methodref; 2258 final int C2 = builder.addClass(withDef); 2259 final int C1 = builder.addClass(emptyClass(pck)); 2260 builder.hier.addInherit(C2, C3); 2261 builder.hier.addInherit(C1, C2); 2262 builder.objectref = C1; 2263 }); 2264 2265 public static final Template MethodrefSelectionResolvedIsClassOverride = 2266 new Template("MethodrefSelectionResolvedIsClassOverride", 2267 /* Case 7: Objectref overrides. 2268 * 2269 * C2[](*) = mref 2270 * C1[C2](res) = oref = expected 2271 */ 2272 (final SelectionResolutionTestCase.Builder builder) -> { 2273 final ClassData.Package pck = 2274 builder.classdata.get(builder.methodref).packageId; 2275 final ClassData oldexpected = 2276 builder.classdata.get(builder.expected); 2277 final ClassData withDef = 2278 new ClassData(pck, oldexpected.methoddata); 2279 final int C2 = builder.methodref; 2280 final int C1 = builder.addClass(withDef); 2281 builder.hier.addInherit(C1, C2); 2282 builder.objectref = C1; 2283 builder.expected = C1; 2284 }, 2285 /* Case 8: Objectref's super overrides. 2286 * 2287 * C3[*](*) = mref 2288 * C2[C3](res) 2289 * C1[C2]() = oref 2290 */ 2291 (final SelectionResolutionTestCase.Builder builder) -> { 2292 final ClassData.Package pck = 2293 builder.classdata.get(builder.methodref).packageId; 2294 final ClassData oldexpected = 2295 builder.classdata.get(builder.expected); 2296 final ClassData withDef = 2297 new ClassData(pck, oldexpected.methoddata); 2298 final int C3 = builder.methodref; 2299 final int C2 = builder.addClass(withDef); 2300 final int C1 = builder.addClass(emptyClass(pck)); 2301 builder.hier.addInherit(C2, C3); 2302 builder.hier.addInherit(C1, C2); 2303 builder.objectref = C1; 2304 builder.expected = C2; 2305 }, 2306 /* Case 9: Objectref's super overrides, 2307 * objectref has a private def. 2308 * 2309 * C3[*](*) = mref 2310 * C2[C3](res) 2311 * C1[C2](priv) = oref 2312 */ 2313 (final SelectionResolutionTestCase.Builder builder) -> { 2314 final ClassData.Package pck = 2315 builder.classdata.get(builder.methodref).packageId; 2316 final ClassData oldexpected = 2317 builder.classdata.get(builder.expected); 2318 final ClassData withDef = 2319 new ClassData(pck, oldexpected.methoddata); 2320 final MethodData meth = 2321 new MethodData(MethodData.Access.PRIVATE, 2322 MethodData.Context.INSTANCE); 2323 final ClassData withPrivDef = 2324 new ClassData(pck, meth); 2325 final int C3 = builder.methodref; 2326 final int C2 = builder.addClass(withDef); 2327 final int C1 = builder.addClass(withPrivDef); 2328 builder.hier.addInherit(C2, C3); 2329 builder.hier.addInherit(C1, C2); 2330 builder.objectref = C1; 2331 builder.expected = C2; 2332 }, 2333 /* Case 10: Objectref's super overrides, 2334 * objectref has a static def. 2335 * 2336 * C3[*](*) = mref 2337 * C2[C3](res) 2338 * C1[C2](stat) = oref 2339 */ 2340 (final SelectionResolutionTestCase.Builder builder) -> { 2341 final ClassData.Package pck = 2342 builder.classdata.get(builder.methodref).packageId; 2343 final ClassData oldexpected = 2344 builder.classdata.get(builder.expected); 2345 final ClassData withDef = 2346 new ClassData(pck, oldexpected.methoddata); 2347 final MethodData meth = 2348 new MethodData(MethodData.Access.PUBLIC, 2349 MethodData.Context.STATIC); 2350 final ClassData withPrivDef = 2351 new ClassData(pck, meth); 2352 final int C3 = builder.methodref; 2353 final int C2 = builder.addClass(withDef); 2354 final int C1 = builder.addClass(withPrivDef); 2355 builder.hier.addInherit(C2, C3); 2356 builder.hier.addInherit(C1, C2); 2357 builder.objectref = C1; 2358 builder.expected = C2; 2359 }); 2360 2361 public static final Template MethodrefSelectionResolvedIsClass = 2362 new Template("MethodrefSelectionResolvedIsClass", 2363 MethodrefSelectionResolvedIsClassNoOverride, 2364 MethodrefSelectionResolvedIsClassOverride); 2365 2366 public static final Template MethodrefSelectionPackageSkipNoOverride = 2367 new Template("MethodrefSelectionPackageSkipNoOverride", 2368 MethodrefSelectionResolvedIsClass, 2369 /* Case 11: Objectref has public def in other package. 2370 * 2371 * C2[](*) = mref 2372 * Other.C1[C2](pub) = oref 2373 */ 2374 (final SelectionResolutionTestCase.Builder builder) -> { 2375 final ClassData.Package pck = 2376 builder.classdata.get(builder.methodref).packageId; 2377 final ClassData oldexpected = 2378 builder.classdata.get(builder.expected); 2379 final MethodData meth = 2380 new MethodData(MethodData.Access.PUBLIC, 2381 MethodData.Context.INSTANCE); 2382 final ClassData withDef = 2383 new ClassData(ClassData.Package.OTHER, meth); 2384 final int C2 = builder.methodref; 2385 final int C1 = builder.addClass(withDef); 2386 builder.hier.addInherit(C1, C2); 2387 builder.objectref = C1; 2388 }, 2389 /* Case 12: Objectref has package private def in other package. 2390 * 2391 * C2[](*) = mref 2392 * Other.C1[C2](pack) = oref 2393 */ 2394 (final SelectionResolutionTestCase.Builder builder) -> { 2395 final ClassData.Package pck = 2396 builder.classdata.get(builder.methodref).packageId; 2397 final ClassData oldexpected = 2398 builder.classdata.get(builder.expected); 2399 final MethodData meth = 2400 new MethodData(MethodData.Access.PACKAGE, 2401 MethodData.Context.INSTANCE); 2402 final ClassData withDef = 2403 new ClassData(ClassData.Package.OTHER, meth); 2404 final int C2 = builder.methodref; 2405 final int C1 = builder.addClass(withDef); 2406 builder.hier.addInherit(C1, C2); 2407 builder.objectref = C1; 2408 }, 2409 /* Case 13: Objectref has protected def in other package. 2410 * 2411 * C2[](*) = mref 2412 * Other.C1[C2](prot) = oref 2413 */ 2414 (final SelectionResolutionTestCase.Builder builder) -> { 2415 final ClassData.Package pck = 2416 builder.classdata.get(builder.methodref).packageId; 2417 final ClassData oldexpected = 2418 builder.classdata.get(builder.expected); 2419 final MethodData meth = 2420 new MethodData(MethodData.Access.PROTECTED, 2421 MethodData.Context.INSTANCE); 2422 final ClassData withDef = 2423 new ClassData(ClassData.Package.OTHER, meth); 2424 final int C2 = builder.methodref; 2425 final int C1 = builder.addClass(withDef); 2426 builder.hier.addInherit(C1, C2); 2427 builder.objectref = C1; 2428 }, 2429 /* Case 14: Objectref's super has a public def in other package. 2430 * 2431 * C3[*](*) = mref 2432 * Other.C2[C3](pub) = expected 2433 * C1[C2]() = oref 2434 */ 2435 (final SelectionResolutionTestCase.Builder builder) -> { 2436 final ClassData.Package pck = 2437 builder.classdata.get(builder.methodref).packageId; 2438 final ClassData oldexpected = 2439 builder.classdata.get(builder.expected); 2440 final MethodData meth = 2441 new MethodData(MethodData.Access.PUBLIC, 2442 MethodData.Context.INSTANCE); 2443 final ClassData withDef = 2444 new ClassData(ClassData.Package.OTHER, meth); 2445 final int C3 = builder.methodref; 2446 final int C2 = builder.addClass(withDef); 2447 final int C1 = builder.addClass(emptyClass(pck)); 2448 builder.hier.addInherit(C2, C3); 2449 builder.hier.addInherit(C1, C2); 2450 builder.objectref = C1; 2451 }, 2452 /* Case 15: Objectref's super has a package 2453 * private def in other package. 2454 * 2455 * C3[*](*) = mref 2456 * Other.C2[C3](pack) = expected 2457 * C1[C2]() = oref 2458 */ 2459 (final SelectionResolutionTestCase.Builder builder) -> { 2460 final ClassData.Package pck = 2461 builder.classdata.get(builder.methodref).packageId; 2462 final ClassData oldexpected = 2463 builder.classdata.get(builder.expected); 2464 final MethodData meth = 2465 new MethodData(MethodData.Access.PACKAGE, 2466 MethodData.Context.INSTANCE); 2467 final ClassData withDef = 2468 new ClassData(ClassData.Package.OTHER, meth); 2469 final int C3 = builder.methodref; 2470 final int C2 = builder.addClass(withDef); 2471 final int C1 = builder.addClass(emptyClass(pck)); 2472 builder.hier.addInherit(C2, C3); 2473 builder.hier.addInherit(C1, C2); 2474 builder.objectref = C1; 2475 }, 2476 /* Case 16: Objectref's super has a protected def 2477 * in other package. 2478 * 2479 * C3[*](*) = mref 2480 * Other.C2[C3](pack) = expected 2481 * C1[C2]() = oref 2482 */ 2483 (final SelectionResolutionTestCase.Builder builder) -> { 2484 final ClassData.Package pck = 2485 builder.classdata.get(builder.methodref).packageId; 2486 final ClassData oldexpected = 2487 builder.classdata.get(builder.expected); 2488 final MethodData meth = 2489 new MethodData(MethodData.Access.PROTECTED, 2490 MethodData.Context.INSTANCE); 2491 final ClassData withDef = 2492 new ClassData(ClassData.Package.OTHER, meth); 2493 final int C3 = builder.methodref; 2494 final int C2 = builder.addClass(withDef); 2495 final int C1 = builder.addClass(emptyClass(pck)); 2496 builder.hier.addInherit(C2, C3); 2497 builder.hier.addInherit(C1, C2); 2498 builder.objectref = C1; 2499 }, 2500 /* Case 18: Objectref's has a public def in other 2501 * package, skip private. 2502 * 2503 * C3[*](*) = mref 2504 * Other.C2[C3](priv) 2505 * C1[C2](pub) = oref, expected 2506 */ 2507 (final SelectionResolutionTestCase.Builder builder) -> { 2508 final ClassData.Package pck = 2509 builder.classdata.get(builder.methodref).packageId; 2510 final ClassData oldexpected = 2511 builder.classdata.get(builder.expected); 2512 final MethodData meth = 2513 new MethodData(MethodData.Access.PUBLIC, 2514 MethodData.Context.INSTANCE); 2515 final ClassData withDef = 2516 new ClassData(ClassData.Package.OTHER, meth); 2517 final MethodData privmeth = 2518 new MethodData(MethodData.Access.PRIVATE, 2519 MethodData.Context.INSTANCE); 2520 final ClassData withPrivDef = 2521 new ClassData(pck, privmeth); 2522 final int C3 = builder.methodref; 2523 final int C2 = builder.addClass(withPrivDef); 2524 final int C1 = builder.addClass(withDef); 2525 builder.hier.addInherit(C2, C3); 2526 builder.hier.addInherit(C1, C2); 2527 builder.objectref = C1; 2528 }, 2529 /* Case 19: Objectref's has a package private def in other 2530 * package, skip private. 2531 * 2532 * C3[*](*) = mref 2533 * Other.C2[C3](priv) 2534 * C1[C2](pack) = oref, expected 2535 */ 2536 (final SelectionResolutionTestCase.Builder builder) -> { 2537 final ClassData.Package pck = 2538 builder.classdata.get(builder.methodref).packageId; 2539 final ClassData oldexpected = 2540 builder.classdata.get(builder.expected); 2541 final MethodData meth = 2542 new MethodData(MethodData.Access.PACKAGE, 2543 MethodData.Context.INSTANCE); 2544 final ClassData withDef = 2545 new ClassData(ClassData.Package.OTHER, meth); 2546 final MethodData privmeth = 2547 new MethodData(MethodData.Access.PRIVATE, 2548 MethodData.Context.INSTANCE); 2549 final ClassData withPrivDef = 2550 new ClassData(pck, privmeth); 2551 final int C3 = builder.methodref; 2552 final int C2 = builder.addClass(withPrivDef); 2553 final int C1 = builder.addClass(withDef); 2554 builder.hier.addInherit(C2, C3); 2555 builder.hier.addInherit(C1, C2); 2556 builder.objectref = C1; 2557 }, 2558 /* Case 20: Objectref's has a protected def in other 2559 * package, skip private. 2560 * 2561 * C3[*](*) = mref 2562 * Other.C2[C3](priv) 2563 * C1[C2](pro) = oref, expected 2564 */ 2565 (final SelectionResolutionTestCase.Builder builder) -> { 2566 final ClassData.Package pck = 2567 builder.classdata.get(builder.methodref).packageId; 2568 final ClassData oldexpected = 2569 builder.classdata.get(builder.expected); 2570 final MethodData meth = 2571 new MethodData(MethodData.Access.PROTECTED, 2572 MethodData.Context.INSTANCE); 2573 final ClassData withDef = 2574 new ClassData(ClassData.Package.OTHER, meth); 2575 final MethodData privmeth = 2576 new MethodData(MethodData.Access.PRIVATE, 2577 MethodData.Context.INSTANCE); 2578 final ClassData withPrivDef = 2579 new ClassData(pck, privmeth); 2580 final int C3 = builder.methodref; 2581 final int C2 = builder.addClass(withPrivDef); 2582 final int C1 = builder.addClass(withDef); 2583 builder.hier.addInherit(C2, C3); 2584 builder.hier.addInherit(C1, C2); 2585 builder.objectref = C1; 2586 }, 2587 /* Case 21: Objectref's super has a public def in other 2588 * package, skip private. 2589 * 2590 * C3[*](*) = mref 2591 * Other.C2[C3](pub) = expected 2592 * C1[C2](priv) = oref 2593 */ 2594 (final SelectionResolutionTestCase.Builder builder) -> { 2595 final ClassData.Package pck = 2596 builder.classdata.get(builder.methodref).packageId; 2597 final ClassData oldexpected = 2598 builder.classdata.get(builder.expected); 2599 final MethodData meth = 2600 new MethodData(MethodData.Access.PUBLIC, 2601 MethodData.Context.INSTANCE); 2602 final ClassData withDef = 2603 new ClassData(ClassData.Package.OTHER, meth); 2604 final MethodData privmeth = 2605 new MethodData(MethodData.Access.PRIVATE, 2606 MethodData.Context.INSTANCE); 2607 final ClassData withPrivDef = 2608 new ClassData(pck, privmeth); 2609 final int C3 = builder.methodref; 2610 final int C2 = builder.addClass(withDef); 2611 final int C1 = builder.addClass(withPrivDef); 2612 builder.hier.addInherit(C2, C3); 2613 builder.hier.addInherit(C1, C2); 2614 builder.objectref = C1; 2615 }, 2616 /* Case 22: Objectref's superhas a package private 2617 * def in other package, skip private. 2618 * 2619 * C3[*](*) = mref 2620 * Other.C2[C3](pack) = expected 2621 * C1[C2](priv) = oref 2622 */ 2623 (final SelectionResolutionTestCase.Builder builder) -> { 2624 final ClassData.Package pck = 2625 builder.classdata.get(builder.methodref).packageId; 2626 final ClassData oldexpected = 2627 builder.classdata.get(builder.expected); 2628 final MethodData meth = 2629 new MethodData(MethodData.Access.PACKAGE, 2630 MethodData.Context.INSTANCE); 2631 final ClassData withDef = 2632 new ClassData(ClassData.Package.OTHER, meth); 2633 final MethodData privmeth = 2634 new MethodData(MethodData.Access.PRIVATE, 2635 MethodData.Context.INSTANCE); 2636 final ClassData withPrivDef = 2637 new ClassData(pck, privmeth); 2638 final int C3 = builder.methodref; 2639 final int C2 = builder.addClass(withDef); 2640 final int C1 = builder.addClass(withPrivDef); 2641 builder.hier.addInherit(C2, C3); 2642 builder.hier.addInherit(C1, C2); 2643 builder.objectref = C1; 2644 }, 2645 /* Case 23: Objectref's super has a protected def 2646 * in other package, skip private. 2647 * 2648 * C3[*](*) = mref 2649 * Other.C2[C3](pro) = expected 2650 * C1[C2](priv) = oref 2651 */ 2652 (final SelectionResolutionTestCase.Builder builder) -> { 2653 final ClassData.Package pck = 2654 builder.classdata.get(builder.methodref).packageId; 2655 final ClassData oldexpected = 2656 builder.classdata.get(builder.expected); 2657 final MethodData meth = 2658 new MethodData(MethodData.Access.PROTECTED, 2659 MethodData.Context.INSTANCE); 2660 final ClassData withDef = 2661 new ClassData(ClassData.Package.OTHER, meth); 2662 final MethodData privmeth = 2663 new MethodData(MethodData.Access.PRIVATE, 2664 MethodData.Context.INSTANCE); 2665 final ClassData withPrivDef = 2666 new ClassData(pck, privmeth); 2667 final int C3 = builder.methodref; 2668 final int C2 = builder.addClass(withPrivDef); 2669 final int C1 = builder.addClass(withDef); 2670 builder.hier.addInherit(C2, C3); 2671 builder.hier.addInherit(C1, C2); 2672 builder.objectref = C1; 2673 }); 2674 2675 public static final Template MethodrefSelectionPackageSkip = 2676 new Template("MethodrefSelectionPackageSkip", 2677 MethodrefSelectionPackageSkipNoOverride, 2678 /* Case 17: Transitive override. 2679 * 2680 * C3[*](*) = mref 2681 * C2[C3](pub) 2682 * Other.C1[C2](pack) = oref, expected 2683 */ 2684 (final SelectionResolutionTestCase.Builder builder) -> { 2685 final ClassData.Package pck = 2686 builder.classdata.get(builder.expected).packageId; 2687 final ClassData oldexpected = 2688 builder.classdata.get(builder.expected); 2689 final MethodData meth = 2690 new MethodData(MethodData.Access.PUBLIC, 2691 MethodData.Context.INSTANCE); 2692 final MethodData packmeth = 2693 new MethodData(MethodData.Access.PACKAGE, 2694 MethodData.Context.INSTANCE); 2695 final ClassData withPubDef = new ClassData(pck, meth); 2696 final ClassData withPackDef = 2697 new ClassData(ClassData.Package.OTHER, packmeth); 2698 final int C3 = builder.methodref; 2699 final int C2 = builder.addClass(withPubDef); 2700 final int C1 = builder.addClass(withPackDef); 2701 builder.hier.addInherit(C2, C3); 2702 builder.hier.addInherit(C1, C2); 2703 builder.objectref = C1; 2704 builder.expected = C1; 2705 }, 2706 /* Case 24: Transitive override, skip private in between. 2707 * 2708 * C4[*](*) = mref 2709 * C3[C4](pub) 2710 * C2[C3](priv) 2711 * Other.C1[C2](pack) = oref, expected 2712 */ 2713 (final SelectionResolutionTestCase.Builder builder) -> { 2714 final ClassData.Package pck = 2715 builder.classdata.get(builder.expected).packageId; 2716 final ClassData oldexpected = 2717 builder.classdata.get(builder.expected); 2718 final MethodData meth = 2719 new MethodData(MethodData.Access.PUBLIC, 2720 MethodData.Context.INSTANCE); 2721 final MethodData packmeth = 2722 new MethodData(MethodData.Access.PACKAGE, 2723 MethodData.Context.INSTANCE); 2724 final ClassData withPubDef = new ClassData(pck, meth); 2725 final ClassData withPackDef = 2726 new ClassData(ClassData.Package.OTHER, packmeth); 2727 final MethodData privmeth = 2728 new MethodData(MethodData.Access.PRIVATE, 2729 MethodData.Context.INSTANCE); 2730 final ClassData withPrivDef = 2731 new ClassData(pck, privmeth); 2732 final int C4 = builder.methodref; 2733 final int C3 = builder.addClass(withPubDef); 2734 final int C2 = builder.addClass(withPrivDef); 2735 final int C1 = builder.addClass(withPackDef); 2736 builder.hier.addInherit(C3, C4); 2737 builder.hier.addInherit(C2, C3); 2738 builder.hier.addInherit(C1, C2); 2739 builder.objectref = C1; 2740 builder.expected = C1; 2741 }, 2742 /* Case 25: Transitive override, skip private in between. 2743 * 2744 * C4[*](*) = mref 2745 * C3[C4](pub) 2746 * Other.C2[C3](pack) = expected 2747 * C1[C2](pack) = oref 2748 */ 2749 (final SelectionResolutionTestCase.Builder builder) -> { 2750 final ClassData.Package pck = 2751 builder.classdata.get(builder.expected).packageId; 2752 final ClassData oldexpected = 2753 builder.classdata.get(builder.expected); 2754 final MethodData meth = 2755 new MethodData(MethodData.Access.PUBLIC, 2756 MethodData.Context.INSTANCE); 2757 final MethodData packmeth = 2758 new MethodData(MethodData.Access.PACKAGE, 2759 MethodData.Context.INSTANCE); 2760 final ClassData withPubDef = new ClassData(pck, meth); 2761 final ClassData withPackDef = 2762 new ClassData(ClassData.Package.OTHER, packmeth); 2763 final MethodData privmeth = 2764 new MethodData(MethodData.Access.PRIVATE, 2765 MethodData.Context.INSTANCE); 2766 final ClassData withPrivDef = 2767 new ClassData(pck, privmeth); 2768 final int C4 = builder.methodref; 2769 final int C3 = builder.addClass(withPubDef); 2770 final int C2 = builder.addClass(withPackDef); 2771 final int C1 = builder.addClass(withPrivDef); 2772 builder.hier.addInherit(C3, C4); 2773 builder.hier.addInherit(C2, C3); 2774 builder.hier.addInherit(C1, C2); 2775 builder.objectref = C2; 2776 builder.expected = C2; 2777 }); 2778 2779 public static final Template MethodrefSelectionResolvedIsIfaceNoOverride = 2780 new Template("MethodrefSelectionResolvedIsIfaceNoOverride", 2781 /* Trivial objectref. 2782 * 2783 * C[](*) = mref = oref 2784 */ 2785 (builder) -> { 2786 builder.objectref = builder.methodref; 2787 }, 2788 /* Case 1: Inherit from super. 2789 * 2790 * C2[](*) = mref 2791 * C1[C2]() = oref 2792 */ 2793 (final SelectionResolutionTestCase.Builder builder) -> { 2794 final ClassData.Package pck = 2795 builder.classdata.get(builder.methodref).packageId; 2796 final int C2 = builder.methodref; 2797 final int C1 = builder.addClass(emptyClass(pck)); 2798 builder.hier.addInherit(C1, C2); 2799 builder.objectref = C1; 2800 }, 2801 /* Case 2: Objectref has private def. 2802 * 2803 * C2[](*) = mref 2804 * C1[C2](priv) = oref 2805 */ 2806 (final SelectionResolutionTestCase.Builder builder) -> { 2807 final ClassData.Package pck = 2808 builder.classdata.get(builder.methodref).packageId; 2809 final ClassData oldexpected = 2810 builder.classdata.get(builder.expected); 2811 final MethodData meth = 2812 new MethodData(MethodData.Access.PRIVATE, 2813 MethodData.Context.INSTANCE); 2814 final ClassData withDef = new ClassData(pck, meth); 2815 final int C2 = builder.methodref; 2816 final int C1 = builder.addClass(withDef); 2817 builder.hier.addInherit(C1, C2); 2818 builder.objectref = C1; 2819 }, 2820 /* Case 3: Objectref has static def. 2821 * 2822 * C2[](*) = mref 2823 * C1[C2](stat) = oref 2824 */ 2825 (final SelectionResolutionTestCase.Builder builder) -> { 2826 final ClassData.Package pck = 2827 builder.classdata.get(builder.methodref).packageId; 2828 final ClassData oldexpected = 2829 builder.classdata.get(builder.expected); 2830 final MethodData meth = 2831 new MethodData(MethodData.Access.PUBLIC, 2832 MethodData.Context.STATIC); 2833 final ClassData withDef = new ClassData(pck, meth); 2834 final int C2 = builder.methodref; 2835 final int C1 = builder.addClass(withDef); 2836 builder.hier.addInherit(C1, C2); 2837 builder.objectref = C1; 2838 }, 2839 /* Case 4: Overlapping. 2840 * 2841 * I[*](res) = expected 2842 * C2[*](*) = mref 2843 * C1[C2,I]() = oref 2844 */ 2845 (final SelectionResolutionTestCase.Builder builder) -> { 2846 final ClassData.Package pck = 2847 builder.classdata.get(builder.methodref).packageId; 2848 final int C2 = builder.methodref; 2849 final int I = builder.expected; 2850 final int C1 = builder.addClass(emptyClass(pck)); 2851 builder.hier.addInherit(C1, C2); 2852 builder.hier.addInherit(C1, I); 2853 builder.objectref = C1; 2854 }, 2855 /* Case 5: Overlapping with new interface. 2856 * 2857 * I2[*](res) = expected 2858 * C2[*](*) = mref, I1[I2]() 2859 * C1[C2,I2]() = oref 2860 */ 2861 (final SelectionResolutionTestCase.Builder builder) -> { 2862 final ClassData.Package pck = 2863 builder.classdata.get(builder.methodref).packageId; 2864 final int C2 = builder.methodref; 2865 final int I2 = builder.expected; 2866 final int I1 = builder.addInterface(emptyClass(pck)); 2867 final int C1 = builder.addClass(emptyClass(pck)); 2868 builder.hier.addInherit(C1, C2); 2869 builder.hier.addInherit(C1, I1); 2870 builder.hier.addInherit(I1, I2); 2871 builder.objectref = C1; 2872 }, 2873 /* Case 6: Overlapping with new interface with private def. 2874 * 2875 * I2[*](res) = expected 2876 * C2[*](*) = mref, I1[I2](priv) 2877 * C1[C2,I2]() = oref 2878 */ 2879 (final SelectionResolutionTestCase.Builder builder) -> { 2880 final ClassData.Package pck = 2881 builder.classdata.get(builder.methodref).packageId; 2882 final MethodData meth = 2883 new MethodData(MethodData.Access.PRIVATE, 2884 MethodData.Context.INSTANCE); 2885 final ClassData withPrivDef = 2886 new ClassData(pck, meth); 2887 final int C2 = builder.methodref; 2888 final int I2 = builder.expected; 2889 final int I1 = builder.addInterface(withPrivDef); 2890 final int C1 = builder.addClass(emptyClass(pck)); 2891 builder.hier.addInherit(C1, C2); 2892 builder.hier.addInherit(C1, I1); 2893 builder.hier.addInherit(I1, I2); 2894 builder.objectref = C1; 2895 }, 2896 /* Case 7: Overlapping with new interface with static def. 2897 * 2898 * I2[*](res) = expected 2899 * C2[*](*) = mref, I1[I2](stat) 2900 * C1[C2,I2]() = oref 2901 */ 2902 (final SelectionResolutionTestCase.Builder builder) -> { 2903 final ClassData.Package pck = 2904 builder.classdata.get(builder.methodref).packageId; 2905 final MethodData meth = 2906 new MethodData(MethodData.Access.PUBLIC, 2907 MethodData.Context.STATIC); 2908 final ClassData withStatDef = 2909 new ClassData(pck, meth); 2910 final int C2 = builder.methodref; 2911 final int I2 = builder.expected; 2912 final int I1 = builder.addInterface(withStatDef); 2913 final int C1 = builder.addClass(emptyClass(pck)); 2914 builder.hier.addInherit(C1, C2); 2915 builder.hier.addInherit(C1, I1); 2916 builder.hier.addInherit(I1, I2); 2917 builder.objectref = C1; 2918 }, 2919 /* Case 8: Objectref's super has a private def. 2920 * 2921 * C3[*](*) = mref 2922 * C2[C3](priv) 2923 * C1[C2]() = oref 2924 */ 2925 (final SelectionResolutionTestCase.Builder builder) -> { 2926 final ClassData.Package pck = 2927 builder.classdata.get(builder.methodref).packageId; 2928 final ClassData oldexpected = 2929 builder.classdata.get(builder.expected); 2930 final MethodData meth = 2931 new MethodData(MethodData.Access.PRIVATE, 2932 MethodData.Context.INSTANCE); 2933 final ClassData withDef = 2934 new ClassData(pck, meth); 2935 final int C3 = builder.methodref; 2936 final int C2 = builder.addClass(withDef); 2937 final int C1 = builder.addClass(emptyClass(pck)); 2938 builder.hier.addInherit(C2, C3); 2939 builder.hier.addInherit(C1, C2); 2940 builder.objectref = C1; 2941 }, 2942 /* Case 9: Objectref's super has a static def. 2943 * 2944 * C3[*](*) = mref 2945 * C2[C3](stat) 2946 * C1[C2]() = oref 2947 */ 2948 (final SelectionResolutionTestCase.Builder builder) -> { 2949 final ClassData.Package pck = 2950 builder.classdata.get(builder.methodref).packageId; 2951 final ClassData oldexpected = 2952 builder.classdata.get(builder.expected); 2953 final MethodData meth = 2954 new MethodData(MethodData.Access.PUBLIC, 2955 MethodData.Context.STATIC); 2956 final ClassData withDef = 2957 new ClassData(pck, meth); 2958 final int C3 = builder.methodref; 2959 final int C2 = builder.addClass(withDef); 2960 final int C1 = builder.addClass(emptyClass(pck)); 2961 builder.hier.addInherit(C2, C3); 2962 builder.hier.addInherit(C1, C2); 2963 builder.objectref = C1; 2964 }, 2965 /* Case 10: Overlap with objectref's super. 2966 * 2967 * I[*](res) = expected 2968 * C3[](*) = mref 2969 * C2[C3,I]() 2970 * C1[C2]() = oref 2971 */ 2972 (final SelectionResolutionTestCase.Builder builder) -> { 2973 final ClassData.Package pck = 2974 builder.classdata.get(builder.methodref).packageId; 2975 final int C3 = builder.methodref; 2976 final int C2 = builder.addClass(emptyClass(pck)); 2977 final int I = builder.expected; 2978 final int C1 = builder.addClass(emptyClass(pck)); 2979 builder.hier.addInherit(C2, C3); 2980 builder.hier.addInherit(C1, C2); 2981 builder.hier.addInherit(C2, I); 2982 builder.objectref = C1; 2983 }, 2984 /* Case 11: Overlap with objectref's super with new interface. 2985 * 2986 * I2[*](res) = expected 2987 * C3[](*) = mref, I1[I2]() 2988 * C2[C3,I1]() 2989 * C1[C2]() = oref 2990 */ 2991 (final SelectionResolutionTestCase.Builder builder) -> { 2992 final ClassData.Package pck = 2993 builder.classdata.get(builder.methodref).packageId; 2994 final int C3 = builder.methodref; 2995 final int C2 = builder.addClass(emptyClass(pck)); 2996 final int I2 = builder.expected; 2997 final int I1 = builder.addInterface(emptyClass(pck)); 2998 final int C1 = builder.addClass(emptyClass(pck)); 2999 builder.hier.addInherit(C2, C3); 3000 builder.hier.addInherit(C1, C2); 3001 builder.hier.addInherit(C2, I1); 3002 builder.hier.addInherit(I1, I2); 3003 builder.objectref = C1; 3004 }, 3005 /* Case 12: Overlap with objectref's super with new 3006 * interface with private def. 3007 * 3008 * I2[*](res) = expected 3009 * C3[](*) = mref, I1[I2](priv) 3010 * C2[C3,I1]() 3011 * C1[C2]() = oref 3012 */ 3013 (final SelectionResolutionTestCase.Builder builder) -> { 3014 final ClassData.Package pck = 3015 builder.classdata.get(builder.methodref).packageId; 3016 final MethodData meth = 3017 new MethodData(MethodData.Access.PRIVATE, 3018 MethodData.Context.INSTANCE); 3019 final ClassData withPrivDef = 3020 new ClassData(pck, meth); 3021 final int C3 = builder.methodref; 3022 final int C2 = builder.addClass(emptyClass(pck)); 3023 final int I2 = builder.expected; 3024 final int I1 = builder.addInterface(withPrivDef); 3025 final int C1 = builder.addClass(emptyClass(pck)); 3026 builder.hier.addInherit(C2, C3); 3027 builder.hier.addInherit(C1, C2); 3028 builder.hier.addInherit(C2, I1); 3029 builder.hier.addInherit(I1, I2); 3030 builder.objectref = C1; 3031 }, 3032 /* Case 13: Overlap with objectref's super with new 3033 * interface with static def. 3034 * 3035 * I2[*](res) = expected 3036 * C3[](*) = mref, I1[I2](stat) 3037 * C2[C3,I1]() 3038 * C1[C2]() = oref 3039 */ 3040 (final SelectionResolutionTestCase.Builder builder) -> { 3041 final ClassData.Package pck = 3042 builder.classdata.get(builder.methodref).packageId; 3043 final MethodData meth = 3044 new MethodData(MethodData.Access.PUBLIC, 3045 MethodData.Context.STATIC); 3046 final ClassData withStatDef = 3047 new ClassData(pck, meth); 3048 final int C3 = builder.methodref; 3049 final int C2 = builder.addClass(emptyClass(pck)); 3050 final int I2 = builder.expected; 3051 final int I1 = builder.addInterface(withStatDef); 3052 final int C1 = builder.addClass(emptyClass(pck)); 3053 builder.hier.addInherit(C2, C3); 3054 builder.hier.addInherit(C1, C2); 3055 builder.hier.addInherit(C2, I1); 3056 builder.hier.addInherit(I1, I2); 3057 builder.objectref = C1; 3058 }, 3059 /* Case 14: Overlap with objectref's super with new 3060 * interface double diamond. 3061 * 3062 * I3[*](res) = expected 3063 * C3[](*) = mref, I2[I3]() 3064 * C2[C3,I2](), I1[I2]() 3065 * C1[C2,I1]() = oref 3066 */ 3067 (final SelectionResolutionTestCase.Builder builder) -> { 3068 final ClassData.Package pck = 3069 builder.classdata.get(builder.methodref).packageId; 3070 final int C3 = builder.methodref; 3071 final int C2 = builder.addClass(emptyClass(pck)); 3072 final int I3 = builder.expected; 3073 final int I2 = builder.addInterface(emptyClass(pck)); 3074 final int I1 = builder.addInterface(emptyClass(pck)); 3075 final int C1 = builder.addClass(emptyClass(pck)); 3076 builder.hier.addInherit(C2, C3); 3077 builder.hier.addInherit(C1, C2); 3078 builder.hier.addInherit(C1, I1); 3079 builder.hier.addInherit(C2, I2); 3080 builder.hier.addInherit(I1, I2); 3081 builder.objectref = C1; 3082 }, 3083 /* Case 15: Overlapping with new interface with private def. 3084 * 3085 * C2[*](*) = mref, I1[](priv) 3086 * C1[C2,I2]() = oref 3087 */ 3088 (final SelectionResolutionTestCase.Builder builder) -> { 3089 final ClassData.Package pck = 3090 builder.classdata.get(builder.methodref).packageId; 3091 final MethodData meth = 3092 new MethodData(MethodData.Access.PRIVATE, 3093 MethodData.Context.INSTANCE); 3094 final ClassData withPrivDef = 3095 new ClassData(pck, meth); 3096 final int C2 = builder.methodref; 3097 final int I1 = builder.addInterface(withPrivDef); 3098 final int C1 = builder.addClass(emptyClass(pck)); 3099 builder.hier.addInherit(C1, C2); 3100 builder.hier.addInherit(C1, I1); 3101 builder.objectref = C1; 3102 }, 3103 /* Case 16: Overlapping with new interface with static def. 3104 * 3105 * C2[*](*) = mref, I1[](stat) 3106 * C1[C2,I2]() = oref 3107 */ 3108 (final SelectionResolutionTestCase.Builder builder) -> { 3109 final ClassData.Package pck = 3110 builder.classdata.get(builder.methodref).packageId; 3111 final MethodData meth = 3112 new MethodData(MethodData.Access.PUBLIC, 3113 MethodData.Context.STATIC); 3114 final ClassData withStatDef = 3115 new ClassData(pck, meth); 3116 final int C2 = builder.methodref; 3117 final int I1 = builder.addInterface(withStatDef); 3118 final int C1 = builder.addClass(emptyClass(pck)); 3119 builder.hier.addInherit(C1, C2); 3120 builder.hier.addInherit(C1, I1); 3121 builder.objectref = C1; 3122 }); 3123 3124 public static final Template MethodrefSelectionResolvedIsIface = 3125 new Template("MethodrefSelectionResolvedIsIface", 3126 MethodrefSelectionResolvedIsIfaceNoOverride, 3127 /* Case 17: Objectref overrides. 3128 * 3129 * C2[](*) = mref 3130 * C1[C2](res) = oref = expected 3131 */ 3132 (final SelectionResolutionTestCase.Builder builder) -> { 3133 final ClassData.Package pck = 3134 builder.classdata.get(builder.methodref).packageId; 3135 final ClassData oldexpected = 3136 builder.classdata.get(builder.expected); 3137 final ClassData withDef = 3138 new ClassData(pck, oldexpected.methoddata); 3139 final int C2 = builder.methodref; 3140 final int C1 = builder.addClass(withDef); 3141 builder.hier.addInherit(C1, C2); 3142 builder.objectref = C1; 3143 builder.expected = C1; 3144 }, 3145 /* Case 18: Overlapping with new interface overriding. 3146 * 3147 * I2[*](def) = old expected 3148 * C2[*](*) = mref, I1[I2](res) = expected 3149 * C1[C2,I2]() = oref 3150 */ 3151 (final SelectionResolutionTestCase.Builder builder) -> { 3152 final ClassData.Package pck = 3153 builder.classdata.get(builder.methodref).packageId; 3154 final ClassData oldexpected = 3155 builder.classdata.get(builder.expected); 3156 final ClassData withDef = 3157 new ClassData(pck, oldexpected.methoddata); 3158 final int C2 = builder.methodref; 3159 final int I2 = builder.expected; 3160 final int I1 = builder.addInterface(withDef); 3161 final int C1 = builder.addClass(emptyClass(pck)); 3162 builder.hier.addInherit(C1, C2); 3163 builder.hier.addInherit(C1, I1); 3164 builder.hier.addInherit(I1, I2); 3165 builder.objectref = C1; 3166 builder.expected = I1; 3167 }, 3168 /* Case 19: Objectref's super overrides. 3169 * 3170 * C3[](*) = mref 3171 * C2[C3](res) = expected 3172 * C1[C2]() = oref 3173 */ 3174 (final SelectionResolutionTestCase.Builder builder) -> { 3175 final ClassData.Package pck = 3176 builder.classdata.get(builder.methodref).packageId; 3177 final ClassData oldexpected = 3178 builder.classdata.get(builder.expected); 3179 final ClassData withDef = 3180 new ClassData(pck, oldexpected.methoddata); 3181 final int C3 = builder.methodref; 3182 final int C2 = builder.addClass(withDef); 3183 final int C1 = builder.addClass(emptyClass(pck)); 3184 builder.hier.addInherit(C2, C3); 3185 builder.hier.addInherit(C1, C2); 3186 builder.objectref = C1; 3187 builder.expected = C2; 3188 }, 3189 /* Case 20: Overlap with objectref's super with 3190 * new interface overriding. 3191 * 3192 * I2[*](def) = old expected 3193 * C3[](*) = mref, I1[I2](res) = expected 3194 * C2[C3,I1]() 3195 * C1[C2]() = oref 3196 */ 3197 (final SelectionResolutionTestCase.Builder builder) -> { 3198 final ClassData.Package pck = 3199 builder.classdata.get(builder.methodref).packageId; 3200 final ClassData oldexpected = 3201 builder.classdata.get(builder.expected); 3202 final ClassData withDef = 3203 new ClassData(pck, oldexpected.methoddata); 3204 final int C3 = builder.methodref; 3205 final int C2 = builder.addClass(emptyClass(pck)); 3206 final int I2 = builder.expected; 3207 final int I1 = builder.addInterface(withDef); 3208 final int C1 = builder.addClass(emptyClass(pck)); 3209 builder.hier.addInherit(C2, C3); 3210 builder.hier.addInherit(C1, C2); 3211 builder.hier.addInherit(C2, I1); 3212 builder.hier.addInherit(I1, I2); 3213 builder.objectref = C1; 3214 builder.expected = I1; 3215 }, 3216 /* Case 21: Overlap with objectref's super with new 3217 * interface double diamond, overriding. 3218 * 3219 * I3[*](def) = old expected 3220 * C3[](*) = mref, I2[I3](def) 3221 * C2[C3,I2](), I1[I2](res) = expected 3222 * C1[C2,I1]() = oref 3223 */ 3224 (final SelectionResolutionTestCase.Builder builder) -> { 3225 final ClassData.Package pck = 3226 builder.classdata.get(builder.methodref).packageId; 3227 final ClassData oldexpected = 3228 builder.classdata.get(builder.expected); 3229 final ClassData withDef = 3230 new ClassData(pck, oldexpected.methoddata); 3231 final int C3 = builder.methodref; 3232 final int C2 = builder.addClass(emptyClass(pck)); 3233 final int I3 = builder.expected; 3234 final int I2 = builder.addInterface(withDef); 3235 final int I1 = builder.addInterface(withDef); 3236 final int C1 = builder.addClass(emptyClass(pck)); 3237 builder.hier.addInherit(C2, C3); 3238 builder.hier.addInherit(C1, C2); 3239 builder.hier.addInherit(C1, I1); 3240 builder.hier.addInherit(C2, I2); 3241 builder.hier.addInherit(I1, I2); 3242 builder.hier.addInherit(I2, I3); 3243 builder.objectref = C1; 3244 builder.expected = I1; 3245 }, 3246 /* Case 22: Objectref's super overrides, skip private. 3247 * 3248 * C3[](*) = mref 3249 * C2[C3](res) = expected 3250 * C1[C2](priv) = oref 3251 */ 3252 (final SelectionResolutionTestCase.Builder builder) -> { 3253 final ClassData.Package pck = 3254 builder.classdata.get(builder.methodref).packageId; 3255 final ClassData oldexpected = 3256 builder.classdata.get(builder.expected); 3257 final MethodData meth = 3258 new MethodData(MethodData.Access.PRIVATE, 3259 MethodData.Context.INSTANCE); 3260 final ClassData withPrivDef = 3261 new ClassData(pck, meth); 3262 final ClassData withDef = 3263 new ClassData(pck, oldexpected.methoddata); 3264 final int C3 = builder.methodref; 3265 final int C2 = builder.addClass(withDef); 3266 final int C1 = builder.addClass(withPrivDef); 3267 builder.hier.addInherit(C2, C3); 3268 builder.hier.addInherit(C1, C2); 3269 builder.objectref = C1; 3270 builder.expected = C2; 3271 }, 3272 /* Case 23: Objectref's super overrides, skip static. 3273 * 3274 * C3[](*) = mref 3275 * C2[C3](res) = expected 3276 * C1[C2](stat) = oref 3277 */ 3278 (final SelectionResolutionTestCase.Builder builder) -> { 3279 final ClassData.Package pck = 3280 builder.classdata.get(builder.methodref).packageId; 3281 final ClassData oldexpected = 3282 builder.classdata.get(builder.expected); 3283 final MethodData meth = 3284 new MethodData(MethodData.Access.PUBLIC, 3285 MethodData.Context.STATIC); 3286 final ClassData withStatDef = 3287 new ClassData(pck, meth); 3288 final ClassData withDef = 3289 new ClassData(pck, oldexpected.methoddata); 3290 final int C3 = builder.methodref; 3291 final int C2 = builder.addClass(withDef); 3292 final int C1 = builder.addClass(withStatDef); 3293 builder.hier.addInherit(C2, C3); 3294 builder.hier.addInherit(C1, C2); 3295 builder.objectref = C1; 3296 builder.expected = C2; 3297 }, 3298 /* Case 24: Overlap with objectref's super with new 3299 * interface double diamond, overriding, skip private. 3300 * 3301 * I3[*](def) = old expected 3302 * C3[](*) = mref, I2[I3](res) = expected 3303 * C2[C3,I2](), I1[I2](priv) 3304 * C1[C2,I1]() = oref 3305 */ 3306 (final SelectionResolutionTestCase.Builder builder) -> { 3307 final ClassData.Package pck = 3308 builder.classdata.get(builder.methodref).packageId; 3309 final ClassData oldexpected = 3310 builder.classdata.get(builder.expected); 3311 final ClassData withDef = 3312 new ClassData(pck, oldexpected.methoddata); 3313 final MethodData meth = 3314 new MethodData(MethodData.Access.PRIVATE, 3315 MethodData.Context.INSTANCE); 3316 final ClassData withPrivDef = 3317 new ClassData(pck, meth); 3318 final int C3 = builder.methodref; 3319 final int C2 = builder.addClass(emptyClass(pck)); 3320 final int I3 = builder.expected; 3321 final int I2 = builder.addInterface(withDef); 3322 final int I1 = builder.addInterface(withPrivDef); 3323 final int C1 = builder.addClass(emptyClass(pck)); 3324 builder.hier.addInherit(C2, C3); 3325 builder.hier.addInherit(C1, C2); 3326 builder.hier.addInherit(C1, I1); 3327 builder.hier.addInherit(C2, I2); 3328 builder.hier.addInherit(I1, I2); 3329 builder.hier.addInherit(I2, I3); 3330 builder.objectref = C1; 3331 builder.expected = I2; 3332 }, 3333 /* Case 25: Overlap with objectref's super with new 3334 * interface double diamond, overriding, skip static. 3335 * 3336 * I3[*](def) = old expected 3337 * C3[](*) = mref, I2[I3](res) = expected 3338 * C2[C3,I2](), I1[I2](stat) 3339 * C1[C2,I1]() = oref 3340 */ 3341 (final SelectionResolutionTestCase.Builder builder) -> { 3342 final ClassData.Package pck = 3343 builder.classdata.get(builder.methodref).packageId; 3344 final ClassData oldexpected = 3345 builder.classdata.get(builder.expected); 3346 final ClassData withDef = 3347 new ClassData(pck, oldexpected.methoddata); 3348 final MethodData meth = 3349 new MethodData(MethodData.Access.PUBLIC, 3350 MethodData.Context.STATIC); 3351 final ClassData withStatDef = 3352 new ClassData(pck, meth); 3353 final int C3 = builder.methodref; 3354 final int C2 = builder.addClass(emptyClass(pck)); 3355 final int I3 = builder.expected; 3356 final int I2 = builder.addInterface(withDef); 3357 final int I1 = builder.addInterface(withStatDef); 3358 final int C1 = builder.addClass(emptyClass(pck)); 3359 builder.hier.addInherit(C2, C3); 3360 builder.hier.addInherit(C1, C2); 3361 builder.hier.addInherit(C1, I1); 3362 builder.hier.addInherit(C2, I2); 3363 builder.hier.addInherit(I1, I2); 3364 builder.hier.addInherit(I2, I3); 3365 builder.objectref = C1; 3366 builder.expected = I2; 3367 }, 3368 /* Case 26: Skip interface method after class overrides. 3369 * 3370 * C3[](*) = mref 3371 * C2[C3](res) = expected, I[](def) 3372 * C1[C2, I]() = oref 3373 */ 3374 (final SelectionResolutionTestCase.Builder builder) -> { 3375 final ClassData.Package pck = 3376 builder.classdata.get(builder.methodref).packageId; 3377 final ClassData oldexpected = 3378 builder.classdata.get(builder.expected); 3379 final ClassData withDef = 3380 new ClassData(pck, oldexpected.methoddata); 3381 final int C3 = builder.methodref; 3382 final int C2 = builder.addClass(withDef); 3383 final int C1 = builder.addClass(emptyClass(pck)); 3384 final int I = builder.addInterface(withDef); 3385 builder.hier.addInherit(C2, C3); 3386 builder.hier.addInherit(C1, C2); 3387 builder.hier.addInherit(C1, I); 3388 builder.objectref = C1; 3389 builder.expected = C2; 3390 }, 3391 /* Case 27: Skip interface method after class overrides. 3392 * 3393 * C3[](*) = mref, I[](def) 3394 * C2[C3,I](res) = expected 3395 * C1[C2]() = oref 3396 */ 3397 (final SelectionResolutionTestCase.Builder builder) -> { 3398 final ClassData.Package pck = 3399 builder.classdata.get(builder.methodref).packageId; 3400 final ClassData oldexpected = 3401 builder.classdata.get(builder.expected); 3402 final ClassData withDef = 3403 new ClassData(pck, oldexpected.methoddata); 3404 final int C3 = builder.methodref; 3405 final int C2 = builder.addClass(withDef); 3406 final int C1 = builder.addClass(emptyClass(pck)); 3407 final int I = builder.addInterface(withDef); 3408 builder.hier.addInherit(C2, C3); 3409 builder.hier.addInherit(C1, C2); 3410 builder.hier.addInherit(C2, I); 3411 builder.objectref = C1; 3412 builder.expected = C2; 3413 }, 3414 /* Case 28: Overlap with objectref's super with new 3415 * interface double diamond, overriding. 3416 * 3417 * I3[*](def) = old expected 3418 * C3[](*) = mref, I2[I3](def) 3419 * C2[C3,I2](res) = expected, I1[I2](def) = expected 3420 * C1[C2,I1]() = oref 3421 */ 3422 (final SelectionResolutionTestCase.Builder builder) -> { 3423 final ClassData.Package pck = 3424 builder.classdata.get(builder.methodref).packageId; 3425 final ClassData oldexpected = 3426 builder.classdata.get(builder.expected); 3427 final ClassData withDef = 3428 new ClassData(pck, oldexpected.methoddata); 3429 final int C3 = builder.methodref; 3430 final int C2 = builder.addClass(withDef); 3431 final int I3 = builder.expected; 3432 final int I2 = builder.addInterface(withDef); 3433 final int I1 = builder.addInterface(withDef); 3434 final int C1 = builder.addClass(emptyClass(pck)); 3435 builder.hier.addInherit(C2, C3); 3436 builder.hier.addInherit(C1, C2); 3437 builder.hier.addInherit(C1, I1); 3438 builder.hier.addInherit(C2, I2); 3439 builder.hier.addInherit(I1, I2); 3440 builder.hier.addInherit(I2, I3); 3441 builder.objectref = C1; 3442 builder.expected = C2; 3443 }); 3444 3445 public static final Template IfaceMethodrefSelectionNoOverride = 3446 new Template("IfaceMethodrefSelectionNoOverride", 3447 /* Case 1: Inherit from super. 3448 * 3449 * I[](*) = mref 3450 * C[I]() = oref 3451 */ 3452 (final SelectionResolutionTestCase.Builder builder) -> { 3453 final ClassData.Package pck = 3454 builder.classdata.get(builder.methodref).packageId; 3455 final int I = builder.methodref; 3456 final int C = builder.addClass(emptyClass(pck)); 3457 builder.hier.addInherit(C, I); 3458 builder.objectref = C; 3459 }, 3460 /* Case 2: Objectref has static def 3461 * 3462 * I[](*) = mref 3463 * C[I](stat) = oref 3464 */ 3465 (final SelectionResolutionTestCase.Builder builder) -> { 3466 final ClassData.Package pck = 3467 builder.classdata.get(builder.methodref).packageId; 3468 final MethodData meth = 3469 new MethodData(MethodData.Access.PUBLIC, 3470 MethodData.Context.STATIC); 3471 final ClassData withStatDef = 3472 new ClassData(pck, meth); 3473 final int I = builder.methodref; 3474 final int C = builder.addClass(withStatDef); 3475 builder.hier.addInherit(C, I); 3476 builder.objectref = C; 3477 }, 3478 /* Case 3: Diamond, methodref at top. 3479 * 3480 * I3[](*) = mref 3481 * I1[I3](), I2[I3]() 3482 * C[I1,I2]() = oref 3483 */ 3484 (final SelectionResolutionTestCase.Builder builder) -> { 3485 final ClassData.Package pck = 3486 builder.classdata.get(builder.expected).packageId; 3487 final int I3 = builder.methodref; 3488 final int I2 = builder.addInterface(emptyClass(pck)); 3489 final int I1 = builder.addInterface(emptyClass(pck)); 3490 final int C = builder.addClass(emptyClass(pck)); 3491 builder.hier.addInherit(C, I1); 3492 builder.hier.addInherit(C, I2); 3493 builder.hier.addInherit(I1, I3); 3494 builder.hier.addInherit(I2, I3); 3495 builder.objectref = C; 3496 }, 3497 /* Case 4: Diamond, methodref at top, skip private def 3498 * 3499 * I3[](*) = mref 3500 * I1[I3](), I2[I3](priv) 3501 * C[I1,I2]() = oref 3502 */ 3503 (final SelectionResolutionTestCase.Builder builder) -> { 3504 final ClassData.Package pck = 3505 builder.classdata.get(builder.expected).packageId; 3506 final MethodData meth = 3507 new MethodData(MethodData.Access.PRIVATE, 3508 MethodData.Context.INSTANCE); 3509 final ClassData withPrivDef = 3510 new ClassData(pck, meth); 3511 final int I3 = builder.methodref; 3512 final int I2 = builder.addInterface(withPrivDef); 3513 final int I1 = builder.addInterface(emptyClass(pck)); 3514 final int C = builder.addClass(emptyClass(pck)); 3515 builder.hier.addInherit(C, I1); 3516 builder.hier.addInherit(C, I2); 3517 builder.hier.addInherit(I1, I3); 3518 builder.hier.addInherit(I2, I3); 3519 builder.objectref = C; 3520 }, 3521 /* Case 5: Diamond, methodref at top, skip static def 3522 * 3523 * I3[](*) = mref 3524 * I1[I3](), I2[I3](stat) 3525 * C[I1,I2]() = oref 3526 */ 3527 (final SelectionResolutionTestCase.Builder builder) -> { 3528 final ClassData.Package pck = 3529 builder.classdata.get(builder.expected).packageId; 3530 final MethodData meth = 3531 new MethodData(MethodData.Access.PUBLIC, 3532 MethodData.Context.STATIC); 3533 final ClassData withStatDef = 3534 new ClassData(pck, meth); 3535 final int I3 = builder.methodref; 3536 final int I2 = builder.addInterface(withStatDef); 3537 final int I1 = builder.addInterface(emptyClass(pck)); 3538 final int C = builder.addClass(emptyClass(pck)); 3539 builder.hier.addInherit(C, I1); 3540 builder.hier.addInherit(C, I2); 3541 builder.hier.addInherit(I1, I3); 3542 builder.hier.addInherit(I2, I3); 3543 builder.objectref = C; 3544 }, 3545 /* Case 6: Diamond, overlap with resolution. 3546 * 3547 * I3[](res) = expected 3548 * I1[I3](), I2[](*) = mref 3549 * C[I1,I2]() = oref 3550 */ 3551 (final SelectionResolutionTestCase.Builder builder) -> { 3552 final ClassData.Package pck = 3553 builder.classdata.get(builder.expected).packageId; 3554 final int I3 = builder.expected; 3555 final int I2 = builder.methodref; 3556 final int I1 = builder.addInterface(emptyClass(pck)); 3557 final int C = builder.addClass(emptyClass(pck)); 3558 builder.hier.addInherit(C, I1); 3559 builder.hier.addInherit(C, I2); 3560 builder.hier.addInherit(I1, I3); 3561 builder.objectref = C; 3562 }, 3563 /* Case 7: Diamond, with superclass, expected at top. 3564 * 3565 * I2[](*) = mref 3566 * C2[I2](), I1[I2]() 3567 * C1[I1,C2]() = oref 3568 */ 3569 (final SelectionResolutionTestCase.Builder builder) -> { 3570 final ClassData.Package pck = 3571 builder.classdata.get(builder.expected).packageId; 3572 final int I2 = builder.methodref; 3573 final int I1 = builder.addInterface(emptyClass(pck)); 3574 final int C2 = builder.addClass(emptyClass(pck)); 3575 final int C1 = builder.addClass(emptyClass(pck)); 3576 builder.hier.addInherit(C1, I1); 3577 builder.hier.addInherit(C1, C2); 3578 builder.hier.addInherit(I1, I2); 3579 builder.hier.addInherit(C2, I2); 3580 builder.objectref = C1; 3581 }, 3582 /* Case 8: Diamond, with superclass, expected at top, 3583 * class has static def. 3584 * 3585 * I2[](*) = mref 3586 * C2[I2](stat), I1[I2]() 3587 * C1[I1,C2]() = oref 3588 */ 3589 (final SelectionResolutionTestCase.Builder builder) -> { 3590 final ClassData.Package pck = 3591 builder.classdata.get(builder.expected).packageId; 3592 final MethodData meth = 3593 new MethodData(MethodData.Access.PUBLIC, 3594 MethodData.Context.STATIC); 3595 final ClassData withStatDef = 3596 new ClassData(pck, meth); 3597 final int I2 = builder.methodref; 3598 final int I1 = builder.addInterface(emptyClass(pck)); 3599 final int C2 = builder.addClass(withStatDef); 3600 final int C1 = builder.addClass(emptyClass(pck)); 3601 builder.hier.addInherit(C1, I1); 3602 builder.hier.addInherit(C1, C2); 3603 builder.hier.addInherit(I1, I2); 3604 builder.hier.addInherit(C2, I2); 3605 builder.objectref = C1; 3606 }, 3607 /* Case 9: Diamond, with superclass, expected at top, 3608 * interface has private def 3609 * 3610 * I2[](*) = mref 3611 * C2[I2](), I1[I2](priv) 3612 * C1[I1,C2]() = oref 3613 */ 3614 (final SelectionResolutionTestCase.Builder builder) -> { 3615 final ClassData.Package pck = 3616 builder.classdata.get(builder.expected).packageId; 3617 final MethodData meth = 3618 new MethodData(MethodData.Access.PRIVATE, 3619 MethodData.Context.INSTANCE); 3620 final ClassData withPrivDef = 3621 new ClassData(pck, meth); 3622 final int I2 = builder.methodref; 3623 final int I1 = builder.addInterface(withPrivDef); 3624 final int C2 = builder.addClass(emptyClass(pck)); 3625 final int C1 = builder.addClass(emptyClass(pck)); 3626 builder.hier.addInherit(C1, I1); 3627 builder.hier.addInherit(C1, C2); 3628 builder.hier.addInherit(I1, I2); 3629 builder.hier.addInherit(C2, I2); 3630 builder.objectref = C1; 3631 }, 3632 /* Case 10: Diamond, with superclass, expected at top, 3633 * interface has static def 3634 * 3635 * I2[](*) = mref 3636 * C2[I2](), I1[I2](stat) 3637 * C1[I1,C2]() = oref 3638 */ 3639 (final SelectionResolutionTestCase.Builder builder) -> { 3640 final ClassData.Package pck = 3641 builder.classdata.get(builder.expected).packageId; 3642 final MethodData meth = 3643 new MethodData(MethodData.Access.PUBLIC, 3644 MethodData.Context.STATIC); 3645 final ClassData withPrivDef = 3646 new ClassData(pck, meth); 3647 final int I2 = builder.methodref; 3648 final int I1 = builder.addInterface(withPrivDef); 3649 final int C2 = builder.addClass(emptyClass(pck)); 3650 final int C1 = builder.addClass(emptyClass(pck)); 3651 builder.hier.addInherit(C1, I1); 3652 builder.hier.addInherit(C1, C2); 3653 builder.hier.addInherit(I1, I2); 3654 builder.hier.addInherit(C2, I2); 3655 builder.objectref = C1; 3656 }, 3657 /* Case 11: Y, with superclass, expected 3658 * at top. 3659 * 3660 * C2[](), I1[](*) = mref 3661 * C1[I1,C2]() = oref 3662 */ 3663 (final SelectionResolutionTestCase.Builder builder) -> { 3664 final ClassData.Package pck = 3665 builder.classdata.get(builder.expected).packageId; 3666 final int I1 = builder.methodref; 3667 final int C2 = builder.addClass(emptyClass(pck)); 3668 final int C1 = builder.addClass(emptyClass(pck)); 3669 builder.hier.addInherit(C1, I1); 3670 builder.hier.addInherit(C1, C2); 3671 builder.objectref = C1; 3672 }, 3673 /* Case 12: Y, with superclass, expected 3674 * at top, class has static def 3675 * 3676 * C2[](stat), I1[](*) = mref 3677 * C1[I1,C2]() = oref 3678 */ 3679 (final SelectionResolutionTestCase.Builder builder) -> { 3680 final ClassData.Package pck = 3681 builder.classdata.get(builder.expected).packageId; 3682 final MethodData meth = 3683 new MethodData(MethodData.Access.PUBLIC, 3684 MethodData.Context.STATIC); 3685 final ClassData withStatDef = 3686 new ClassData(pck, meth); 3687 final int I1 = builder.methodref; 3688 final int C2 = builder.addClass(emptyClass(pck)); 3689 final int C1 = builder.addClass(emptyClass(pck)); 3690 builder.hier.addInherit(C1, I1); 3691 builder.hier.addInherit(C1, C2); 3692 builder.objectref = C1; 3693 }, 3694 /* Case 13: Diamond, with superclass, overlapping, expected 3695 * at top. 3696 * 3697 * I2[](res) = expected 3698 * C2[I2](), I1[](*) = mref 3699 * C1[I1,C2]() = oref 3700 */ 3701 (final SelectionResolutionTestCase.Builder builder) -> { 3702 final ClassData.Package pck = 3703 builder.classdata.get(builder.expected).packageId; 3704 final int I2 = builder.expected; 3705 final int I1 = builder.methodref; 3706 final int C2 = builder.addClass(emptyClass(pck)); 3707 final int C1 = builder.addClass(emptyClass(pck)); 3708 builder.hier.addInherit(C1, I1); 3709 builder.hier.addInherit(C1, C2); 3710 builder.hier.addInherit(C2, I2); 3711 builder.objectref = C1; 3712 }, 3713 /* Case 14: Diamond, with superclass, overlapping, expected 3714 * at top, class has static def 3715 * 3716 * I2[](def) = expected 3717 * C2[I2](stat), I1[](*) = mref 3718 * C1[I1,C2]() = oref 3719 */ 3720 (final SelectionResolutionTestCase.Builder builder) -> { 3721 final ClassData.Package pck = 3722 builder.classdata.get(builder.expected).packageId; 3723 final MethodData meth = 3724 new MethodData(MethodData.Access.PUBLIC, 3725 MethodData.Context.STATIC); 3726 final ClassData withStatDef = 3727 new ClassData(pck, meth); 3728 final int I2 = builder.expected; 3729 final int I1 = builder.methodref; 3730 final int C2 = builder.addClass(withStatDef); 3731 final int C1 = builder.addClass(emptyClass(pck)); 3732 builder.hier.addInherit(C1, I1); 3733 builder.hier.addInherit(C1, C2); 3734 builder.hier.addInherit(C2, I2); 3735 builder.objectref = C1; 3736 }, 3737 /* Case 15: Inherit through superclass. 3738 * 3739 * I[](*) = mref 3740 * C2[I]() 3741 * C1[C2]() = oref 3742 */ 3743 (final SelectionResolutionTestCase.Builder builder) -> { 3744 final ClassData.Package pck = 3745 builder.classdata.get(builder.expected).packageId; 3746 final int I = builder.methodref; 3747 final int C2 = builder.addClass(emptyClass(pck)); 3748 final int C1 = builder.addClass(emptyClass(pck)); 3749 builder.hier.addInherit(C1, I); 3750 builder.hier.addInherit(C1, C2); 3751 builder.hier.addInherit(C2, I); 3752 builder.objectref = C1; 3753 }, 3754 /* Case 16: Superclass has static def. 3755 * 3756 * I[](*) = mref 3757 * C2[I](stat) = expected 3758 * C1[C2]() = oref 3759 */ 3760 (final SelectionResolutionTestCase.Builder builder) -> { 3761 final ClassData.Package pck = 3762 builder.classdata.get(builder.expected).packageId; 3763 final MethodData meth = 3764 new MethodData(MethodData.Access.PUBLIC, 3765 MethodData.Context.STATIC); 3766 final ClassData withStatDef = 3767 new ClassData(pck, meth); 3768 final int I = builder.methodref; 3769 final int C2 = builder.addClass(withStatDef); 3770 final int C1 = builder.addClass(emptyClass(pck)); 3771 builder.hier.addInherit(C1, I); 3772 builder.hier.addInherit(C1, C2); 3773 builder.hier.addInherit(C2, I); 3774 builder.objectref = C1; 3775 }, 3776 /* Case 17: Diamond, inherit through superclass, 3777 * methodref at top. 3778 * 3779 * I3[](*) = mref 3780 * I1[I3](), I2[I3]() 3781 * C2[I1,I2]() 3782 * C1[C2]() = oref 3783 */ 3784 (final SelectionResolutionTestCase.Builder builder) -> { 3785 final ClassData.Package pck = 3786 builder.classdata.get(builder.expected).packageId; 3787 final int I3 = builder.methodref; 3788 final int I2 = builder.addInterface(emptyClass(pck)); 3789 final int I1 = builder.addInterface(emptyClass(pck)); 3790 final int C2 = builder.addClass(emptyClass(pck)); 3791 final int C1 = builder.addClass(emptyClass(pck)); 3792 builder.hier.addInherit(C2, I1); 3793 builder.hier.addInherit(C2, I2); 3794 builder.hier.addInherit(I1, I3); 3795 builder.hier.addInherit(I2, I3); 3796 builder.hier.addInherit(C1, C2); 3797 builder.objectref = C1; 3798 }, 3799 /* Case 18: Diamond, with superclass, inherit through 3800 * superclass, methodref at top. 3801 * 3802 * I2[](*) = mref 3803 * C3[I2](), I1[I2]() 3804 * C2[I1,C3]() 3805 * C1[C2]() = oref 3806 */ 3807 (final SelectionResolutionTestCase.Builder builder) -> { 3808 final ClassData.Package pck = 3809 builder.classdata.get(builder.expected).packageId; 3810 final int I2 = builder.methodref; 3811 final int I1 = builder.addInterface(emptyClass(pck)); 3812 final int C3 = builder.addClass(emptyClass(pck)); 3813 final int C2 = builder.addClass(emptyClass(pck)); 3814 final int C1 = builder.addClass(emptyClass(pck)); 3815 builder.hier.addInherit(C2, I1); 3816 builder.hier.addInherit(C2, C3); 3817 builder.hier.addInherit(I1, I2); 3818 builder.hier.addInherit(C3, I2); 3819 builder.hier.addInherit(C1, C2); 3820 builder.objectref = C1; 3821 }, 3822 /* Case 19: Diamond, inherit through superclass, 3823 * expected at top, skip private. 3824 * 3825 * I3[](*) = mref 3826 * I1[I3](), I2[I3](priv) 3827 * C2[I1,I2]() 3828 * C1[C2]() = oref 3829 */ 3830 (final SelectionResolutionTestCase.Builder builder) -> { 3831 final ClassData.Package pck = 3832 builder.classdata.get(builder.expected).packageId; 3833 final MethodData meth = 3834 new MethodData(MethodData.Access.PRIVATE, 3835 MethodData.Context.INSTANCE); 3836 final ClassData withPrivDef = 3837 new ClassData(pck, meth); 3838 final int I3 = builder.methodref; 3839 final int I2 = builder.addInterface(withPrivDef); 3840 final int I1 = builder.addInterface(emptyClass(pck)); 3841 final int C2 = builder.addClass(emptyClass(pck)); 3842 final int C1 = builder.addClass(emptyClass(pck)); 3843 builder.hier.addInherit(C2, I1); 3844 builder.hier.addInherit(C2, I2); 3845 builder.hier.addInherit(I1, I3); 3846 builder.hier.addInherit(I2, I3); 3847 builder.hier.addInherit(C1, C2); 3848 builder.objectref = C1; 3849 }, 3850 /* Case 20: Diamond, inherit through superclass, 3851 * expected at top, skip static. 3852 * 3853 * I3[](*) = mref 3854 * I1[I3](), I2[I3](stat) 3855 * C2[I1,I2]() 3856 * C1[C2]() = oref 3857 */ 3858 (final SelectionResolutionTestCase.Builder builder) -> { 3859 final ClassData.Package pck = 3860 builder.classdata.get(builder.expected).packageId; 3861 final MethodData meth = 3862 new MethodData(MethodData.Access.PUBLIC, 3863 MethodData.Context.STATIC); 3864 final ClassData withStatDef = 3865 new ClassData(pck, meth); 3866 final int I3 = builder.methodref; 3867 final int I2 = builder.addInterface(withStatDef); 3868 final int I1 = builder.addInterface(emptyClass(pck)); 3869 final int C2 = builder.addClass(emptyClass(pck)); 3870 final int C1 = builder.addClass(emptyClass(pck)); 3871 builder.hier.addInherit(C2, I1); 3872 builder.hier.addInherit(C2, I2); 3873 builder.hier.addInherit(I1, I3); 3874 builder.hier.addInherit(I2, I3); 3875 builder.hier.addInherit(C1, C2); 3876 builder.objectref = C1; 3877 }, 3878 /* Case 21: Diamond, inherit through superclass, 3879 * overlapping, expected at top. 3880 * 3881 * I3[](res) = expected 3882 * I1[I3](), I2[*](*) = mref 3883 * C2[I1,I2]() 3884 * C1[C2]() = oref 3885 */ 3886 (final SelectionResolutionTestCase.Builder builder) -> { 3887 final ClassData.Package pck = 3888 builder.classdata.get(builder.expected).packageId; 3889 final int I3 = builder.expected; 3890 final int I2 = builder.methodref; 3891 final int I1 = builder.addInterface(emptyClass(pck)); 3892 final int C2 = builder.addClass(emptyClass(pck)); 3893 final int C1 = builder.addClass(emptyClass(pck)); 3894 builder.hier.addInherit(C2, I1); 3895 builder.hier.addInherit(C2, I2); 3896 builder.hier.addInherit(I1, I3); 3897 builder.hier.addInherit(C1, C2); 3898 builder.objectref = C1; 3899 }, 3900 /* Case 22: Y, with superclass, inherit through 3901 * superclass, expected at top. 3902 * 3903 * C3[](), I1[*](*) = mref 3904 * C2[I1,C3]() 3905 * C1[C2]() = oref 3906 */ 3907 (final SelectionResolutionTestCase.Builder builder) -> { 3908 final ClassData.Package pck = 3909 builder.classdata.get(builder.expected).packageId; 3910 final int I1 = builder.methodref; 3911 final int C3 = builder.addClass(emptyClass(pck)); 3912 final int C2 = builder.addClass(emptyClass(pck)); 3913 final int C1 = builder.addClass(emptyClass(pck)); 3914 builder.hier.addInherit(C2, I1); 3915 builder.hier.addInherit(C2, C3); 3916 builder.hier.addInherit(C1, C2); 3917 builder.objectref = C1; 3918 }, 3919 /* Case 23: Diamond, with superclass, inherit through 3920 * superclass, overlapping, expected at top. 3921 * 3922 * I2[](res) = expected 3923 * C3[I2](), I1[*](*) = mref 3924 * C2[I1,C3]() 3925 * C1[C2]() = oref 3926 */ 3927 (final SelectionResolutionTestCase.Builder builder) -> { 3928 final ClassData.Package pck = 3929 builder.classdata.get(builder.expected).packageId; 3930 final int I2 = builder.expected; 3931 final int I1 = builder.methodref; 3932 final int C3 = builder.addClass(emptyClass(pck)); 3933 final int C2 = builder.addClass(emptyClass(pck)); 3934 final int C1 = builder.addClass(emptyClass(pck)); 3935 builder.hier.addInherit(C2, I1); 3936 builder.hier.addInherit(C2, C3); 3937 builder.hier.addInherit(C3, I2); 3938 builder.hier.addInherit(C1, C2); 3939 builder.objectref = C1; 3940 }, 3941 /* Case 24: Double diamond, with superclass, inherit through 3942 * superclass, overlapping expected at top. 3943 * 3944 * I3[](res) = expected 3945 * C3[I3](), I2[*](*) = mref 3946 * C2[I2,C3](), I1[I2]() 3947 * C1[C2,I1]() = oref 3948 */ 3949 (final SelectionResolutionTestCase.Builder builder) -> { 3950 final ClassData.Package pck = 3951 builder.classdata.get(builder.expected).packageId; 3952 final int I3 = builder.expected; 3953 final int I2 = builder.methodref; 3954 final int I1 = builder.addInterface(emptyClass(pck)); 3955 final int C3 = builder.addClass(emptyClass(pck)); 3956 final int C2 = builder.addClass(emptyClass(pck)); 3957 final int C1 = builder.addClass(emptyClass(pck)); 3958 builder.hier.addInherit(C2, I2); 3959 builder.hier.addInherit(C2, C3); 3960 builder.hier.addInherit(C3, I3); 3961 builder.hier.addInherit(C1, C2); 3962 builder.hier.addInherit(I1, I2); 3963 builder.hier.addInherit(C1, I1); 3964 builder.objectref = C1; 3965 }, 3966 /* Case 25: Double diamond, with superclass, inherit through 3967 * superclass, skip private. 3968 * 3969 * I3[](def) = old expected 3970 * C3[I3](), I2[*](*) = mref 3971 * C2[I2,C3](), I1[I2](priv) 3972 * C1[C2,I1]() = oref 3973 */ 3974 (final SelectionResolutionTestCase.Builder builder) -> { 3975 final ClassData.Package pck = 3976 builder.classdata.get(builder.expected).packageId; 3977 final MethodData meth = 3978 new MethodData(MethodData.Access.PRIVATE, 3979 MethodData.Context.INSTANCE); 3980 final ClassData withPrivDef = 3981 new ClassData(pck, meth); 3982 final int I3 = builder.expected; 3983 final int I2 = builder.methodref; 3984 final int I1 = builder.addInterface(withPrivDef); 3985 final int C3 = builder.addClass(emptyClass(pck)); 3986 final int C2 = builder.addClass(emptyClass(pck)); 3987 final int C1 = builder.addClass(emptyClass(pck)); 3988 builder.hier.addInherit(C2, I2); 3989 builder.hier.addInherit(C2, C3); 3990 builder.hier.addInherit(C3, I3); 3991 builder.hier.addInherit(C1, C2); 3992 builder.hier.addInherit(I1, I2); 3993 builder.hier.addInherit(C1, I1); 3994 builder.objectref = C1; 3995 }, 3996 /* Case 26: Double diamond, with superclass, inherit through 3997 * superclass, skip static. 3998 * 3999 * I3[](def) = old expected 4000 * C3[I3](), I2[*](*) = mref 4001 * C2[I2,C3](), I1[I2](stat) 4002 * C1[C2,I1]() = oref 4003 */ 4004 (final SelectionResolutionTestCase.Builder builder) -> { 4005 final ClassData.Package pck = 4006 builder.classdata.get(builder.expected).packageId; 4007 final MethodData meth = 4008 new MethodData(MethodData.Access.PUBLIC, 4009 MethodData.Context.STATIC); 4010 final ClassData withStatDef = 4011 new ClassData(pck, meth); 4012 final int I3 = builder.expected; 4013 final int I2 = builder.methodref; 4014 final int I1 = builder.addInterface(withStatDef); 4015 final int C3 = builder.addClass(emptyClass(pck)); 4016 final int C2 = builder.addClass(emptyClass(pck)); 4017 final int C1 = builder.addClass(emptyClass(pck)); 4018 builder.hier.addInherit(C2, I2); 4019 builder.hier.addInherit(C2, C3); 4020 builder.hier.addInherit(C3, I3); 4021 builder.hier.addInherit(C1, C2); 4022 builder.hier.addInherit(I1, I2); 4023 builder.hier.addInherit(C1, I1); 4024 builder.objectref = C1; 4025 }); 4026 4027 public static final Template IfaceMethodrefSelection = 4028 new Template("IfaceMethodrefSelection", 4029 IfaceMethodrefSelectionNoOverride, 4030 /* Case 27: Objectref overrides. 4031 * 4032 * I[](*) = mref 4033 * C[I](res) = oref = expected 4034 */ 4035 (final SelectionResolutionTestCase.Builder builder) -> { 4036 final ClassData.Package pck = 4037 builder.classdata.get(builder.methodref).packageId; 4038 final ClassData oldexpected = 4039 builder.classdata.get(builder.expected); 4040 final ClassData withDef = 4041 new ClassData(pck, oldexpected.methoddata); 4042 final int I = builder.methodref; 4043 final int C = builder.addClass(withDef); 4044 builder.hier.addInherit(C, I); 4045 builder.objectref = C; 4046 builder.expected = C; 4047 }, 4048 /* Case 28: Diamond, methodref at top, overriding. 4049 * 4050 * I3[](*) = mref 4051 * I1[I3](), I2[I3](res) = expected 4052 * C[I1,I2]() = oref 4053 */ 4054 (final SelectionResolutionTestCase.Builder builder) -> { 4055 final ClassData.Package pck = 4056 builder.classdata.get(builder.expected).packageId; 4057 final ClassData oldexpected = 4058 builder.classdata.get(builder.expected); 4059 final ClassData withDef = 4060 new ClassData(pck, oldexpected.methoddata); 4061 final int I3 = builder.methodref; 4062 final int I2 = builder.addInterface(withDef); 4063 final int I1 = builder.addInterface(emptyClass(pck)); 4064 final int C = builder.addClass(emptyClass(pck)); 4065 builder.hier.addInherit(C, I1); 4066 builder.hier.addInherit(C, I2); 4067 builder.hier.addInherit(I1, I3); 4068 builder.hier.addInherit(I2, I3); 4069 builder.objectref = C; 4070 builder.expected = I2; 4071 }, 4072 /* Case 29: Diamond, with superclass, expected at top, 4073 * class overriding. 4074 * 4075 * I2[](*) = mref 4076 * C2[I2](res) = expected, I1[I2]() 4077 * C1[I1,C2]() = oref 4078 */ 4079 (final SelectionResolutionTestCase.Builder builder) -> { 4080 final ClassData.Package pck = 4081 builder.classdata.get(builder.expected).packageId; 4082 final ClassData oldexpected = 4083 builder.classdata.get(builder.expected); 4084 final ClassData withDef = 4085 new ClassData(pck, oldexpected.methoddata); 4086 final int I2 = builder.methodref; 4087 final int I1 = builder.addInterface(emptyClass(pck)); 4088 final int C2 = builder.addClass(withDef); 4089 final int C1 = builder.addClass(emptyClass(pck)); 4090 builder.hier.addInherit(C1, I1); 4091 builder.hier.addInherit(C1, C2); 4092 builder.hier.addInherit(I1, I2); 4093 builder.hier.addInherit(C2, I2); 4094 builder.objectref = C1; 4095 builder.expected = C2; 4096 }, 4097 /* Case 30: Diamond, with superclass, expected at top, 4098 * interface overriding 4099 * 4100 * I2[](*) = mref 4101 * C2[I2](), I1[I2](res) = expected 4102 * C1[I1,C2]() = oref 4103 */ 4104 (final SelectionResolutionTestCase.Builder builder) -> { 4105 final ClassData.Package pck = 4106 builder.classdata.get(builder.expected).packageId; 4107 final ClassData oldexpected = 4108 builder.classdata.get(builder.expected); 4109 final ClassData withDef = 4110 new ClassData(pck, oldexpected.methoddata); 4111 final int I2 = builder.methodref; 4112 final int I1 = builder.addInterface(withDef); 4113 final int C2 = builder.addClass(emptyClass(pck)); 4114 final int C1 = builder.addClass(emptyClass(pck)); 4115 builder.hier.addInherit(C1, I1); 4116 builder.hier.addInherit(C1, C2); 4117 builder.hier.addInherit(I1, I2); 4118 builder.hier.addInherit(C2, I2); 4119 builder.objectref = C1; 4120 builder.expected = I1; 4121 }, 4122 /* Case 31: Y, with superclass, overlaping, expected 4123 * at top, class overrides 4124 * 4125 * C2[](res) = expected, I1[](*) = mref 4126 * C1[I1,C2]() = oref 4127 */ 4128 (final SelectionResolutionTestCase.Builder builder) -> { 4129 final ClassData.Package pck = 4130 builder.classdata.get(builder.expected).packageId; 4131 final ClassData oldexpected = 4132 builder.classdata.get(builder.expected); 4133 final ClassData withDef = 4134 new ClassData(pck, oldexpected.methoddata); 4135 final int I1 = builder.methodref; 4136 final int C2 = builder.addClass(withDef); 4137 final int C1 = builder.addClass(emptyClass(pck)); 4138 builder.hier.addInherit(C1, I1); 4139 builder.hier.addInherit(C1, C2); 4140 builder.objectref = C1; 4141 builder.expected = C2; 4142 }, 4143 /* Case 32: Diamond, with superclass, overlaping, expected 4144 * at top, class overrides 4145 * 4146 * I2[](def) = old expected 4147 * C2[I2](res) = expected, I1[](*) = mref 4148 * C1[I1,C2]() = oref 4149 */ 4150 (final SelectionResolutionTestCase.Builder builder) -> { 4151 final ClassData.Package pck = 4152 builder.classdata.get(builder.expected).packageId; 4153 final ClassData oldexpected = 4154 builder.classdata.get(builder.expected); 4155 final ClassData withDef = 4156 new ClassData(pck, oldexpected.methoddata); 4157 final int I2 = builder.expected; 4158 final int I1 = builder.methodref; 4159 final int C2 = builder.addClass(withDef); 4160 final int C1 = builder.addClass(emptyClass(pck)); 4161 builder.hier.addInherit(C1, I1); 4162 builder.hier.addInherit(C1, C2); 4163 builder.hier.addInherit(C2, I2); 4164 builder.objectref = C1; 4165 builder.expected = C2; 4166 }, 4167 /* Case 33: Superclass overrides. 4168 * 4169 * I[](*) = mref 4170 * C2[I](res) = expected 4171 * C1[C2]() = oref 4172 */ 4173 (final SelectionResolutionTestCase.Builder builder) -> { 4174 final ClassData.Package pck = 4175 builder.classdata.get(builder.expected).packageId; 4176 final ClassData oldexpected = 4177 builder.classdata.get(builder.expected); 4178 final ClassData withDef = 4179 new ClassData(pck, oldexpected.methoddata); 4180 final int I = builder.methodref; 4181 final int C2 = builder.addClass(withDef); 4182 final int C1 = builder.addClass(emptyClass(pck)); 4183 builder.hier.addInherit(C1, I); 4184 builder.hier.addInherit(C1, C2); 4185 builder.hier.addInherit(C2, I); 4186 builder.expected = C2; 4187 builder.objectref = C1; 4188 }, 4189 /* Case 34: Diamond, inherit through superclass, 4190 * expected at top, override. 4191 * 4192 * I3[](*) = mref 4193 * I1[I3](), I2[I3](res) = expected 4194 * C2[I1,I2]() 4195 * C1[C2]() = oref 4196 */ 4197 (final SelectionResolutionTestCase.Builder builder) -> { 4198 final ClassData.Package pck = 4199 builder.classdata.get(builder.expected).packageId; 4200 final ClassData oldexpected = 4201 builder.classdata.get(builder.expected); 4202 final ClassData withDef = 4203 new ClassData(pck, oldexpected.methoddata); 4204 final int I3 = builder.methodref; 4205 final int I2 = builder.addInterface(withDef); 4206 final int I1 = builder.addInterface(emptyClass(pck)); 4207 final int C2 = builder.addClass(emptyClass(pck)); 4208 final int C1 = builder.addClass(emptyClass(pck)); 4209 builder.hier.addInherit(C2, I1); 4210 builder.hier.addInherit(C2, I2); 4211 builder.hier.addInherit(I1, I3); 4212 builder.hier.addInherit(I2, I3); 4213 builder.hier.addInherit(C1, C2); 4214 builder.objectref = C1; 4215 builder.expected = I2; 4216 }, 4217 /* Case 35: Y, with superclass, inherit through 4218 * superclass, overlapping, expected at top. 4219 * 4220 * C3[](res) = expected, I1[*](*) = mref 4221 * C2[I1,C3]() 4222 * C1[C2]() = oref 4223 */ 4224 (final SelectionResolutionTestCase.Builder builder) -> { 4225 final ClassData.Package pck = 4226 builder.classdata.get(builder.expected).packageId; 4227 final ClassData oldexpected = 4228 builder.classdata.get(builder.expected); 4229 final ClassData withDef = 4230 new ClassData(pck, oldexpected.methoddata); 4231 final int I1 = builder.methodref; 4232 final int C3 = builder.addClass(withDef); 4233 final int C2 = builder.addClass(emptyClass(pck)); 4234 final int C1 = builder.addClass(emptyClass(pck)); 4235 builder.hier.addInherit(C2, I1); 4236 builder.hier.addInherit(C2, C3); 4237 builder.hier.addInherit(C1, C2); 4238 builder.objectref = C1; 4239 builder.expected = C3; 4240 }, 4241 /* Case 36: Diamond, with superclass, inherit through 4242 * superclass, overlapping, expected at top. 4243 * 4244 * I2[](*) = oldexpected 4245 * C3[I2](res) = expected, I1[*](*) = mref 4246 * C2[I1,C3]() 4247 * C1[C2]() = oref 4248 */ 4249 (final SelectionResolutionTestCase.Builder builder) -> { 4250 final ClassData.Package pck = 4251 builder.classdata.get(builder.expected).packageId; 4252 final ClassData oldexpected = 4253 builder.classdata.get(builder.expected); 4254 final ClassData withDef = 4255 new ClassData(pck, oldexpected.methoddata); 4256 final int I2 = builder.expected; 4257 final int I1 = builder.methodref; 4258 final int C3 = builder.addClass(withDef); 4259 final int C2 = builder.addClass(emptyClass(pck)); 4260 final int C1 = builder.addClass(emptyClass(pck)); 4261 builder.hier.addInherit(C2, I1); 4262 builder.hier.addInherit(C2, C3); 4263 builder.hier.addInherit(C3, I2); 4264 builder.hier.addInherit(C1, C2); 4265 builder.objectref = C1; 4266 builder.expected = C3; 4267 }, 4268 /* Case 37: Double diamond, with superclass, inherit through 4269 * superclass, overriding. 4270 * 4271 * I3[](def) = old expected 4272 * C3[I3](), I2[*](*) = mref 4273 * C2[I2,C3](), I1[I2](res) = expected 4274 * C1[C2,I1]() = oref 4275 */ 4276 (final SelectionResolutionTestCase.Builder builder) -> { 4277 final ClassData.Package pck = 4278 builder.classdata.get(builder.expected).packageId; 4279 final ClassData oldexpected = 4280 builder.classdata.get(builder.expected); 4281 final ClassData withDef = 4282 new ClassData(pck, oldexpected.methoddata); 4283 final int I3 = builder.expected; 4284 final int I2 = builder.methodref; 4285 final int I1 = builder.addInterface(withDef); 4286 final int C3 = builder.addClass(emptyClass(pck)); 4287 final int C2 = builder.addClass(emptyClass(pck)); 4288 final int C1 = builder.addClass(emptyClass(pck)); 4289 builder.hier.addInherit(C2, I2); 4290 builder.hier.addInherit(C2, C3); 4291 builder.hier.addInherit(C3, I3); 4292 builder.hier.addInherit(C1, C2); 4293 builder.hier.addInherit(I1, I2); 4294 builder.hier.addInherit(C1, I1); 4295 builder.objectref = C1; 4296 builder.expected = I1; 4297 }, 4298 /* Case 38: Double diamond, with superclass, inherit through 4299 * superclass, skip private. 4300 * 4301 * I3[](def) = old expected 4302 * C3[I3](), I2[*](*) = mref 4303 * C2[I2,C3](), I1[I2](priv) 4304 * C1[C2,I1]() = oref 4305 */ 4306 (final SelectionResolutionTestCase.Builder builder) -> { 4307 final ClassData.Package pck = 4308 builder.classdata.get(builder.expected).packageId; 4309 final ClassData oldexpected = 4310 builder.classdata.get(builder.expected); 4311 final ClassData withDef = 4312 new ClassData(pck, oldexpected.methoddata); 4313 final MethodData meth = 4314 new MethodData(MethodData.Access.PRIVATE, 4315 MethodData.Context.INSTANCE); 4316 final ClassData withPrivDef = 4317 new ClassData(pck, meth); 4318 final int I3 = builder.expected; 4319 final int I2 = builder.methodref; 4320 final int I1 = builder.addInterface(withPrivDef); 4321 final int C3 = builder.addClass(emptyClass(pck)); 4322 final int C2 = builder.addClass(emptyClass(pck)); 4323 final int C1 = builder.addClass(emptyClass(pck)); 4324 builder.hier.addInherit(C2, I2); 4325 builder.hier.addInherit(C2, C3); 4326 builder.hier.addInherit(C3, I3); 4327 builder.hier.addInherit(C1, C2); 4328 builder.hier.addInherit(I1, I2); 4329 builder.hier.addInherit(C1, I1); 4330 builder.objectref = C1; 4331 }, 4332 /* Case 39: Double diamond, with superclass, inherit through 4333 * superclass, skip static. 4334 * 4335 * I3[](def) = old expected 4336 * C3[I3](), I2[*](*) = mref 4337 * C2[I2,C3](), I1[I2](stat) 4338 * C1[C2,I1]() = oref 4339 */ 4340 (final SelectionResolutionTestCase.Builder builder) -> { 4341 final ClassData.Package pck = 4342 builder.classdata.get(builder.expected).packageId; 4343 final ClassData oldexpected = 4344 builder.classdata.get(builder.expected); 4345 final ClassData withDef = 4346 new ClassData(pck, oldexpected.methoddata); 4347 final MethodData meth = 4348 new MethodData(MethodData.Access.PUBLIC, 4349 MethodData.Context.STATIC); 4350 final ClassData withStatDef = 4351 new ClassData(pck, meth); 4352 final int I3 = builder.expected; 4353 final int I2 = builder.methodref; 4354 final int I1 = builder.addInterface(withStatDef); 4355 final int C3 = builder.addClass(emptyClass(pck)); 4356 final int C2 = builder.addClass(emptyClass(pck)); 4357 final int C1 = builder.addClass(emptyClass(pck)); 4358 builder.hier.addInherit(C2, I2); 4359 builder.hier.addInherit(C2, C3); 4360 builder.hier.addInherit(C3, I3); 4361 builder.hier.addInherit(C1, C2); 4362 builder.hier.addInherit(I1, I2); 4363 builder.hier.addInherit(C1, I1); 4364 builder.objectref = C1; 4365 }, 4366 /* Case 40: Superclass overrides. 4367 * 4368 * I[](*) = mref 4369 * C3[I](res) = expected 4370 * C2[C3](stat) = expected 4371 * C1[C2]() = oref 4372 */ 4373 (final SelectionResolutionTestCase.Builder builder) -> { 4374 final ClassData.Package pck = 4375 builder.classdata.get(builder.expected).packageId; 4376 final ClassData oldexpected = 4377 builder.classdata.get(builder.expected); 4378 final ClassData withDef = 4379 new ClassData(pck, oldexpected.methoddata); 4380 final MethodData meth = 4381 new MethodData(MethodData.Access.PUBLIC, 4382 MethodData.Context.STATIC); 4383 final ClassData withStatDef = 4384 new ClassData(pck, meth); 4385 final int I = builder.methodref; 4386 final int C3 = builder.addClass(withDef); 4387 final int C2 = builder.addClass(withStatDef); 4388 final int C1 = builder.addClass(emptyClass(pck)); 4389 builder.hier.addInherit(C1, I); 4390 builder.hier.addInherit(C1, C2); 4391 builder.hier.addInherit(C2, C3); 4392 builder.hier.addInherit(C2, I); 4393 builder.expected = C3; 4394 builder.objectref = C1; 4395 }); 4396 4397 // NOTE: The selection changes in JVMS 11 mean that private class methods 4398 // are never selected to satisfy an interface method invocation, and so no 4399 // IllegalAccessError is subsequently thrown. Because of this all the 4400 // "private" cases below are commented out. At some point in the future 4401 // these should be factored out and moved to a test that expects success 4402 // but it is not that simple as the commented out cases result in 2600 4403 // testcases being excluded, but only ~150 failing cases were seen. Though 4404 // it is not clear from the test if a single failure can result in further 4405 // testcases being skipped. 4406 public static final Template IfaceMethodrefSelectionOverrideNonPublic = 4407 new Template("IfaceMethodrefSelection", 4408 /* Case 1: Objectref overrides. 4409 * 4410 * I[](*) = mref 4411 * C[I](priv) = oref = expected 4412 */ 4413 // (final SelectionResolutionTestCase.Builder builder) -> { 4414 // final ClassData.Package pck = 4415 // builder.classdata.get(builder.methodref).packageId; 4416 // final ClassData oldexpected = 4417 // builder.classdata.get(builder.expected); 4418 // final MethodData meth = 4419 // new MethodData(MethodData.Access.PRIVATE, 4420 // MethodData.Context.INSTANCE); 4421 // final ClassData withDef = 4422 // new ClassData(pck, meth); 4423 // final int I = builder.methodref; 4424 // final int C = builder.addClass(withDef); 4425 // builder.hier.addInherit(C, I); 4426 // builder.objectref = C; 4427 // builder.expected = C; 4428 // }, 4429 /* Case 2: Objectref overrides. 4430 * 4431 * I[](*) = mref 4432 * C[I](prot) = oref = expected 4433 */ 4434 (final SelectionResolutionTestCase.Builder builder) -> { 4435 final ClassData.Package pck = 4436 builder.classdata.get(builder.methodref).packageId; 4437 final ClassData oldexpected = 4438 builder.classdata.get(builder.expected); 4439 final MethodData meth = 4440 new MethodData(MethodData.Access.PROTECTED, 4441 MethodData.Context.INSTANCE); 4442 final ClassData withDef = 4443 new ClassData(pck, meth); 4444 final int I = builder.methodref; 4445 final int C = builder.addClass(withDef); 4446 builder.hier.addInherit(C, I); 4447 builder.objectref = C; 4448 builder.expected = C; 4449 }, 4450 /* Case 3: Objectref overrides package private. 4451 * 4452 * I[](*) = mref 4453 * C[I](pack) = oref = expected 4454 */ 4455 (final SelectionResolutionTestCase.Builder builder) -> { 4456 final ClassData.Package pck = 4457 builder.classdata.get(builder.methodref).packageId; 4458 final ClassData oldexpected = 4459 builder.classdata.get(builder.expected); 4460 final MethodData meth = 4461 new MethodData(MethodData.Access.PACKAGE, 4462 MethodData.Context.INSTANCE); 4463 final ClassData withDef = 4464 new ClassData(pck, meth); 4465 final int I = builder.methodref; 4466 final int C = builder.addClass(withDef); 4467 builder.hier.addInherit(C, I); 4468 builder.objectref = C; 4469 builder.expected = C; 4470 }, 4471 /* Case 4: Diamond, with superclass, expected at top, 4472 * class overriding with private. 4473 * 4474 * I2[](*) = mref 4475 * C2[I2](priv) = expected, I1[I2]() 4476 * C1[I1,C2]() = oref 4477 */ 4478 // (final SelectionResolutionTestCase.Builder builder) -> { 4479 // final ClassData.Package pck = 4480 // builder.classdata.get(builder.expected).packageId; 4481 // final ClassData oldexpected = 4482 // builder.classdata.get(builder.expected); 4483 // final MethodData meth = 4484 // new MethodData(MethodData.Access.PRIVATE, 4485 // MethodData.Context.INSTANCE); 4486 // final ClassData withDef = 4487 // new ClassData(pck, meth); 4488 // final int I2 = builder.methodref; 4489 // final int I1 = builder.addInterface(emptyClass(pck)); 4490 // final int C2 = builder.addClass(withDef); 4491 // final int C1 = builder.addClass(emptyClass(pck)); 4492 // builder.hier.addInherit(C1, I1); 4493 // builder.hier.addInherit(C1, C2); 4494 // builder.hier.addInherit(I1, I2); 4495 // builder.hier.addInherit(C2, I2); 4496 // builder.objectref = C1; 4497 // builder.expected = C2; 4498 // }, 4499 /* Case 5: Diamond, with superclass, expected at top, 4500 * class overriding with package private. 4501 * 4502 * I2[](*) = mref 4503 * C2[I2](pack) = expected, I1[I2]() 4504 * C1[I1,C2]() = oref 4505 */ 4506 (final SelectionResolutionTestCase.Builder builder) -> { 4507 final ClassData.Package pck = 4508 builder.classdata.get(builder.expected).packageId; 4509 final ClassData oldexpected = 4510 builder.classdata.get(builder.expected); 4511 final MethodData meth = 4512 new MethodData(MethodData.Access.PACKAGE, 4513 MethodData.Context.INSTANCE); 4514 final ClassData withDef = 4515 new ClassData(pck, meth); 4516 final int I2 = builder.methodref; 4517 final int I1 = builder.addInterface(emptyClass(pck)); 4518 final int C2 = builder.addClass(withDef); 4519 final int C1 = builder.addClass(emptyClass(pck)); 4520 builder.hier.addInherit(C1, I1); 4521 builder.hier.addInherit(C1, C2); 4522 builder.hier.addInherit(I1, I2); 4523 builder.hier.addInherit(C2, I2); 4524 builder.objectref = C1; 4525 builder.expected = C2; 4526 }, 4527 /* Case 6: Diamond, with superclass, expected at top, 4528 * class overriding with protected. 4529 * 4530 * I2[](*) = mref 4531 * C2[I2](prot) = expected, I1[I2]() 4532 * C1[I1,C2]() = oref 4533 */ 4534 (final SelectionResolutionTestCase.Builder builder) -> { 4535 final ClassData.Package pck = 4536 builder.classdata.get(builder.expected).packageId; 4537 final ClassData oldexpected = 4538 builder.classdata.get(builder.expected); 4539 final MethodData meth = 4540 new MethodData(MethodData.Access.PROTECTED, 4541 MethodData.Context.INSTANCE); 4542 final ClassData withDef = 4543 new ClassData(pck, meth); 4544 final int I2 = builder.methodref; 4545 final int I1 = builder.addInterface(emptyClass(pck)); 4546 final int C2 = builder.addClass(withDef); 4547 final int C1 = builder.addClass(emptyClass(pck)); 4548 builder.hier.addInherit(C1, I1); 4549 builder.hier.addInherit(C1, C2); 4550 builder.hier.addInherit(I1, I2); 4551 builder.hier.addInherit(C2, I2); 4552 builder.objectref = C1; 4553 builder.expected = C2; 4554 }, 4555 /* Case 7: Y, with superclass, overlaping, expected 4556 * at top, class overrides 4557 * 4558 * C2[](priv) = expected, I1[](*) = mref 4559 * C1[I1,C2]() = oref 4560 */ 4561 // (final SelectionResolutionTestCase.Builder builder) -> { 4562 // final ClassData.Package pck = 4563 // builder.classdata.get(builder.expected).packageId; 4564 // final ClassData oldexpected = 4565 // builder.classdata.get(builder.expected); 4566 // final MethodData meth = 4567 // new MethodData(MethodData.Access.PRIVATE, 4568 // MethodData.Context.INSTANCE); 4569 // final ClassData withDef = 4570 // new ClassData(pck, meth); 4571 // final int I1 = builder.methodref; 4572 // final int C2 = builder.addClass(withDef); 4573 // final int C1 = builder.addClass(emptyClass(pck)); 4574 // builder.hier.addInherit(C1, I1); 4575 // builder.hier.addInherit(C1, C2); 4576 // builder.objectref = C1; 4577 // builder.expected = C2; 4578 // }, 4579 /* Case 8: Y, with superclass, overlaping, expected 4580 * at top, class overrides 4581 * 4582 * C2[](prot) = expected, I1[](*) = mref 4583 * C1[I1,C2]() = oref 4584 */ 4585 (final SelectionResolutionTestCase.Builder builder) -> { 4586 final ClassData.Package pck = 4587 builder.classdata.get(builder.expected).packageId; 4588 final ClassData oldexpected = 4589 builder.classdata.get(builder.expected); 4590 final MethodData meth = 4591 new MethodData(MethodData.Access.PROTECTED, 4592 MethodData.Context.INSTANCE); 4593 final ClassData withDef = 4594 new ClassData(pck, meth); 4595 final int I1 = builder.methodref; 4596 final int C2 = builder.addClass(withDef); 4597 final int C1 = builder.addClass(emptyClass(pck)); 4598 builder.hier.addInherit(C1, I1); 4599 builder.hier.addInherit(C1, C2); 4600 builder.objectref = C1; 4601 builder.expected = C2; 4602 }, 4603 /* Case 9: Y, with superclass, overlaping, expected 4604 * at top, class overrides 4605 * 4606 * C2[](pack) = expected, I1[](*) = mref 4607 * C1[I1,C2]() = oref 4608 */ 4609 (final SelectionResolutionTestCase.Builder builder) -> { 4610 final ClassData.Package pck = 4611 builder.classdata.get(builder.expected).packageId; 4612 final ClassData oldexpected = 4613 builder.classdata.get(builder.expected); 4614 final MethodData meth = 4615 new MethodData(MethodData.Access.PACKAGE, 4616 MethodData.Context.INSTANCE); 4617 final ClassData withDef = 4618 new ClassData(pck, meth); 4619 final int I1 = builder.methodref; 4620 final int C2 = builder.addClass(withDef); 4621 final int C1 = builder.addClass(emptyClass(pck)); 4622 builder.hier.addInherit(C1, I1); 4623 builder.hier.addInherit(C1, C2); 4624 builder.objectref = C1; 4625 builder.expected = C2; 4626 }, 4627 /* Case 10: Diamond, with superclass, overlaping, expected 4628 * at top, class overrides 4629 * 4630 * I2[](def) = old expected 4631 * C2[I2](priv) = expected, I1[](*) = mref 4632 * C1[I1,C2]() = oref 4633 */ 4634 // (final SelectionResolutionTestCase.Builder builder) -> { 4635 // final ClassData.Package pck = 4636 // builder.classdata.get(builder.expected).packageId; 4637 // final ClassData oldexpected = 4638 // builder.classdata.get(builder.expected); 4639 // final MethodData meth = 4640 // new MethodData(MethodData.Access.PRIVATE, 4641 // MethodData.Context.INSTANCE); 4642 // final ClassData withDef = 4643 // new ClassData(pck, meth); 4644 // final int I2 = builder.expected; 4645 // final int I1 = builder.methodref; 4646 // final int C2 = builder.addClass(withDef); 4647 // final int C1 = builder.addClass(emptyClass(pck)); 4648 // builder.hier.addInherit(C1, I1); 4649 // builder.hier.addInherit(C1, C2); 4650 // builder.hier.addInherit(C2, I2); 4651 // builder.objectref = C1; 4652 // builder.expected = C2; 4653 // }, 4654 /* Case 11: Diamond, with superclass, overlaping, expected 4655 * at top, class overrides 4656 * 4657 * I2[](def) = old expected 4658 * C2[I2](pack) = expected, I1[](*) = mref 4659 * C1[I1,C2]() = oref 4660 */ 4661 (final SelectionResolutionTestCase.Builder builder) -> { 4662 final ClassData.Package pck = 4663 builder.classdata.get(builder.expected).packageId; 4664 final ClassData oldexpected = 4665 builder.classdata.get(builder.expected); 4666 final MethodData meth = 4667 new MethodData(MethodData.Access.PACKAGE, 4668 MethodData.Context.INSTANCE); 4669 final ClassData withDef = 4670 new ClassData(pck, meth); 4671 final int I2 = builder.expected; 4672 final int I1 = builder.methodref; 4673 final int C2 = builder.addClass(withDef); 4674 final int C1 = builder.addClass(emptyClass(pck)); 4675 builder.hier.addInherit(C1, I1); 4676 builder.hier.addInherit(C1, C2); 4677 builder.hier.addInherit(C2, I2); 4678 builder.objectref = C1; 4679 builder.expected = C2; 4680 }, 4681 /* Case 12: Diamond, with superclass, overlaping, expected 4682 * at top, class overrides 4683 * 4684 * I2[](def) = old expected 4685 * C2[I2](prot) = expected, I1[](*) = mref 4686 * C1[I1,C2]() = oref 4687 */ 4688 (final SelectionResolutionTestCase.Builder builder) -> { 4689 final ClassData.Package pck = 4690 builder.classdata.get(builder.expected).packageId; 4691 final ClassData oldexpected = 4692 builder.classdata.get(builder.expected); 4693 final MethodData meth = 4694 new MethodData(MethodData.Access.PROTECTED, 4695 MethodData.Context.INSTANCE); 4696 final ClassData withDef = 4697 new ClassData(pck, meth); 4698 final int I2 = builder.expected; 4699 final int I1 = builder.methodref; 4700 final int C2 = builder.addClass(withDef); 4701 final int C1 = builder.addClass(emptyClass(pck)); 4702 builder.hier.addInherit(C1, I1); 4703 builder.hier.addInherit(C1, C2); 4704 builder.hier.addInherit(C2, I2); 4705 builder.objectref = C1; 4706 builder.expected = C2; 4707 }, 4708 /* Case 13: Superclass overrides. 4709 * 4710 * I[](*) = mref 4711 * C2[I](priv) = expected 4712 * C1[C2]() = oref 4713 */ 4714 // (final SelectionResolutionTestCase.Builder builder) -> { 4715 // final ClassData.Package pck = 4716 // builder.classdata.get(builder.expected).packageId; 4717 // final ClassData oldexpected = 4718 // builder.classdata.get(builder.expected); 4719 // final MethodData meth = 4720 // new MethodData(MethodData.Access.PRIVATE, 4721 // MethodData.Context.INSTANCE); 4722 // final ClassData withDef = 4723 // new ClassData(pck, meth); 4724 // final int I = builder.methodref; 4725 // final int C2 = builder.addClass(withDef); 4726 // final int C1 = builder.addClass(emptyClass(pck)); 4727 // builder.hier.addInherit(C1, I); 4728 // builder.hier.addInherit(C1, C2); 4729 // builder.hier.addInherit(C2, I); 4730 // builder.expected = C2; 4731 // builder.objectref = C1; 4732 // }, 4733 /* Case 14: Superclass overrides. 4734 * 4735 * I[](*) = mref 4736 * C2[I](prot) = expected 4737 * C1[C2]() = oref 4738 */ 4739 (final SelectionResolutionTestCase.Builder builder) -> { 4740 final ClassData.Package pck = 4741 builder.classdata.get(builder.expected).packageId; 4742 final ClassData oldexpected = 4743 builder.classdata.get(builder.expected); 4744 final MethodData meth = 4745 new MethodData(MethodData.Access.PROTECTED, 4746 MethodData.Context.INSTANCE); 4747 final ClassData withDef = 4748 new ClassData(pck, meth); 4749 final int I = builder.methodref; 4750 final int C2 = builder.addClass(withDef); 4751 final int C1 = builder.addClass(emptyClass(pck)); 4752 builder.hier.addInherit(C1, I); 4753 builder.hier.addInherit(C1, C2); 4754 builder.hier.addInherit(C2, I); 4755 builder.expected = C2; 4756 builder.objectref = C1; 4757 }, 4758 /* Case 15: Superclass overrides. 4759 * 4760 * I[](*) = mref 4761 * C2[I](pack) = expected 4762 * C1[C2]() = oref 4763 */ 4764 (final SelectionResolutionTestCase.Builder builder) -> { 4765 final ClassData.Package pck = 4766 builder.classdata.get(builder.expected).packageId; 4767 final ClassData oldexpected = 4768 builder.classdata.get(builder.expected); 4769 final MethodData meth = 4770 new MethodData(MethodData.Access.PACKAGE, 4771 MethodData.Context.INSTANCE); 4772 final ClassData withDef = 4773 new ClassData(pck, meth); 4774 final int I = builder.methodref; 4775 final int C2 = builder.addClass(withDef); 4776 final int C1 = builder.addClass(emptyClass(pck)); 4777 builder.hier.addInherit(C1, I); 4778 builder.hier.addInherit(C1, C2); 4779 builder.hier.addInherit(C2, I); 4780 builder.expected = C2; 4781 builder.objectref = C1; 4782 }); 4783 4784 /*********************** 4785 * Ambiguous selection * 4786 ***********************/ 4787 4788 public static final Template MethodrefAmbiguousResolvedIsIface = 4789 new Template("MethodrefAmbiguousResolvedIsIface", 4790 /* Inherit from interface. 4791 * 4792 * C2[](*) = mref, I[](any) 4793 * C1[C2,I]() = oref 4794 */ 4795 (final SelectionResolutionTestCase.Builder builder) -> { 4796 final ClassData oldexpected = 4797 builder.classdata.get(builder.expected); 4798 final ClassData.Package pck = oldexpected.packageId; 4799 final MethodData.Context ctx = oldexpected.methoddata.context; 4800 final MethodData mdata = 4801 new MethodData(MethodData.Access.PUBLIC, ctx); 4802 final ClassData withDef = new ClassData(pck, mdata); 4803 final int C2 = builder.methodref; 4804 final int C1 = builder.addClass(emptyClass(pck)); 4805 final int I = builder.addInterface(withDef); 4806 builder.hier.addInherit(C1, C2); 4807 builder.hier.addInherit(C1, I); 4808 builder.objectref = C1; 4809 }); 4810 4811 public static final Template IfaceMethodrefAmbiguousResolvedIsIface = 4812 new Template("IfaceMethodrefAmbiguousResolvedIsIface", 4813 /* Inherit from interface. 4814 * 4815 * I1[](*) = mref, I2[](any) 4816 * C1[I1,I2]() = oref 4817 */ 4818 (final SelectionResolutionTestCase.Builder builder) -> { 4819 final ClassData oldexpected = 4820 builder.classdata.get(builder.expected); 4821 final ClassData.Package pck = oldexpected.packageId; 4822 final MethodData.Context ctx = oldexpected.methoddata.context; 4823 final MethodData mdata = 4824 new MethodData(MethodData.Access.PUBLIC, ctx); 4825 final ClassData withDef = new ClassData(pck, mdata); 4826 final int I1 = builder.methodref; 4827 final int C = builder.addClass(emptyClass(pck)); 4828 final int I2 = builder.addInterface(withDef); 4829 builder.hier.addInherit(C, I1); 4830 builder.hier.addInherit(C, I2); 4831 builder.objectref = C; 4832 }); 4833 4834 public static final Template InvokespecialAmbiguousResolvedIsIface = 4835 new Template("InvokespecialAmbiguousResolvedIsIface", 4836 /* Inherit from interface. 4837 * 4838 * C2[](*) = csite, I[](any) 4839 * C1[C2,I]() = oref 4840 */ 4841 (final SelectionResolutionTestCase.Builder builder) -> { 4842 final ClassData oldexpected = 4843 builder.classdata.get(builder.expected); 4844 final ClassData.Package pck = oldexpected.packageId; 4845 final MethodData.Context ctx = oldexpected.methoddata.context; 4846 final MethodData mdata = 4847 new MethodData(MethodData.Access.PUBLIC, ctx); 4848 final ClassData withDef = new ClassData(pck, mdata); 4849 final int C2 = builder.callsite; 4850 final int C1 = builder.addClass(emptyClass(pck)); 4851 final int I = builder.addInterface(withDef); 4852 builder.hier.addInherit(C1, C2); 4853 builder.hier.addInherit(C1, I); 4854 builder.objectref = C1; 4855 }); 4856 4857 /****************************** 4858 * invokespecial Templates * 4859 ******************************/ 4860 4861 // Create this by taking MethodrefSelection and replacing 4862 // methodref with callsite. 4863 public static final Template ObjectrefAssignableToCallsite = 4864 new Template("ObjectrefAssignableToCallsite", 4865 /* Case 1: Objectref equals callsite 4866 * 4867 * C[](*) = csite = oref 4868 */ 4869 (builder) -> { 4870 builder.objectref = builder.callsite; 4871 }, 4872 /* Case 2: Inherit from super. 4873 * 4874 * C2[](*) = csite 4875 * C1[C2]() = oref 4876 */ 4877 (final SelectionResolutionTestCase.Builder builder) -> { 4878 final ClassData.Package pck = 4879 builder.classdata.get(builder.callsite).packageId; 4880 final int C2 = builder.callsite; 4881 final int C1 = builder.addClass(emptyClass(pck)); 4882 builder.hier.addInherit(C1, C2); 4883 builder.objectref = C1; 4884 }); 4885 4886 public static final Template ObjectrefExactSubclassOfCallsite = 4887 new Template("ObjectrefSubclassOfCallsite", 4888 /* Inherit from super. 4889 * 4890 * C2[](*) = csite 4891 * C1[C2]() = oref 4892 */ 4893 (final SelectionResolutionTestCase.Builder builder) -> { 4894 final ClassData.Package pck = 4895 builder.classdata.get(builder.callsite).packageId; 4896 final int C2 = builder.callsite; 4897 final int C1 = builder.addClass(emptyClass(pck)); 4898 builder.hier.addInherit(C1, C2); 4899 builder.objectref = C1; 4900 }); 4901 4902 public static final Template ObjectrefEqualsOrExactSubclassOfCallsite = 4903 new Template("ObjectrefEqualsOrExactSubclassOfCallsite", 4904 (final SelectionResolutionTestCase.Builder builder) -> { 4905 builder.objectref = builder.callsite; 4906 }, 4907 /* Inherit from super. 4908 * 4909 * C2[](*) = csite 4910 * C1[C2]() = oref 4911 */ 4912 (final SelectionResolutionTestCase.Builder builder) -> { 4913 final ClassData.Package pck = 4914 builder.classdata.get(builder.callsite).packageId; 4915 final int C2 = builder.callsite; 4916 final int C1 = builder.addClass(emptyClass(pck)); 4917 builder.hier.addInherit(C1, C2); 4918 builder.objectref = C1; 4919 }); 4920 4921 public static final Template ObjectrefEqualsCallsite = 4922 new Template("TrivialObjectref", 4923 Collections.singleton((builder) -> { 4924 builder.objectref = builder.callsite; 4925 })); 4926 4927 public static final Template ObjectrefSubclassOfSubclassOfCallsite = 4928 new Template("ObjectrefSubclassOfCallsite", 4929 /* Inherit from super. 4930 * 4931 * C3[](*) = csite 4932 * C2[C3]() 4933 * C1[C2]() = oref 4934 */ 4935 (final SelectionResolutionTestCase.Builder builder) -> { 4936 final ClassData.Package pck = 4937 builder.classdata.get(builder.callsite).packageId; 4938 final int C3 = builder.callsite; 4939 final int C2 = builder.addClass(emptyClass(pck)); 4940 final int C1 = builder.addClass(emptyClass(pck)); 4941 builder.hier.addInherit(C2, C3); 4942 builder.hier.addInherit(C1, C2); 4943 builder.objectref = C1; 4944 }); 4945 4946 private static class Placeholder extends ClassData { 4947 private final String placeholder; 4948 4949 4950 private Placeholder(final String placeholder, 4951 final MethodData methoddata) { 4952 super(ClassData.Package.PLACEHOLDER, methoddata); 4953 this.placeholder = placeholder; 4954 } 4955 4956 private Placeholder(final String placeholder) { 4957 this(placeholder, null); 4958 } 4959 4960 public String toString() { 4961 return " = <Placeholder for " + placeholder + ">\n\n"; 4962 } 4963 4964 public static final Placeholder objectref = new Placeholder("objectref"); 4965 public static final Placeholder methodref = new Placeholder("methodref"); 4966 public static final Placeholder callsite = new Placeholder("callsite"); 4967 public static final Placeholder expected = 4968 new Placeholder("expected", 4969 new MethodData(MethodData.Access.PLACEHOLDER, 4970 MethodData.Context.PLACEHOLDER)); 4971 } 4972 4973 public static void main(String... args) { 4974 4975 System.err.println("*** Resolution Templates ***\n"); 4976 final SelectionResolutionTestCase.Builder withExpectedIface = 4977 new SelectionResolutionTestCase.Builder(); 4978 withExpectedIface.expected = 4979 withExpectedIface.addInterface(Placeholder.expected); 4980 final SelectionResolutionTestCase.Builder withExpectedClass = 4981 new SelectionResolutionTestCase.Builder(); 4982 withExpectedClass.expected = 4983 withExpectedClass.addClass(Placeholder.expected); 4984 4985 MethodrefNotEqualsExpectedClass.printCases(withExpectedClass); 4986 MethodrefNotEqualsExpectedIface.printCases(withExpectedIface); 4987 IfaceMethodrefNotEqualsExpected.printCases(withExpectedIface); 4988 MethodrefAmbiguous.printCases(withExpectedIface); 4989 IfaceMethodrefAmbiguous.printCases(withExpectedIface); 4990 ReabstractExpectedIface.printCases(withExpectedIface); 4991 ReabstractExpectedClass.printCases(withExpectedClass); 4992 4993 final SelectionResolutionTestCase.Builder methodrefExpectedIface = 4994 withExpectedIface.copy(); 4995 methodrefExpectedIface.methodref = 4996 methodrefExpectedIface.addClass(Placeholder.methodref); 4997 final SelectionResolutionTestCase.Builder methodrefExpectedClass = 4998 withExpectedClass.copy(); 4999 methodrefExpectedClass.methodref = 5000 methodrefExpectedClass.addClass(Placeholder.methodref); 5001 final SelectionResolutionTestCase.Builder ifaceMethodref = 5002 withExpectedIface.copy(); 5003 ifaceMethodref.methodref = 5004 ifaceMethodref.addInterface(Placeholder.methodref); 5005 5006 IgnoredAbstract.printCases(methodrefExpectedIface); 5007 MethodrefSelectionResolvedIsClass.printCases(methodrefExpectedClass); 5008 MethodrefSelectionResolvedIsIface.printCases(methodrefExpectedIface); 5009 IfaceMethodrefSelection.printCases(ifaceMethodref); 5010 IfaceMethodrefSelectionOverrideNonPublic.printCases(ifaceMethodref); 5011 5012 } 5013 5014 }