blob: cf69570854a9414b112fad5fd0559b70807f4002 [file] [log] [blame]
jeffhao5d1ac922011-09-29 17:41:15 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17public class Main {
Elliott Hughesa58ff172012-02-29 16:33:23 -080018 static {
Elliott Hughes79686a02012-03-01 10:16:45 -080019 staticMethodCalledByClinit();
Elliott Hughesa58ff172012-02-29 16:33:23 -080020 }
21
Elliott Hughes79686a02012-03-01 10:16:45 -080022 private static void staticMethodCalledByClinit() {
23 // Test that DeliverException works when we need to unwind to a handler -- this method --
24 // that is currently a resolution stub because it's running on behalf of <clinit>.
Elliott Hughesa58ff172012-02-29 16:33:23 -080025 try {
26 throwDuringClinit();
27 System.err.println("didn't throw!");
28 } catch (NullPointerException ex) {
29 System.out.println("caught exception thrown during clinit");
30 }
31 }
32
33 private static void throwDuringClinit() {
34 throw new NullPointerException();
35 }
36
jeffhao5d1ac922011-09-29 17:41:15 -070037 public static void main(String[] args) {
38 checkExceptions();
39 checkTiming();
40 }
41
42 public static void sleep(int msec) {
43 try {
44 Thread.sleep(msec);
45 } catch (InterruptedException ie) {
46 System.err.println("sleep interrupted");
47 }
48 }
49
50 static void checkExceptions() {
51 try {
52 System.out.println(PartialInit.FIELD0);
53 System.err.println("Construction of PartialInit succeeded unexpectedly");
54 } catch (ExceptionInInitializerError eiie) {
55 System.out.println("Got expected EIIE for FIELD0");
56 }
57
58 try {
59 System.out.println(PartialInit.FIELD0);
60 System.err.println("Load of FIELD0 succeeded unexpectedly");
61 } catch (NoClassDefFoundError ncdfe) {
62 System.out.println("Got expected NCDFE for FIELD0");
63 }
64 try {
65 System.out.println(PartialInit.FIELD1);
66 System.err.println("Load of FIELD1 succeeded unexpectedly");
67 } catch (NoClassDefFoundError ncdfe) {
68 System.out.println("Got expected NCDFE for FIELD1");
69 }
Elliott Hughes4f3d94b2012-12-10 15:47:02 -080070
71 try {
72 System.out.println(Exploder.FIELD);
73 System.err.println("Load of FIELD succeeded unexpectedly");
74 } catch (AssertionError expected) {
75 System.out.println("Got expected '" + expected.getMessage() + "' from Exploder");
76 }
jeffhao5d1ac922011-09-29 17:41:15 -070077 }
78
79 static void checkTiming() {
80 FieldThread fieldThread = new FieldThread();
81 MethodThread methodThread = new MethodThread();
82
83 fieldThread.start();
84 methodThread.start();
85
86 /* start class init */
87 IntHolder zero = SlowInit.FIELD0;
88
89 /* wait for children to complete */
90 try {
91 fieldThread.join();
92 methodThread.join();
93 } catch (InterruptedException ie) {
94 System.err.println(ie);
95 }
96
97 /* print all values */
98 System.out.println("Fields (main thread): " +
99 SlowInit.FIELD0.getValue() + SlowInit.FIELD1.getValue() +
100 SlowInit.FIELD2.getValue() + SlowInit.FIELD3.getValue());
101 }
102
103 static class FieldThread extends Thread {
104 public void run() {
Elliott Hughes741b5b72012-01-31 19:18:51 -0800105 /* allow SlowInit's <clinit> to start */
jeffhao94d6df42012-11-26 16:02:12 -0800106 Main.sleep(5000);
jeffhao5d1ac922011-09-29 17:41:15 -0700107
108 /* collect fields; should delay until class init completes */
109 int field0, field1, field2, field3;
110 field0 = SlowInit.FIELD0.getValue();
111 field1 = SlowInit.FIELD1.getValue();
112 field2 = SlowInit.FIELD2.getValue();
113 field3 = SlowInit.FIELD3.getValue();
114
115 /* let MethodThread print first */
Elliott Hughes741b5b72012-01-31 19:18:51 -0800116 Main.sleep(5000);
jeffhao5d1ac922011-09-29 17:41:15 -0700117 System.out.println("Fields (child thread): " +
118 field0 + field1 + field2 + field3);
119 }
120 }
121
122 static class MethodThread extends Thread {
123 public void run() {
Elliott Hughes741b5b72012-01-31 19:18:51 -0800124 /* allow SlowInit's <clinit> to start */
jeffhao94d6df42012-11-26 16:02:12 -0800125 Main.sleep(5000);
jeffhao5d1ac922011-09-29 17:41:15 -0700126
127 /* use a method that shouldn't be accessible yet */
128 SlowInit.printMsg("MethodThread message");
129 }
130 }
131}