1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright 2017 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 import java.util.*; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker public class Main { 20*795d594fSAndroid Build Coastguard Worker main(String[] args)21*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 22*795d594fSAndroid Build Coastguard Worker System.loadLibrary(args[0]); 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker if (!checkAppImageLoaded("660-clinit")) { 25*795d594fSAndroid Build Coastguard Worker System.out.println("AppImage not loaded."); 26*795d594fSAndroid Build Coastguard Worker } 27*795d594fSAndroid Build Coastguard Worker if (!checkAppImageContains(ClInit.class)) { 28*795d594fSAndroid Build Coastguard Worker System.out.println("ClInit class is not in app image!"); 29*795d594fSAndroid Build Coastguard Worker } 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker expectPreInit(ClInit.class); 32*795d594fSAndroid Build Coastguard Worker expectPreInit(A.class); 33*795d594fSAndroid Build Coastguard Worker expectPreInit(E.class); 34*795d594fSAndroid Build Coastguard Worker expectNotPreInit(B.class); 35*795d594fSAndroid Build Coastguard Worker expectNotPreInit(C.class); 36*795d594fSAndroid Build Coastguard Worker expectNotPreInit(G.class); 37*795d594fSAndroid Build Coastguard Worker expectNotPreInit(Gs.class); 38*795d594fSAndroid Build Coastguard Worker expectNotPreInit(Gss.class); 39*795d594fSAndroid Build Coastguard Worker expectPreInit(InvokeStatic.class); 40*795d594fSAndroid Build Coastguard Worker expectNotPreInit(ClinitE.class); 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker expectNotPreInit(Add.class); 43*795d594fSAndroid Build Coastguard Worker expectNotPreInit(Mul.class); 44*795d594fSAndroid Build Coastguard Worker expectNotPreInit(ObjectRef.class); 45*795d594fSAndroid Build Coastguard Worker expectNotPreInit(Print.class); 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker Print p = new Print(); 48*795d594fSAndroid Build Coastguard Worker Gs gs = new Gs(); 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker A x = new A(); 51*795d594fSAndroid Build Coastguard Worker System.out.println("A.a: " + A.a); 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker B y = new B(); 54*795d594fSAndroid Build Coastguard Worker C z = new C(); 55*795d594fSAndroid Build Coastguard Worker System.out.println("A.a: " + A.a); 56*795d594fSAndroid Build Coastguard Worker System.out.println("B.b: " + B.b); 57*795d594fSAndroid Build Coastguard Worker System.out.println("C.c: " + C.c); 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker ClInit c = new ClInit(); 60*795d594fSAndroid Build Coastguard Worker int aa = c.a; 61*795d594fSAndroid Build Coastguard Worker 62*795d594fSAndroid Build Coastguard Worker System.out.println("X: " + c.getX()); 63*795d594fSAndroid Build Coastguard Worker System.out.println("Y: " + c.getY()); 64*795d594fSAndroid Build Coastguard Worker System.out.println("str: " + c.str); 65*795d594fSAndroid Build Coastguard Worker System.out.println("ooo: " + c.ooo); 66*795d594fSAndroid Build Coastguard Worker System.out.println("Z: " + c.getZ()); 67*795d594fSAndroid Build Coastguard Worker System.out.println("A: " + c.getA()); 68*795d594fSAndroid Build Coastguard Worker System.out.println("AA: " + aa); 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker if (c.a != 101) { 71*795d594fSAndroid Build Coastguard Worker System.out.println("a != 101"); 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker try { 75*795d594fSAndroid Build Coastguard Worker ClinitE e = new ClinitE(); 76*795d594fSAndroid Build Coastguard Worker } catch (Error err) { } 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker return; 79*795d594fSAndroid Build Coastguard Worker } 80*795d594fSAndroid Build Coastguard Worker expectPreInit(Class<?> klass)81*795d594fSAndroid Build Coastguard Worker static void expectPreInit(Class<?> klass) { 82*795d594fSAndroid Build Coastguard Worker if (checkInitialized(klass) == false) { 83*795d594fSAndroid Build Coastguard Worker System.out.println(klass.getName() + " should be initialized!"); 84*795d594fSAndroid Build Coastguard Worker } 85*795d594fSAndroid Build Coastguard Worker } 86*795d594fSAndroid Build Coastguard Worker expectNotPreInit(Class<?> klass)87*795d594fSAndroid Build Coastguard Worker static void expectNotPreInit(Class<?> klass) { 88*795d594fSAndroid Build Coastguard Worker if (checkInitialized(klass) == true) { 89*795d594fSAndroid Build Coastguard Worker System.out.println(klass.getName() + " should not be initialized!"); 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker } 92*795d594fSAndroid Build Coastguard Worker checkAppImageLoaded(String name)93*795d594fSAndroid Build Coastguard Worker public static native boolean checkAppImageLoaded(String name); checkAppImageContains(Class<?> klass)94*795d594fSAndroid Build Coastguard Worker public static native boolean checkAppImageContains(Class<?> klass); checkInitialized(Class<?> klass)95*795d594fSAndroid Build Coastguard Worker public static native boolean checkInitialized(Class<?> klass); 96*795d594fSAndroid Build Coastguard Worker } 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker enum Day { 99*795d594fSAndroid Build Coastguard Worker SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 100*795d594fSAndroid Build Coastguard Worker THURSDAY, FRIDAY, SATURDAY 101*795d594fSAndroid Build Coastguard Worker } 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker class ClInit { 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker static String ooo = "OoooooO"; 106*795d594fSAndroid Build Coastguard Worker static String str; 107*795d594fSAndroid Build Coastguard Worker static int z; 108*795d594fSAndroid Build Coastguard Worker static int x, y; 109*795d594fSAndroid Build Coastguard Worker public static volatile int a = 100; 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker static { 112*795d594fSAndroid Build Coastguard Worker StringBuilder sb = new StringBuilder(); 113*795d594fSAndroid Build Coastguard Worker sb.append("Hello "); 114*795d594fSAndroid Build Coastguard Worker sb.append("World!"); 115*795d594fSAndroid Build Coastguard Worker str = sb.toString(); 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker z = 0xFF; 118*795d594fSAndroid Build Coastguard Worker z += 0xFF00; 119*795d594fSAndroid Build Coastguard Worker z += 0xAA0000; 120*795d594fSAndroid Build Coastguard Worker 121*795d594fSAndroid Build Coastguard Worker for(int i = 0; i < 100; i++) { 122*795d594fSAndroid Build Coastguard Worker x += i; 123*795d594fSAndroid Build Coastguard Worker } 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker y = x; 126*795d594fSAndroid Build Coastguard Worker for(int i = 0; i < 40; i++) { 127*795d594fSAndroid Build Coastguard Worker y += i; 128*795d594fSAndroid Build Coastguard Worker } 129*795d594fSAndroid Build Coastguard Worker } 130*795d594fSAndroid Build Coastguard Worker getX()131*795d594fSAndroid Build Coastguard Worker int getX() { 132*795d594fSAndroid Build Coastguard Worker return x; 133*795d594fSAndroid Build Coastguard Worker } 134*795d594fSAndroid Build Coastguard Worker getZ()135*795d594fSAndroid Build Coastguard Worker int getZ() { 136*795d594fSAndroid Build Coastguard Worker return z; 137*795d594fSAndroid Build Coastguard Worker } 138*795d594fSAndroid Build Coastguard Worker getY()139*795d594fSAndroid Build Coastguard Worker int getY() { 140*795d594fSAndroid Build Coastguard Worker return y; 141*795d594fSAndroid Build Coastguard Worker } 142*795d594fSAndroid Build Coastguard Worker getA()143*795d594fSAndroid Build Coastguard Worker int getA() { 144*795d594fSAndroid Build Coastguard Worker return a; 145*795d594fSAndroid Build Coastguard Worker } 146*795d594fSAndroid Build Coastguard Worker } 147*795d594fSAndroid Build Coastguard Worker 148*795d594fSAndroid Build Coastguard Worker class A { 149*795d594fSAndroid Build Coastguard Worker public static int a = 2; 150*795d594fSAndroid Build Coastguard Worker static { 151*795d594fSAndroid Build Coastguard Worker a = 5; // self-updating, pass 152*795d594fSAndroid Build Coastguard Worker } 153*795d594fSAndroid Build Coastguard Worker } 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker class B { 156*795d594fSAndroid Build Coastguard Worker public static int b; 157*795d594fSAndroid Build Coastguard Worker static { 158*795d594fSAndroid Build Coastguard Worker A.a = 10; // write other's static field, fail 159*795d594fSAndroid Build Coastguard Worker b = A.a; // read other's static field, fail 160*795d594fSAndroid Build Coastguard Worker } 161*795d594fSAndroid Build Coastguard Worker } 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker class C { 164*795d594fSAndroid Build Coastguard Worker public static int c; 165*795d594fSAndroid Build Coastguard Worker static { 166*795d594fSAndroid Build Coastguard Worker c = A.a; // read other's static field, fail 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker class E { 171*795d594fSAndroid Build Coastguard Worker public static final int e; 172*795d594fSAndroid Build Coastguard Worker static { 173*795d594fSAndroid Build Coastguard Worker e = 100; 174*795d594fSAndroid Build Coastguard Worker } 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker class G { 178*795d594fSAndroid Build Coastguard Worker static G g; 179*795d594fSAndroid Build Coastguard Worker static int i; 180*795d594fSAndroid Build Coastguard Worker static { 181*795d594fSAndroid Build Coastguard Worker g = new Gss(); // fail because recursive dependency 182*795d594fSAndroid Build Coastguard Worker i = A.a; // read other's static field, fail 183*795d594fSAndroid Build Coastguard Worker } 184*795d594fSAndroid Build Coastguard Worker } 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker // Gs will be successfully initialized as G's status is initializing at that point, which will 187*795d594fSAndroid Build Coastguard Worker // later aborted but Gs' transaction is already committed. 188*795d594fSAndroid Build Coastguard Worker // Instantiation of Gs will fail because we try to invoke G's <init> 189*795d594fSAndroid Build Coastguard Worker // but G's status will be StatusVerified. INVOKE_DIRECT will not initialize class. 190*795d594fSAndroid Build Coastguard Worker class Gs extends G {} // fail because super class can't be initialized 191*795d594fSAndroid Build Coastguard Worker class Gss extends Gs {} 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker // pruned because holding reference to non-image class 194*795d594fSAndroid Build Coastguard Worker class ObjectRef { 195*795d594fSAndroid Build Coastguard Worker static Class<?> klazz[] = new Class<?>[]{Add.class, Mul.class}; 196*795d594fSAndroid Build Coastguard Worker } 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker // non-image 199*795d594fSAndroid Build Coastguard Worker class Add { exec(int a, int b)200*795d594fSAndroid Build Coastguard Worker static int exec(int a, int b) { 201*795d594fSAndroid Build Coastguard Worker return a + b; 202*795d594fSAndroid Build Coastguard Worker } 203*795d594fSAndroid Build Coastguard Worker } 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker class InImage { exec(int a, int b)206*795d594fSAndroid Build Coastguard Worker static int exec(int a, int b) { 207*795d594fSAndroid Build Coastguard Worker return a + b; 208*795d594fSAndroid Build Coastguard Worker } 209*795d594fSAndroid Build Coastguard Worker } 210*795d594fSAndroid Build Coastguard Worker 211*795d594fSAndroid Build Coastguard Worker // test of INVOKE_STATIC instruction 212*795d594fSAndroid Build Coastguard Worker class InvokeStatic { 213*795d594fSAndroid Build Coastguard Worker static int a; 214*795d594fSAndroid Build Coastguard Worker static int b; 215*795d594fSAndroid Build Coastguard Worker static { 216*795d594fSAndroid Build Coastguard Worker a = InImage.exec(10, 20); 217*795d594fSAndroid Build Coastguard Worker b = InImage.exec(10, 20); 218*795d594fSAndroid Build Coastguard Worker } 219*795d594fSAndroid Build Coastguard Worker } 220*795d594fSAndroid Build Coastguard Worker 221*795d594fSAndroid Build Coastguard Worker // non-image 222*795d594fSAndroid Build Coastguard Worker class Mul { exec(int a, int b)223*795d594fSAndroid Build Coastguard Worker static int exec(int a, int b) { 224*795d594fSAndroid Build Coastguard Worker return a * b; 225*795d594fSAndroid Build Coastguard Worker } 226*795d594fSAndroid Build Coastguard Worker } 227*795d594fSAndroid Build Coastguard Worker 228*795d594fSAndroid Build Coastguard Worker class ClinitE { 229*795d594fSAndroid Build Coastguard Worker static { 230*795d594fSAndroid Build Coastguard Worker if (Math.sin(3) < 0.5) { 231*795d594fSAndroid Build Coastguard Worker // throw anyway, can't initialized 232*795d594fSAndroid Build Coastguard Worker throw new ExceptionInInitializerError("Can't initialize this class!"); 233*795d594fSAndroid Build Coastguard Worker } 234*795d594fSAndroid Build Coastguard Worker } 235*795d594fSAndroid Build Coastguard Worker } 236*795d594fSAndroid Build Coastguard Worker 237*795d594fSAndroid Build Coastguard Worker // fail because JNI 238*795d594fSAndroid Build Coastguard Worker class Print { 239*795d594fSAndroid Build Coastguard Worker static { 240*795d594fSAndroid Build Coastguard Worker System.out.println("hello world"); 241*795d594fSAndroid Build Coastguard Worker } 242*795d594fSAndroid Build Coastguard Worker } 243