/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
class TypeCheck {
public static void main(String[] args) {
PRINT = true;
num_cc1 = num_cc2 = num_cc3 = num_cc4 = num_cc5 = num_io1 = num_io2 = num_io3 =
num_cs = num_cc_cs = num_io_cc_cs = 100000;
run();
}
static int num_cc1 = 10000;
static int num_cc2 = 10000;
static int num_cc3 = 10000;
static int num_cc4 = 10000;
static int num_cc5 = 10000;
static int num_io1 = 10000;
static int num_io2 = 10000;
static int num_io3 = 10000;
static int num_io4 = 10000;
static int num_cs = 10000;
static int num_cc_cs = 10000;
static int num_io_cc_cs = 10000;
static volatile Integer field1;
static volatile Object field2;
static volatile Throwable field3;
static volatile java.io.Serializable field4;
static Integer[] a1;
static Object[] a2;
static Throwable[] a3;
static long t1;
static boolean testSuccess = true;
static boolean run() {
// TEST 1
// checkcast
Object obj = new Integer(1);
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cc1; ++i) {
field1 = (Integer)obj;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 2
field2 = new Integer(2);
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cc2; ++i) {
field1 = (Integer)field2;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 3
obj = new NoSuchMethodError();
field3 = (Throwable)obj;
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cc3; ++i) {
field3 = (Throwable)obj;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 4
field2 = new NoSuchMethodError();
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cc4; ++i) {
field3 = (Throwable)field2;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 5
Object old1 = field2;
///!!TODO: oti library doesn't have rmi package. is io package just as good here? [--DL]
///field2 = field3 = new java.rmi.server.SocketSecurityException("");
field2 = field3 = new java.io.IOException("");
field4 = (java.io.Serializable)field2;
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cc5; ++i) {
field4 = (java.io.Serializable)field2;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
field2 = old1;
// TEST 6
// instanceof
int sum = 0;
t1 = System.currentTimeMillis();
for (int i = 0; i < num_io1; ++i) {
if (field2 instanceof NoSuchMethodError) ++sum;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 7
field2 = new Integer(sum);
t1 = System.currentTimeMillis();
for (int i = 0; i < num_io2; ++i) {
if (field2 instanceof Integer) ++sum;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 8
t1 = System.currentTimeMillis();
for (int i = 0; i < num_io3; ++i) {
if (field2 instanceof NoSuchMethodError) ++sum;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 9
// checkstore
field2 = new Integer(sum);
a1 = new Integer[num_cs];
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cs; ++i) {
a1[i] = field1;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 10
Object[] b = a1;
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cs; ++i) {
b[i] = field2;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 11
a2 = new Object[num_cs];
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cs; ++i) {
a2[i] = field3;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 12
a3 = new Exception[num_cs];
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cs; ++i) {
a3[i] = field3;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 13
// checkcast + checkstore
t1 = System.currentTimeMillis();
for (int i = 0; i < num_cc_cs; ++i) {
a1[i] = (Integer)field2;
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 14
// instanceof + checkcast + checkstore
a3[0] = (Exception)a2[0];
t1 = System.currentTimeMillis();
for (int i = 0; i < num_io_cc_cs; ++i) {
Object foo = a2[i];
if (foo instanceof Integer) {
// System.err.println("bug in type checking");
return false;
}
if (foo instanceof java.io.IOException) {
a3[i] = (Exception)foo;
}
if (foo instanceof Throwable) {
a2[i] = (Throwable)foo;
}
}
t1 = System.currentTimeMillis() - t1;
report(t1);
// TEST 15
// checkcast + nullcheck
Object x;
if (t1 > 0)
x = new Integer(5);
else if (t1 < 0)
x = new Float(6.7);
else
x = null;
if (t1 > 0 && ((Integer) x).intValue() != 5)
return false;
// TEST 16
// checkcast + if null
if (t1 > 0)
x = new Integer(5);
else if (t1 < 0)
x = new Float(6.7);
else
x = null;
Integer i = (Integer) x;
if (i == null && t1 > 0)
return false;
// TEST 17
// checkcast + if null
if (t1 > 0)
x = new Integer(5);
else if (t1 < 0)
x = new Float(6.7);
else
x = null;
i = (Integer) x;
if (i != null)
if (t1 > 0 && i.intValue() != 5)
return false;
return testSuccess;
}
static int testNum = 0;
static void report(long val) {
if (PRINT)
System.out.println(" Type Test #" + (++testNum) + "\tTime in ms: " + val);
}
static boolean PRINT = false;
}