1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main { 18*795d594fSAndroid Build Coastguard Worker private static boolean usingDalvik = "Dalvik".equals(System.getProperty("java.vm.name")); 19*795d594fSAndroid Build Coastguard Worker expectSameString(String expected, String actual)20*795d594fSAndroid Build Coastguard Worker public static void expectSameString(String expected, String actual) { 21*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 22*795d594fSAndroid Build Coastguard Worker throw new Error("Expected " + expected + ", got " + actual + " (different object)"); 23*795d594fSAndroid Build Coastguard Worker } 24*795d594fSAndroid Build Coastguard Worker } 25*795d594fSAndroid Build Coastguard Worker expectDefault(Super target)26*795d594fSAndroid Build Coastguard Worker public static void expectDefault(Super target) { 27*795d594fSAndroid Build Coastguard Worker String output = target.testMethod(); // invoke-virtual Super.testMethod() 28*795d594fSAndroid Build Coastguard Worker Abstract abstractTarget = target; 29*795d594fSAndroid Build Coastguard Worker String output2 = abstractTarget.testMethod(); // invoke-interface Abstract.testMethod() 30*795d594fSAndroid Build Coastguard Worker expectSameString(output, output2); 31*795d594fSAndroid Build Coastguard Worker System.out.println("Output from " + target.getClass().getName() + ": " + output); 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker expectConflict(Super target)34*795d594fSAndroid Build Coastguard Worker public static void expectConflict(Super target) { 35*795d594fSAndroid Build Coastguard Worker try { 36*795d594fSAndroid Build Coastguard Worker String output = target.testMethod(); // invoke-virtual Super.testMethod() 37*795d594fSAndroid Build Coastguard Worker throw new Error("Unexpected success for " + target.getClass().getName() + 38*795d594fSAndroid Build Coastguard Worker " output: " + output); 39*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError ame) { 40*795d594fSAndroid Build Coastguard Worker if (usingDalvik) { 41*795d594fSAndroid Build Coastguard Worker throw new Error("Unexpected AbstractMethodError", ame); 42*795d594fSAndroid Build Coastguard Worker } // else the AME is expected on RI. 43*795d594fSAndroid Build Coastguard Worker } catch (IncompatibleClassChangeError expected) { 44*795d594fSAndroid Build Coastguard Worker } 45*795d594fSAndroid Build Coastguard Worker try { 46*795d594fSAndroid Build Coastguard Worker Abstract abstractTarget = target; 47*795d594fSAndroid Build Coastguard Worker String output = abstractTarget.testMethod(); // invoke-interface Abstract.testMethod() 48*795d594fSAndroid Build Coastguard Worker throw new Error("Unexpected success for " + target.getClass().getName() + 49*795d594fSAndroid Build Coastguard Worker " output: " + output); 50*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError ame) { 51*795d594fSAndroid Build Coastguard Worker if (usingDalvik) { 52*795d594fSAndroid Build Coastguard Worker throw new Error("Unexpected AbstractMethodError", ame); 53*795d594fSAndroid Build Coastguard Worker } // else the AME is expected on RI. 54*795d594fSAndroid Build Coastguard Worker } catch (IncompatibleClassChangeError expected) { 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker System.out.println("Conflict in class " + target.getClass().getName()); 57*795d594fSAndroid Build Coastguard Worker } 58*795d594fSAndroid Build Coastguard Worker expectMiranda(Super target)59*795d594fSAndroid Build Coastguard Worker public static void expectMiranda(Super target) { 60*795d594fSAndroid Build Coastguard Worker try { 61*795d594fSAndroid Build Coastguard Worker String output = target.testMethod(); // invoke-virtual Super.testMethod() 62*795d594fSAndroid Build Coastguard Worker throw new Error("Unexpected success for " + target.getClass().getName() + 63*795d594fSAndroid Build Coastguard Worker " output: " + output); 64*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError expected) { 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker try { 67*795d594fSAndroid Build Coastguard Worker Abstract abstractTarget = target; 68*795d594fSAndroid Build Coastguard Worker String output = abstractTarget.testMethod(); // invoke-interface Abstract.testMethod() 69*795d594fSAndroid Build Coastguard Worker throw new Error("Unexpected success for " + target.getClass().getName() + 70*795d594fSAndroid Build Coastguard Worker " output: " + output); 71*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError expected) { 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker System.out.println("Miranda in class " + target.getClass().getName()); 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker main(String args[])76*795d594fSAndroid Build Coastguard Worker public static void main(String args[]) { 77*795d594fSAndroid Build Coastguard Worker // Basic tests that have the interfaces D<n> with default method and/or 78*795d594fSAndroid Build Coastguard Worker // D<n>M interfaces that mask the default method ordered by <n>. 79*795d594fSAndroid Build Coastguard Worker expectMiranda(new Super()); 80*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1()); 81*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D2()); 82*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D3()); 83*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1M()); 84*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D2M()); 85*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D3M()); 86*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2()); 87*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2M()); 88*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1M_D2()); 89*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1M_D2M()); 90*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_D3()); 91*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_D3M()); 92*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2M_D3()); 93*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2M_D3M()); 94*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1M_D2_D3()); 95*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1M_D2_D3M()); 96*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1M_D2M_D3()); 97*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1M_D2M_D3M()); 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker // Cases where one interface masks the method in more than one superinterface. 100*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1D2M()); 101*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1D2D()); 102*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_AD1D2M()); 103*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_AD1D2D()); 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker // Cases where the interface D2 is early in the interface table but masked by D2M later. 106*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D2_D1_D2M()); 107*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D2_D1M_D2M()); 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker // Cases that involve a superclass with miranda method in the vtable. 110*795d594fSAndroid Build Coastguard Worker // Note: The above cases also include a miranda method in the superclass vtable 111*795d594fSAndroid Build Coastguard Worker // anyway because we want to test `invoke-virtual Super.testMethod()` as well 112*795d594fSAndroid Build Coastguard Worker // as the `invoke-interface Abstract.testMethod()`. However, miranda methods in 113*795d594fSAndroid Build Coastguard Worker // superclass vtable mean that all default methods in superclass interfaces, 114*795d594fSAndroid Build Coastguard Worker // if any, have been masked by abstract method, so processing them is a no-op. 115*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1M_x_D2()); 116*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1M_x_D2M()); 117*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1M_x_D2_D3()); 118*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1M_x_D2_D3M()); 119*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1M_x_D2M_D3()); 120*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1M_x_D2M_D3M()); 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker // Cases that involve a superclass with default method in the vtable. 123*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_x_D2()); 124*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_x_D2M()); 125*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_x_D1MD()); 126*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_x_D1M()); 127*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_x_D2_D3()); 128*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_x_D2_D3M()); 129*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_x_D2M_D3()); 130*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_x_D2M_D3M()); 131*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_x_D1MD_D2()); 132*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_x_D1MD_D2M()); 133*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_x_D1M_D2()); 134*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_x_D1M_D2M()); 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker // Cases that involve a superclass with conflict method in the vtable. 137*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_x_D2M()); 138*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_x_D1M()); 139*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_D2_x_D1M_D2M()); 140*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_x_D1MD_D2M()); 141*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_x_D1M_D3()); 142*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_x_D1M_D3M()); 143*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_x_D2M_D3()); 144*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_x_D2M_D3M()); 145*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_x_D1MD_D3()); 146*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_x_D1MD_D3M()); 147*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_D3M_x_D1MD_D2M()); 148*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_D2_D3M_x_D1M_D2M()); 149*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_x_D1D2D()); 150*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_D2_x_D1D2M()); 151*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_x_AD1D2D()); 152*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_D2_x_AD1D2M()); 153*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_D3_x_D1D2D()); 154*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_D3_x_D1D2M()); 155*795d594fSAndroid Build Coastguard Worker expectConflict(new Conflict_D1_D2_D3_x_AD1D2D()); 156*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_D3_x_AD1D2M()); 157*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_D3M_x_D1D2D()); 158*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_D2_D3M_x_D1D2M()); 159*795d594fSAndroid Build Coastguard Worker expectDefault(new Default_D1_D2_D3M_x_AD1D2D()); 160*795d594fSAndroid Build Coastguard Worker expectMiranda(new Miranda_D1_D2_D3M_x_AD1D2M()); 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker regressionTestB215510819(); 163*795d594fSAndroid Build Coastguard Worker } 164*795d594fSAndroid Build Coastguard Worker regressionTestB215510819()165*795d594fSAndroid Build Coastguard Worker static public void regressionTestB215510819() { 166*795d594fSAndroid Build Coastguard Worker // The failure to fill IMT correctly would have resulted in calling the wrong method, 167*795d594fSAndroid Build Coastguard Worker // or triggering a check when interpreting in debug mode. 168*795d594fSAndroid Build Coastguard Worker Abstract abstractTarget = new B215510819Test(); 169*795d594fSAndroid Build Coastguard Worker String result = abstractTarget.testMethod(); 170*795d594fSAndroid Build Coastguard Worker System.out.println("B215510819 test result: " + result); 171*795d594fSAndroid Build Coastguard Worker } 172*795d594fSAndroid Build Coastguard Worker } 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker class Default_D1 extends Super implements Abstract, D1 {} 175*795d594fSAndroid Build Coastguard Worker class Default_D2 extends Super implements Abstract, D2 {} 176*795d594fSAndroid Build Coastguard Worker class Default_D3 extends Super implements Abstract, D3 {} 177*795d594fSAndroid Build Coastguard Worker class Miranda_D1M extends Super implements Abstract, D1M {} 178*795d594fSAndroid Build Coastguard Worker class Miranda_D2M extends Super implements Abstract, D2M {} 179*795d594fSAndroid Build Coastguard Worker class Miranda_D3M extends Super implements Abstract, D3M {} 180*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2 extends Super implements Abstract, D1, D2 {} 181*795d594fSAndroid Build Coastguard Worker class Default_D1_D2M extends Super implements Abstract, D1, D2M {} 182*795d594fSAndroid Build Coastguard Worker class Default_D1M_D2 extends Super implements Abstract, D1M, D2 {} 183*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_D2M extends Super implements Abstract, D1M, D2M {} 184*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3 extends Super implements Abstract, D1, D2, D3 {} 185*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3M extends Super implements Abstract, D1, D2, D3M {} 186*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2M_D3 extends Super implements Abstract, D1, D2M, D3 {} 187*795d594fSAndroid Build Coastguard Worker class Default_D1_D2M_D3M extends Super implements Abstract, D1, D2M, D3M {} 188*795d594fSAndroid Build Coastguard Worker class Conflict_D1M_D2_D3 extends Super implements Abstract, D1M, D2, D3 {} 189*795d594fSAndroid Build Coastguard Worker class Default_D1M_D2_D3M extends Super implements Abstract, D1M, D2, D3M {} 190*795d594fSAndroid Build Coastguard Worker class Default_D1M_D2M_D3 extends Super implements Abstract, D1M, D2M, D3 {} 191*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_D2M_D3M extends Super implements Abstract, D1M, D2M, D3M {} 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker class Miranda_D1D2M extends Super implements D1D2M {} 194*795d594fSAndroid Build Coastguard Worker class Default_D1D2D extends Super implements D1D2D {} 195*795d594fSAndroid Build Coastguard Worker class Miranda_AD1D2M extends Super implements AD1D2M {} 196*795d594fSAndroid Build Coastguard Worker class Default_AD1D2D extends Super implements AD1D2D {} 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker class Default_D2_D1_D2M extends Super implements Abstract, D1, D2M {} 199*795d594fSAndroid Build Coastguard Worker class Miranda_D2_D1M_D2M extends Super implements Abstract, D1M, D2M {} 200*795d594fSAndroid Build Coastguard Worker 201*795d594fSAndroid Build Coastguard Worker class Default_D1M_x_D2 extends Miranda_D1M implements D2 {} 202*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_x_D2M extends Miranda_D1M implements D2M {} 203*795d594fSAndroid Build Coastguard Worker class Conflict_D1M_x_D2_D3 extends Miranda_D1M implements D2, D3 {} 204*795d594fSAndroid Build Coastguard Worker class Default_D1M_x_D2_D3M extends Miranda_D1M implements D2, D3M {} 205*795d594fSAndroid Build Coastguard Worker class Default_D1M_x_D2M_D3 extends Miranda_D1M implements D2M, D3 {} 206*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_x_D2M_D3M extends Miranda_D1M implements D2M, D3M {} 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2 extends Default_D1 implements D2 {} 209*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D2M extends Default_D1 implements D2M {} 210*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D1MD extends Default_D1 implements D1MD {} 211*795d594fSAndroid Build Coastguard Worker class Miranda_D1_x_D1M extends Default_D1 implements D1M {} 212*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2_D3 extends Default_D1 implements D2, D3 {} 213*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2_D3M extends Default_D1 implements D2, D3M {} 214*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2M_D3 extends Default_D1 implements D2M, D3 {} 215*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D2M_D3M extends Default_D1 implements D2M, D3M {} 216*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D1MD_D2 extends Default_D1 implements D1MD, D2 {} 217*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D1MD_D2M extends Default_D1 implements D1MD, D2M {} 218*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D1M_D2 extends Default_D1 implements D1M, D2 {} 219*795d594fSAndroid Build Coastguard Worker class Miranda_D1_x_D1M_D2M extends Default_D1 implements D1M, D2M {} 220*795d594fSAndroid Build Coastguard Worker 221*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D2M extends Conflict_D1_D2 implements D2M {} 222*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1M extends Conflict_D1_D2 implements D1M {} 223*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_x_D1M_D2M extends Conflict_D1_D2 implements D1M, D2M {} 224*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1MD_D2M extends Conflict_D1_D2 implements D1MD, D2M {} 225*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D1M_D3 extends Conflict_D1_D2 implements D1M, D3 {} 226*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1M_D3M extends Conflict_D1_D2 implements D1M, D3M {} 227*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D2M_D3 extends Conflict_D1_D2 implements D2M, D3 {} 228*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D2M_D3M extends Conflict_D1_D2 implements D2M, D3M {} 229*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D1MD_D3 extends Conflict_D1_D2 implements D1MD, D3 {} 230*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D1MD_D3M extends Conflict_D1_D2 implements D1MD, D3M {} 231*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3M_x_D1MD_D2M extends Conflict_D1_D2_D3M implements D1MD, D2M {} 232*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_D3M_x_D1M_D2M extends Conflict_D1_D2_D3M implements D1M, D2M {} 233*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_x_D1D2M extends Conflict_D1_D2 implements D1D2M {} 234*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1D2D extends Conflict_D1_D2 implements D1D2D {} 235*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_x_AD1D2M extends Conflict_D1_D2 implements AD1D2M {} 236*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_AD1D2D extends Conflict_D1_D2 implements AD1D2D {} 237*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3_x_D1D2M extends Conflict_D1_D2_D3 implements D1D2M {} 238*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3_x_D1D2D extends Conflict_D1_D2_D3 implements D1D2D {} 239*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3_x_AD1D2M extends Conflict_D1_D2_D3 implements AD1D2M {} 240*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3_x_AD1D2D extends Conflict_D1_D2_D3 implements AD1D2D {} 241*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_D3M_x_D1D2M extends Conflict_D1_D2_D3M implements D1D2M {} 242*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3M_x_D1D2D extends Conflict_D1_D2_D3M implements D1D2D {} 243*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_D3M_x_AD1D2M extends Conflict_D1_D2_D3M implements AD1D2M {} 244*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3M_x_AD1D2D extends Conflict_D1_D2_D3M implements AD1D2D {} 245*795d594fSAndroid Build Coastguard Worker 246*795d594fSAndroid Build Coastguard Worker interface B215510819Iface { 247*795d594fSAndroid Build Coastguard Worker // The IMT size is currently 43 and we want to cover all 43 indexes with non-copied 248*795d594fSAndroid Build Coastguard Worker // implementations. The IMT index for abstract methods is calculated with a hash that 249*795d594fSAndroid Build Coastguard Worker // includes the method name, so 43 consecutive characters in the method name would be best. 250*795d594fSAndroid Build Coastguard Worker // (The fact that the name hash is multiplied by 16 is OK because the size of the IMT is a 251*795d594fSAndroid Build Coastguard Worker // prime number and thus GCD(16, 43) = 1.) However, we do not have a contiguous range of 43 252*795d594fSAndroid Build Coastguard Worker // valid characters, so we need to rely on the `hash % 43` to mask out the difference when 253*795d594fSAndroid Build Coastguard Worker // we use `0`..`5` between `Z` and `a`. ('Z' + 1 - 43 = '0' and '5' + 1 + 43 = 'a'.) method_A()254*795d594fSAndroid Build Coastguard Worker String method_A(); method_B()255*795d594fSAndroid Build Coastguard Worker String method_B(); method_C()256*795d594fSAndroid Build Coastguard Worker String method_C(); method_D()257*795d594fSAndroid Build Coastguard Worker String method_D(); method_E()258*795d594fSAndroid Build Coastguard Worker String method_E(); method_F()259*795d594fSAndroid Build Coastguard Worker String method_F(); method_G()260*795d594fSAndroid Build Coastguard Worker String method_G(); method_H()261*795d594fSAndroid Build Coastguard Worker String method_H(); method_I()262*795d594fSAndroid Build Coastguard Worker String method_I(); method_J()263*795d594fSAndroid Build Coastguard Worker String method_J(); method_K()264*795d594fSAndroid Build Coastguard Worker String method_K(); method_L()265*795d594fSAndroid Build Coastguard Worker String method_L(); method_M()266*795d594fSAndroid Build Coastguard Worker String method_M(); method_N()267*795d594fSAndroid Build Coastguard Worker String method_N(); method_O()268*795d594fSAndroid Build Coastguard Worker String method_O(); method_P()269*795d594fSAndroid Build Coastguard Worker String method_P(); method_Q()270*795d594fSAndroid Build Coastguard Worker String method_Q(); method_R()271*795d594fSAndroid Build Coastguard Worker String method_R(); method_S()272*795d594fSAndroid Build Coastguard Worker String method_S(); method_T()273*795d594fSAndroid Build Coastguard Worker String method_T(); method_U()274*795d594fSAndroid Build Coastguard Worker String method_U(); method_V()275*795d594fSAndroid Build Coastguard Worker String method_V(); method_W()276*795d594fSAndroid Build Coastguard Worker String method_W(); method_X()277*795d594fSAndroid Build Coastguard Worker String method_X(); method_Y()278*795d594fSAndroid Build Coastguard Worker String method_Y(); method_Z()279*795d594fSAndroid Build Coastguard Worker String method_Z(); method_0()280*795d594fSAndroid Build Coastguard Worker String method_0(); method_1()281*795d594fSAndroid Build Coastguard Worker String method_1(); method_2()282*795d594fSAndroid Build Coastguard Worker String method_2(); method_3()283*795d594fSAndroid Build Coastguard Worker String method_3(); method_4()284*795d594fSAndroid Build Coastguard Worker String method_4(); method_5()285*795d594fSAndroid Build Coastguard Worker String method_5(); method_a()286*795d594fSAndroid Build Coastguard Worker String method_a(); method_b()287*795d594fSAndroid Build Coastguard Worker String method_b(); method_c()288*795d594fSAndroid Build Coastguard Worker String method_c(); method_d()289*795d594fSAndroid Build Coastguard Worker String method_d(); method_e()290*795d594fSAndroid Build Coastguard Worker String method_e(); method_f()291*795d594fSAndroid Build Coastguard Worker String method_f(); method_g()292*795d594fSAndroid Build Coastguard Worker String method_g(); method_h()293*795d594fSAndroid Build Coastguard Worker String method_h(); method_i()294*795d594fSAndroid Build Coastguard Worker String method_i(); method_j()295*795d594fSAndroid Build Coastguard Worker String method_j(); method_k()296*795d594fSAndroid Build Coastguard Worker String method_k(); 297*795d594fSAndroid Build Coastguard Worker } 298*795d594fSAndroid Build Coastguard Worker // Note: Marked as abstract to avoid IMT table in this class. 299*795d594fSAndroid Build Coastguard Worker abstract class B215510819Base extends Default_D1 implements B215510819Iface { method_A()300*795d594fSAndroid Build Coastguard Worker public String method_A() { return "B215510819 - wrong method_A!"; } method_B()301*795d594fSAndroid Build Coastguard Worker public String method_B() { return "B215510819 - wrong method_B!"; } method_C()302*795d594fSAndroid Build Coastguard Worker public String method_C() { return "B215510819 - wrong method_C!"; } method_D()303*795d594fSAndroid Build Coastguard Worker public String method_D() { return "B215510819 - wrong method_D!"; } method_E()304*795d594fSAndroid Build Coastguard Worker public String method_E() { return "B215510819 - wrong method_E!"; } method_F()305*795d594fSAndroid Build Coastguard Worker public String method_F() { return "B215510819 - wrong method_F!"; } method_G()306*795d594fSAndroid Build Coastguard Worker public String method_G() { return "B215510819 - wrong method_G!"; } method_H()307*795d594fSAndroid Build Coastguard Worker public String method_H() { return "B215510819 - wrong method_H!"; } method_I()308*795d594fSAndroid Build Coastguard Worker public String method_I() { return "B215510819 - wrong method_I!"; } method_J()309*795d594fSAndroid Build Coastguard Worker public String method_J() { return "B215510819 - wrong method_J!"; } method_K()310*795d594fSAndroid Build Coastguard Worker public String method_K() { return "B215510819 - wrong method_K!"; } method_L()311*795d594fSAndroid Build Coastguard Worker public String method_L() { return "B215510819 - wrong method_L!"; } method_M()312*795d594fSAndroid Build Coastguard Worker public String method_M() { return "B215510819 - wrong method_M!"; } method_N()313*795d594fSAndroid Build Coastguard Worker public String method_N() { return "B215510819 - wrong method_N!"; } method_O()314*795d594fSAndroid Build Coastguard Worker public String method_O() { return "B215510819 - wrong method_O!"; } method_P()315*795d594fSAndroid Build Coastguard Worker public String method_P() { return "B215510819 - wrong method_P!"; } method_Q()316*795d594fSAndroid Build Coastguard Worker public String method_Q() { return "B215510819 - wrong method_Q!"; } method_R()317*795d594fSAndroid Build Coastguard Worker public String method_R() { return "B215510819 - wrong method_R!"; } method_S()318*795d594fSAndroid Build Coastguard Worker public String method_S() { return "B215510819 - wrong method_S!"; } method_T()319*795d594fSAndroid Build Coastguard Worker public String method_T() { return "B215510819 - wrong method_T!"; } method_U()320*795d594fSAndroid Build Coastguard Worker public String method_U() { return "B215510819 - wrong method_U!"; } method_V()321*795d594fSAndroid Build Coastguard Worker public String method_V() { return "B215510819 - wrong method_V!"; } method_W()322*795d594fSAndroid Build Coastguard Worker public String method_W() { return "B215510819 - wrong method_W!"; } method_X()323*795d594fSAndroid Build Coastguard Worker public String method_X() { return "B215510819 - wrong method_X!"; } method_Y()324*795d594fSAndroid Build Coastguard Worker public String method_Y() { return "B215510819 - wrong method_Y!"; } method_Z()325*795d594fSAndroid Build Coastguard Worker public String method_Z() { return "B215510819 - wrong method_Z!"; } method_0()326*795d594fSAndroid Build Coastguard Worker public String method_0() { return "B215510819 - wrong method_0!"; } method_1()327*795d594fSAndroid Build Coastguard Worker public String method_1() { return "B215510819 - wrong method_1!"; } method_2()328*795d594fSAndroid Build Coastguard Worker public String method_2() { return "B215510819 - wrong method_2!"; } method_3()329*795d594fSAndroid Build Coastguard Worker public String method_3() { return "B215510819 - wrong method_3!"; } method_4()330*795d594fSAndroid Build Coastguard Worker public String method_4() { return "B215510819 - wrong method_4!"; } method_5()331*795d594fSAndroid Build Coastguard Worker public String method_5() { return "B215510819 - wrong method_5!"; } method_a()332*795d594fSAndroid Build Coastguard Worker public String method_a() { return "B215510819 - wrong method_a!"; } method_b()333*795d594fSAndroid Build Coastguard Worker public String method_b() { return "B215510819 - wrong method_b!"; } method_c()334*795d594fSAndroid Build Coastguard Worker public String method_c() { return "B215510819 - wrong method_c!"; } method_d()335*795d594fSAndroid Build Coastguard Worker public String method_d() { return "B215510819 - wrong method_d!"; } method_e()336*795d594fSAndroid Build Coastguard Worker public String method_e() { return "B215510819 - wrong method_e!"; } method_f()337*795d594fSAndroid Build Coastguard Worker public String method_f() { return "B215510819 - wrong method_f!"; } method_g()338*795d594fSAndroid Build Coastguard Worker public String method_g() { return "B215510819 - wrong method_g!"; } method_h()339*795d594fSAndroid Build Coastguard Worker public String method_h() { return "B215510819 - wrong method_h!"; } method_i()340*795d594fSAndroid Build Coastguard Worker public String method_i() { return "B215510819 - wrong method_i!"; } method_j()341*795d594fSAndroid Build Coastguard Worker public String method_j() { return "B215510819 - wrong method_j!"; } method_k()342*795d594fSAndroid Build Coastguard Worker public String method_k() { return "B215510819 - wrong method_k!"; } 343*795d594fSAndroid Build Coastguard Worker } 344*795d594fSAndroid Build Coastguard Worker // Regression test for bug 215510819 where we failed to properly fill the IMT table 345*795d594fSAndroid Build Coastguard Worker // when there were no new methods or interfaces and the superclass did not have an IMT 346*795d594fSAndroid Build Coastguard Worker // table, so we filled the IMT from the superclass IfTable and erroneously ignored 347*795d594fSAndroid Build Coastguard Worker // copied implementation methods in the process. Thus calls that should go to copied 348*795d594fSAndroid Build Coastguard Worker // methods via an IMT conflict resolution trampoline would just end up in unrelated 349*795d594fSAndroid Build Coastguard Worker // concrete method when called from compiled code or from interpreter in release mode. 350*795d594fSAndroid Build Coastguard Worker // In debug mode, interpreter would fail a debug check. 351*795d594fSAndroid Build Coastguard Worker class B215510819Test extends B215510819Base {} // No new interfaces or virtuals. 352