mirror of
https://github.com/corda/corda.git
synced 2025-01-07 13:38:47 +00:00
b5308c4866
Previously, the following code would throw an IllegalMonitorStateException: public class Test { public static synchronized void main(String[] args) { Test.class.notify(); } } The problem stems from the fact that for a long time Avian has had two representations of a given class: avian.VMClass and java.lang.Class. It used to be that there was only one, java.lang.Class, but that didn't play nicely with OpenJDK's class library, so we split it into two. Unfortunately, we forgot to update the JIT and interpreter accordingly, so a static synchronized method would acquire the avian.VMClass instance, whereas Foo.class.notify() would be invoked on the java.lang.Class instance. This commit fixes it.
367 lines
8.2 KiB
Java
367 lines
8.2 KiB
Java
import java.io.IOException;
|
|
import java.net.URL;
|
|
import java.util.Enumeration;
|
|
|
|
public class Misc {
|
|
private static class μClass {
|
|
public int μField;
|
|
|
|
public void μMethod(int i) {
|
|
μField = i;
|
|
}
|
|
}
|
|
|
|
private interface Bar {
|
|
public int baz();
|
|
}
|
|
|
|
private static abstract class Bim implements Bar { }
|
|
|
|
private static class Baz extends Bim {
|
|
public int baz() {
|
|
return 42;
|
|
}
|
|
}
|
|
|
|
private static class Static {
|
|
static {
|
|
staticRan = true;
|
|
}
|
|
|
|
public static void run() { }
|
|
}
|
|
|
|
private static boolean staticRan;
|
|
|
|
private static int alpha;
|
|
private static int beta;
|
|
private static byte byte1, byte2, byte3;
|
|
|
|
private static volatile int volatileStatic;
|
|
|
|
private static volatile long volatileStaticLong;
|
|
|
|
private final int NonStaticConstant = 42;
|
|
|
|
private int gamma;
|
|
private int pajama;
|
|
private boolean boolean1;
|
|
private boolean boolean2;
|
|
private long time;
|
|
private volatile int volatileMember;
|
|
|
|
public Misc() {
|
|
expect(! boolean1);
|
|
expect(! boolean2);
|
|
|
|
time = 0xffffffffffffffffL;
|
|
|
|
expect(! boolean1);
|
|
expect(! boolean2);
|
|
}
|
|
|
|
private String foo(String s) {
|
|
return s;
|
|
}
|
|
|
|
public String bar(String s) {
|
|
return s;
|
|
}
|
|
|
|
private static String baz(String s) {
|
|
return s;
|
|
}
|
|
|
|
private static void expect(boolean v) {
|
|
if (! v) throw new RuntimeException();
|
|
}
|
|
|
|
private synchronized byte sync() {
|
|
byte[] array = new byte[123];
|
|
return array[42];
|
|
}
|
|
|
|
private static synchronized byte syncStatic(boolean throw_) {
|
|
byte[] array = new byte[123];
|
|
if (throw_) {
|
|
throw new RuntimeException();
|
|
} else {
|
|
return array[42];
|
|
}
|
|
}
|
|
|
|
public String toString() {
|
|
return super.toString();
|
|
}
|
|
|
|
private static int zap() {
|
|
return 42;
|
|
}
|
|
|
|
private static int zip() {
|
|
return 5 + zap();
|
|
}
|
|
|
|
private static int zup() {
|
|
return zap() + 5;
|
|
}
|
|
|
|
private static class Foo {
|
|
public int a;
|
|
public int b;
|
|
public int c;
|
|
public int[] array;
|
|
}
|
|
|
|
private static int bar(int a, int b, int c) {
|
|
return a + b + c;
|
|
}
|
|
|
|
private static Object gimmeNull() {
|
|
return null;
|
|
}
|
|
|
|
private static Object queryDefault(Object default_) {
|
|
Object o = gimmeNull();
|
|
return (o == null ? default_ : o);
|
|
}
|
|
|
|
private static class Zam {
|
|
public void bim() { }
|
|
}
|
|
|
|
private static class Zim {
|
|
public Object zum() {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static Zim zim = new Zim();
|
|
|
|
private static void zam() {
|
|
Zam z;
|
|
while ((z = (Zam) zim.zum()) != null) {
|
|
z.bim();
|
|
}
|
|
}
|
|
|
|
private static synchronized void testStaticNotify() {
|
|
Misc.class.notify();
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
zam();
|
|
|
|
Bim bim = new Baz();
|
|
expect(bim.baz() == 42);
|
|
|
|
expect(queryDefault(new Object()) != null);
|
|
|
|
{ Foo foo = new Foo();
|
|
int x = foo.a + foo.b + foo.c;
|
|
bar(foo.a, foo.b, foo.c);
|
|
}
|
|
|
|
byte2 = 0;
|
|
expect(byte2 == 0);
|
|
|
|
boolean v = Boolean.valueOf("true");
|
|
|
|
ClassLoader.getSystemClassLoader().toString();
|
|
|
|
testStaticNotify();
|
|
|
|
{ Misc m = new Misc();
|
|
m.toString();
|
|
|
|
expect(m.NonStaticConstant == 42);
|
|
|
|
expect(m.time == 0xffffffffffffffffL);
|
|
long t = m.time;
|
|
expect(t == 0xffffffffffffffffL);
|
|
|
|
String s = "hello";
|
|
m.foo(s);
|
|
m.bar(s);
|
|
baz(s);
|
|
|
|
m.sync();
|
|
syncStatic(false);
|
|
try {
|
|
syncStatic(true);
|
|
} catch (RuntimeException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
int d = alpha;
|
|
beta = 42;
|
|
alpha = 43;
|
|
volatileStatic = 55;
|
|
volatileStaticLong = 9L;
|
|
int e = beta;
|
|
int f = alpha;
|
|
m.volatileMember = 23;
|
|
m.gamma = 44;
|
|
m.volatileMember = 27;
|
|
|
|
expect(beta == 42);
|
|
expect(alpha == 43);
|
|
expect(m.gamma == 44);
|
|
expect(volatileStatic == 55);
|
|
expect(volatileStaticLong == 9L);
|
|
expect(m.volatileMember == 27);
|
|
}
|
|
|
|
expect(zip() == 47);
|
|
expect(zup() == 47);
|
|
|
|
{
|
|
Object a = new Object();
|
|
Object b = new Object();
|
|
expect(a != b);
|
|
|
|
Object c = a;
|
|
Object d = b;
|
|
expect(c != d);
|
|
|
|
c = (c == a) ? b : a;
|
|
d = (d == a) ? b : a;
|
|
|
|
expect(c != d);
|
|
}
|
|
|
|
{ Foo foo = new Foo();
|
|
foo.array = new int[3];
|
|
foo.a = (foo.a + 1) % foo.array.length;
|
|
}
|
|
|
|
{ boolean foo = false;
|
|
boolean iconic = false;
|
|
do {
|
|
zap();
|
|
iconic = foo ? true : false;
|
|
} while (foo);
|
|
zap();
|
|
}
|
|
|
|
{ int x = 0;
|
|
if (x == 0) {
|
|
x = 1;
|
|
do {
|
|
int y = x;
|
|
x = 1;
|
|
} while (x != 1);
|
|
}
|
|
}
|
|
|
|
System.out.println(new java.util.Date().toString());
|
|
|
|
System.out.println('x');
|
|
System.out.println(true);
|
|
System.out.println(42);
|
|
System.out.println(123456789012345L);
|
|
System.out.println(75.62);
|
|
System.out.println(75.62d);
|
|
System.out.println(new char[] { 'h', 'i' });
|
|
|
|
expect(! (((Object) new int[0]) instanceof Object[]));
|
|
|
|
{ μClass μInstance = new μClass();
|
|
μInstance.μMethod(8933);
|
|
expect(μInstance.μField == 8933);
|
|
}
|
|
|
|
expect(new int[0] instanceof Cloneable);
|
|
expect(new int[0] instanceof java.io.Serializable);
|
|
|
|
expect(new Object[0] instanceof Cloneable);
|
|
expect(new Object[0] instanceof java.io.Serializable);
|
|
|
|
expect((Baz.class.getModifiers() & java.lang.reflect.Modifier.STATIC)
|
|
!= 0);
|
|
|
|
expect((Protected.class.getModifiers() & java.lang.reflect.Modifier.PUBLIC)
|
|
== 0);
|
|
|
|
try {
|
|
int count = 0;
|
|
boolean test = false, extraDir = false;
|
|
ClassLoader loader = Misc.class.getClassLoader();
|
|
Enumeration<URL> resources = loader.getResources("multi-classpath-test.txt");
|
|
while (resources.hasMoreElements()) {
|
|
++count;
|
|
String url = resources.nextElement().toString();
|
|
if (url.contains("extra-dir")) {
|
|
extraDir = true;
|
|
} else if (url.contains("test")) {
|
|
test = true;
|
|
}
|
|
}
|
|
// This test is only relevant if multi-classpath-test.txt
|
|
// actually exists in somewhere under the classpath from which
|
|
// Misc.class was loaded. Since we run this test from an
|
|
// AOT-compiled boot image as well as straight from the
|
|
// filesystem, and the boot image does not contain
|
|
// multi-classpath-test.txt, we'll skip the test if it's not
|
|
// present.
|
|
if (count != 0) {
|
|
expect(count == 2);
|
|
expect(test);
|
|
expect(extraDir);
|
|
}
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
// as of this writing, we don't support URLs on Android, since it
|
|
// pulls in a third-party library we don't include:
|
|
if (! "http://www.android.com/".equals
|
|
(System.getProperty("java.vendor.url")))
|
|
{
|
|
expect(new URL("http://oss.readytalk.com")
|
|
.getHost().equals("oss.readytalk.com"));
|
|
}
|
|
|
|
expect(java.util.Arrays.equals
|
|
(new byte[] { 0, 0, 0, 0 },
|
|
java.net.InetAddress.getByName("0.0.0.0").getAddress()));
|
|
|
|
expect(! staticRan);
|
|
Static.run();
|
|
expect(staticRan);
|
|
|
|
expect(System.getProperty("java.class.path").equals
|
|
(System.getProperties().getProperty("java.class.path")));
|
|
|
|
expect(System.getProperty("path.separator").equals
|
|
(System.getProperties().getProperty("path.separator")));
|
|
|
|
expect(System.getProperty("user.dir").equals
|
|
(System.getProperties().getProperty("user.dir")));
|
|
|
|
expect(System.getProperty("java.io.tmpdir").equals
|
|
(System.getProperties().getProperty("java.io.tmpdir")));
|
|
|
|
System.setProperty("buzzy.buzzy.bim.bam", "dippy dopey flim flam");
|
|
|
|
expect(System.getProperty("buzzy.buzzy.bim.bam").equals
|
|
(System.getProperties().getProperty("buzzy.buzzy.bim.bam")));
|
|
|
|
expect(System.getProperty("buzzy.buzzy.bim.bam").equals
|
|
("dippy dopey flim flam"));
|
|
|
|
System.getProperties().put("buzzy.buzzy.bim.bam", "yippy yappy yin yang");
|
|
|
|
expect(System.getProperty("buzzy.buzzy.bim.bam").equals
|
|
(System.getProperties().getProperty("buzzy.buzzy.bim.bam")));
|
|
|
|
expect(System.getProperty("buzzy.buzzy.bim.bam").equals
|
|
("yippy yappy yin yang"));
|
|
|
|
// just test that it's there; don't care what it returns:
|
|
Runtime.getRuntime().totalMemory();
|
|
}
|
|
|
|
protected class Protected { }
|
|
}
|