/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.util.concurrent.*; /** * Test for Jit regressions. */ public class Main { public static void main(String args[]) throws Exception { b2296099Test(); b2302318Test(); b2487514Test(); b5884080Test(); zeroTest(); } static void b2296099Test() throws Exception { int x = -1190771042; int dist = 360530809; int xl = -1190771042; int distl = 360530809; for (int i = 0; i < 100000; i++) { int b = rotateLeft(x, dist); if (b != 1030884493) throw new RuntimeException("Unexpected value: " + b + " after " + i + " iterations"); } for (int i = 0; i < 100000; i++) { long bl = rotateLeft(xl, distl); if (bl != 1030884493) throw new RuntimeException("Unexpected value: " + bl + " after " + i + " iterations"); } System.out.println("b2296099 passes"); } static int rotateLeft(int i, int distance) { return ((i << distance) | (i >>> (-distance))); } static void b2302318Test() { System.gc(); SpinThread slow = new SpinThread(Thread.MIN_PRIORITY); SpinThread fast1 = new SpinThread(Thread.NORM_PRIORITY); SpinThread fast2 = new SpinThread(Thread.MAX_PRIORITY); slow.setDaemon(true); fast1.setDaemon(true); fast2.setDaemon(true); fast2.start(); slow.start(); fast1.start(); try { Thread.sleep(3000); } catch (InterruptedException ie) {/*ignore */} System.gc(); System.out.println("b2302318 passes"); } static void b2487514Test() { PriorityBlockingQueue q = new PriorityBlockingQueue(10); int catchCount = 0; q.offer(new Integer(0)); /* * Warm up the code cache to have toArray() compiled. The key here is * to pass a compatible type so that there are no exceptions when * executing the method body (ie the APUT_OBJECT bytecode). */ for (int i = 0; i < 1000; i++) { Integer[] ints = (Integer[]) q.toArray(new Integer[5]); } /* Now pass an incompatible type which is guaranteed to throw */ for (int i = 0; i < 1000; i++) { try { Object[] obj = q.toArray(new String[5]); } catch (ArrayStoreException success) { catchCount++; } } if (catchCount == 1000) { System.out.println("b2487514 passes"); } else { System.out.println("b2487514 fails: catchCount is " + catchCount + " (expecting 1000)"); } } static void b5884080Test() { int vA = 1; int l = 0; do { int k = 0; do vA += 1; while(++k < 100); } while (++l < 1000); if (vA == 100001) { System.out.println("b5884080 passes"); } else { System.out.println("b5884080 fails: vA is " + vA + " (expecting 100001)"); } } static void zeroTest() throws Exception { ZeroTests zt = new ZeroTests(); try { zt.longDivTest(); } catch (Throwable th) { th.printStackTrace(); } try { zt.longModTest(); } catch (Throwable th) { th.printStackTrace(); } } } class SpinThread extends Thread { int mPriority; SpinThread(int prio) { super("Spin prio=" + prio); mPriority = prio; } public void run() { setPriority(mPriority); while (true) {} } }