mirror of
https://github.com/corda/corda.git
synced 2025-01-08 14:03:06 +00:00
Merge branch 'master' of oss.readytalk.com:/var/local/git/avian into powerpc
This commit is contained in:
commit
4a022147cd
45
classpath/java/lang/AssertionError.java
Normal file
45
classpath/java/lang/AssertionError.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* Copyright (c) 2008, Avian Contributors
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software
|
||||||
|
for any purpose with or without fee is hereby granted, provided
|
||||||
|
that the above copyright notice and this permission notice appear
|
||||||
|
in all copies.
|
||||||
|
|
||||||
|
There is NO WARRANTY for this software. See license.txt for
|
||||||
|
details. */
|
||||||
|
|
||||||
|
package java.lang;
|
||||||
|
|
||||||
|
public class AssertionError extends Error {
|
||||||
|
public AssertionError() {
|
||||||
|
super("", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssertionError(boolean detailMessage) {
|
||||||
|
super(""+detailMessage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssertionError(char detailMessage) {
|
||||||
|
super(""+detailMessage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssertionError(double detailMessage) {
|
||||||
|
super(""+detailMessage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssertionError(float detailMessage) {
|
||||||
|
super(""+detailMessage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssertionError(int detailMessage) {
|
||||||
|
super(""+detailMessage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssertionError(long detailMessage) {
|
||||||
|
super(""+detailMessage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssertionError(Object detailMessage) {
|
||||||
|
super(""+detailMessage, null);
|
||||||
|
}
|
||||||
|
}
|
@ -96,6 +96,8 @@ public final class Character implements Comparable<Character> {
|
|||||||
digit = c - '0';
|
digit = c - '0';
|
||||||
} else if ((c >= 'a') && (c <= 'z')) {
|
} else if ((c >= 'a') && (c <= 'z')) {
|
||||||
digit = c - 'a' + 10;
|
digit = c - 'a' + 10;
|
||||||
|
} else if ((c >= 'A') && (c <= 'Z')) {
|
||||||
|
digit = c - 'A' + 10;
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,10 @@ public abstract class Enum<E extends Enum<E>> implements Comparable<E> {
|
|||||||
return ordinal;
|
return ordinal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final String name() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
/* Copyright (c) 2008, Avian Contributors
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software
|
||||||
|
for any purpose with or without fee is hereby granted, provided
|
||||||
|
that the above copyright notice and this permission notice appear
|
||||||
|
in all copies.
|
||||||
|
|
||||||
|
There is NO WARRANTY for this software. See license.txt for
|
||||||
|
details. */
|
||||||
|
|
||||||
package java.lang;
|
package java.lang;
|
||||||
|
|
||||||
public @interface Override {
|
public @interface Override {
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
/* Copyright (c) 2008, Avian Contributors
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software
|
||||||
|
for any purpose with or without fee is hereby granted, provided
|
||||||
|
that the above copyright notice and this permission notice appear
|
||||||
|
in all copies.
|
||||||
|
|
||||||
|
There is NO WARRANTY for this software. See license.txt for
|
||||||
|
details. */
|
||||||
|
|
||||||
package java.lang;
|
package java.lang;
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ public class Method<T> extends AccessibleObject implements Member {
|
|||||||
private byte parameterFootprint;
|
private byte parameterFootprint;
|
||||||
private short flags;
|
private short flags;
|
||||||
private short offset;
|
private short offset;
|
||||||
|
private int nativeID;
|
||||||
private byte[] name;
|
private byte[] name;
|
||||||
private byte[] spec;
|
private byte[] spec;
|
||||||
private Class<T> class_;
|
private Class<T> class_;
|
||||||
|
@ -149,6 +149,16 @@ public class ByteBuffer extends Buffer implements Comparable<ByteBuffer> {
|
|||||||
return array[arrayOffset+position];
|
return array[arrayOffset+position];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getInt(int position) {
|
||||||
|
checkGet(position, 4);
|
||||||
|
|
||||||
|
int p = arrayOffset + position;
|
||||||
|
return ((array[p] & 0xFF) << 24)
|
||||||
|
| ((array[p + 1] & 0xFF) << 16)
|
||||||
|
| ((array[p + 2] & 0xFF) << 8)
|
||||||
|
| ((array[p + 3] & 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
public int getInt() {
|
public int getInt() {
|
||||||
checkGet(4);
|
checkGet(4);
|
||||||
int i = get() << 24;
|
int i = get() << 24;
|
||||||
|
@ -215,10 +215,8 @@ class MyStackWalker: public Processor::StackWalker {
|
|||||||
if (trace and trace->nativeMethod) {
|
if (trace and trace->nativeMethod) {
|
||||||
method_ = trace->nativeMethod;
|
method_ = trace->nativeMethod;
|
||||||
state = NativeMethod;
|
state = NativeMethod;
|
||||||
} else if (ip_) {
|
|
||||||
state = Next;
|
|
||||||
} else {
|
} else {
|
||||||
state = Finish;
|
state = Next;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -228,16 +226,14 @@ class MyStackWalker: public Processor::StackWalker {
|
|||||||
if (method_) {
|
if (method_) {
|
||||||
state = Method;
|
state = Method;
|
||||||
} else if (trace) {
|
} else if (trace) {
|
||||||
base = trace->base;
|
|
||||||
stack = static_cast<void**>(trace->stack);
|
stack = static_cast<void**>(trace->stack);
|
||||||
ip_ = (stack ? *static_cast<void**>(stack) : 0);
|
ip_ = (stack ? *static_cast<void**>(stack) : 0);
|
||||||
|
base = trace->base;
|
||||||
|
trace = trace->next;
|
||||||
|
|
||||||
if (trace->nativeMethod) {
|
if (trace and trace->nativeMethod) {
|
||||||
method_ = trace->nativeMethod;
|
method_ = trace->nativeMethod;
|
||||||
state = NativeMethod;
|
state = NativeMethod;
|
||||||
} else {
|
|
||||||
trace = trace->next;
|
|
||||||
state = Next;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
state = Finish;
|
state = Finish;
|
||||||
@ -266,30 +262,23 @@ class MyStackWalker: public Processor::StackWalker {
|
|||||||
stack = static_cast<void**>(base) + 1;
|
stack = static_cast<void**>(base) + 1;
|
||||||
ip_ = (stack ? *static_cast<void**>(stack) : 0);
|
ip_ = (stack ? *static_cast<void**>(stack) : 0);
|
||||||
base = *static_cast<void**>(base);
|
base = *static_cast<void**>(base);
|
||||||
state = Next;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NativeMethod:
|
case NativeMethod:
|
||||||
trace = trace->next;
|
|
||||||
state = Next;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
abort(t);
|
abort(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state = Next;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual object method() {
|
virtual object method() {
|
||||||
switch (state) {
|
// fprintf(stderr, "method %s.%s\n", &byteArrayBody
|
||||||
case Method:
|
// (t, className(t, methodClass(t, method_)), 0),
|
||||||
return method_;
|
// &byteArrayBody(t, methodName(t, method_), 0));
|
||||||
|
return method_;
|
||||||
case NativeMethod:
|
|
||||||
return trace->nativeMethod;
|
|
||||||
|
|
||||||
default:
|
|
||||||
abort(t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int ip() {
|
virtual int ip() {
|
||||||
@ -4595,7 +4584,7 @@ class MyProcessor: public Processor {
|
|||||||
{
|
{
|
||||||
return vm::makeMethod
|
return vm::makeMethod
|
||||||
(t, vmFlags, returnCode, parameterCount, parameterFootprint, flags,
|
(t, vmFlags, returnCode, parameterCount, parameterFootprint, flags,
|
||||||
offset, name, spec, class_, code,
|
offset, 0, name, spec, class_, code,
|
||||||
::defaultThunk(static_cast<MyThread*>(t)));
|
::defaultThunk(static_cast<MyThread*>(t)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5137,6 +5126,7 @@ compile(MyThread* t, object method)
|
|||||||
methodParameterFootprint(t, method),
|
methodParameterFootprint(t, method),
|
||||||
methodFlags(t, method),
|
methodFlags(t, method),
|
||||||
methodOffset(t, method),
|
methodOffset(t, method),
|
||||||
|
methodNativeID(t, method),
|
||||||
methodName(t, method),
|
methodName(t, method),
|
||||||
methodSpec(t, method),
|
methodSpec(t, method),
|
||||||
methodClass(t, method),
|
methodClass(t, method),
|
||||||
|
151
src/jnienv.cpp
151
src/jnienv.cpp
@ -34,6 +34,14 @@ DestroyJavaVM(Machine* m)
|
|||||||
Finder* f = m->finder;
|
Finder* f = m->finder;
|
||||||
Thread* t = m->rootThread;
|
Thread* t = m->rootThread;
|
||||||
|
|
||||||
|
// wait for other threads to exit
|
||||||
|
{ ACQUIRE(t, m->stateLock);
|
||||||
|
|
||||||
|
while (m->liveCount > 1) {
|
||||||
|
t->m->stateLock->wait(t->systemThread, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int exitCode = (t->exception ? -1 : 0);
|
int exitCode = (t->exception ? -1 : 0);
|
||||||
enter(t, Thread::ActiveState);
|
enter(t, Thread::ActiveState);
|
||||||
t->exit();
|
t->exit();
|
||||||
@ -272,6 +280,23 @@ findMethod(Thread* t, jclass c, const char* name, const char* spec)
|
|||||||
return vm::findMethod(t, *c, n, s);
|
return vm::findMethod(t, *c, n, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jint
|
||||||
|
methodID(Thread* t, object method)
|
||||||
|
{
|
||||||
|
if (methodNativeID(t, method) == 0) {
|
||||||
|
PROTECT(t, method);
|
||||||
|
|
||||||
|
ACQUIRE(t, t->m->referenceLock);
|
||||||
|
|
||||||
|
if (methodNativeID(t, method) == 0) {
|
||||||
|
t->m->jniMethodTable = vectorAppend(t, t->m->jniMethodTable, method);
|
||||||
|
methodNativeID(t, method) = vectorSize(t, t->m->jniMethodTable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return methodNativeID(t, method);
|
||||||
|
}
|
||||||
|
|
||||||
jmethodID JNICALL
|
jmethodID JNICALL
|
||||||
GetMethodID(Thread* t, jclass c, const char* name, const char* spec)
|
GetMethodID(Thread* t, jclass c, const char* name, const char* spec)
|
||||||
{
|
{
|
||||||
@ -280,26 +305,9 @@ GetMethodID(Thread* t, jclass c, const char* name, const char* spec)
|
|||||||
object method = findMethod(t, c, name, spec);
|
object method = findMethod(t, c, name, spec);
|
||||||
if (UNLIKELY(t->exception)) return 0;
|
if (UNLIKELY(t->exception)) return 0;
|
||||||
|
|
||||||
if (classFlags(t, *c) & ACC_INTERFACE) {
|
assert(t, (methodFlags(t, method) & ACC_STATIC) == 0);
|
||||||
PROTECT(t, method);
|
|
||||||
|
|
||||||
ACQUIRE(t, t->m->referenceLock);
|
return methodID(t, method);
|
||||||
|
|
||||||
for (unsigned i = 0; i < vectorSize(t, t->m->jniInterfaceTable); ++i) {
|
|
||||||
if (method == vectorBody(t, t->m->jniInterfaceTable, i)) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
t->m->jniInterfaceTable
|
|
||||||
= vectorAppend(t, t->m->jniInterfaceTable, method);
|
|
||||||
|
|
||||||
return (vectorSize(t, t->m->jniInterfaceTable) - 1) | InterfaceMethodID;
|
|
||||||
} else if (methodVirtual(t, method)) {
|
|
||||||
return methodOffset(t, method) + 1;
|
|
||||||
} else {
|
|
||||||
return methodOffset(t, method) | NonVirtualMethodID;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jmethodID JNICALL
|
jmethodID JNICALL
|
||||||
@ -310,29 +318,19 @@ GetStaticMethodID(Thread* t, jclass c, const char* name, const char* spec)
|
|||||||
object method = findMethod(t, c, name, spec);
|
object method = findMethod(t, c, name, spec);
|
||||||
if (UNLIKELY(t->exception)) return 0;
|
if (UNLIKELY(t->exception)) return 0;
|
||||||
|
|
||||||
return methodOffset(t, method) + 1;
|
assert(t, methodFlags(t, method) & ACC_STATIC);
|
||||||
|
|
||||||
|
return methodID(t, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline object
|
inline object
|
||||||
getMethod(Thread* t, object o, jmethodID m)
|
getMethod(Thread* t, jmethodID m)
|
||||||
{
|
{
|
||||||
if (m & InterfaceMethodID) {
|
object method = vectorBody(t, t->m->jniMethodTable, m - 1);
|
||||||
return vectorBody(t, t->m->jniInterfaceTable, m & (~InterfaceMethodID));
|
|
||||||
} else {
|
|
||||||
if (classVmFlags(t, objectClass(t, o)) & BootstrapFlag) {
|
|
||||||
PROTECT(t, o);
|
|
||||||
|
|
||||||
resolveClass(t, className(t, objectClass(t, o)));
|
assert(t, (methodFlags(t, method) & ACC_STATIC) == 0);
|
||||||
if (UNLIKELY(t->exception)) return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m & NonVirtualMethodID) {
|
return method;
|
||||||
return arrayBody(t, classMethodTable(t, objectClass(t, o)),
|
|
||||||
m & (~NonVirtualMethodID));
|
|
||||||
} else {
|
|
||||||
return arrayBody(t, classVirtualTable(t, objectClass(t, o)), m - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject JNICALL
|
jobject JNICALL
|
||||||
@ -343,7 +341,7 @@ NewObjectV(Thread* t, jclass c, jmethodID m, va_list a)
|
|||||||
object o = make(t, *c);
|
object o = make(t, *c);
|
||||||
PROTECT(t, o);
|
PROTECT(t, o);
|
||||||
|
|
||||||
t->m->processor->invokeList(t, getMethod(t, o, m), o, true, a);
|
t->m->processor->invokeList(t, getMethod(t, m), o, true, a);
|
||||||
|
|
||||||
return makeLocalReference(t, o);
|
return makeLocalReference(t, o);
|
||||||
}
|
}
|
||||||
@ -366,7 +364,7 @@ CallObjectMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
return makeLocalReference
|
return makeLocalReference
|
||||||
(t, t->m->processor->invokeList(t, method, *o, true, a));
|
(t, t->m->processor->invokeList(t, method, *o, true, a));
|
||||||
}
|
}
|
||||||
@ -389,7 +387,7 @@ CallBooleanMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? false : (intValue(t, r) != 0));
|
return (t->exception ? false : (intValue(t, r) != 0));
|
||||||
}
|
}
|
||||||
@ -412,7 +410,7 @@ CallByteMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
@ -435,7 +433,7 @@ CallCharMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
@ -458,7 +456,7 @@ CallShortMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
@ -481,7 +479,7 @@ CallIntMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
@ -504,7 +502,7 @@ CallLongMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? 0 : longValue(t, r));
|
return (t->exception ? 0 : longValue(t, r));
|
||||||
}
|
}
|
||||||
@ -527,7 +525,7 @@ CallFloatMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? 0 : bitsToFloat(intValue(t, r)));
|
return (t->exception ? 0 : bitsToFloat(intValue(t, r)));
|
||||||
}
|
}
|
||||||
@ -550,7 +548,7 @@ CallDoubleMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
object r = t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
return (t->exception ? 0 : bitsToDouble(longValue(t, r)));
|
return (t->exception ? 0 : bitsToDouble(longValue(t, r)));
|
||||||
}
|
}
|
||||||
@ -573,7 +571,7 @@ CallVoidMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object method = getMethod(t, *o, m);
|
object method = getMethod(t, m);
|
||||||
t->m->processor->invokeList(t, method, *o, true, a);
|
t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -589,25 +587,22 @@ CallVoidMethod(Thread* t, jobject o, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline object
|
inline object
|
||||||
getStaticMethod(Thread* t, object c, jmethodID m)
|
getStaticMethod(Thread* t, jmethodID m)
|
||||||
{
|
{
|
||||||
if (classVmFlags(t, c) & BootstrapFlag) {
|
object method = vectorBody(t, t->m->jniMethodTable, m - 1);
|
||||||
PROTECT(t, c);
|
|
||||||
|
|
||||||
resolveClass(t, className(t, c));
|
assert(t, methodFlags(t, method) & ACC_STATIC);
|
||||||
if (UNLIKELY(t->exception)) return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return arrayBody(t, classMethodTable(t, c), m - 1);
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject JNICALL
|
jobject JNICALL
|
||||||
CallStaticObjectMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticObjectMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
return makeLocalReference(t, t->m->processor->invokeList
|
return makeLocalReference(t, t->m->processor->invokeList
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a));
|
(t, getStaticMethod(t, m), 0, true, a));
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject JNICALL
|
jobject JNICALL
|
||||||
@ -624,12 +619,11 @@ CallStaticObjectMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jboolean JNICALL
|
jboolean JNICALL
|
||||||
CallStaticBooleanMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticBooleanMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : (intValue(t, r) != 0));
|
return (t->exception ? 0 : (intValue(t, r) != 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -647,12 +641,11 @@ CallStaticBooleanMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jbyte JNICALL
|
jbyte JNICALL
|
||||||
CallStaticByteMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticByteMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -670,12 +663,11 @@ CallStaticByteMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jchar JNICALL
|
jchar JNICALL
|
||||||
CallStaticCharMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticCharMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -693,12 +685,11 @@ CallStaticCharMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jshort JNICALL
|
jshort JNICALL
|
||||||
CallStaticShortMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticShortMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,12 +707,11 @@ CallStaticShortMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jint JNICALL
|
jint JNICALL
|
||||||
CallStaticIntMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticIntMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : intValue(t, r));
|
return (t->exception ? 0 : intValue(t, r));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -739,12 +729,11 @@ CallStaticIntMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jlong JNICALL
|
jlong JNICALL
|
||||||
CallStaticLongMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticLongMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : longValue(t, r));
|
return (t->exception ? 0 : longValue(t, r));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,12 +751,11 @@ CallStaticLongMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jfloat JNICALL
|
jfloat JNICALL
|
||||||
CallStaticFloatMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticFloatMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : bitsToFloat(intValue(t, r)));
|
return (t->exception ? 0 : bitsToFloat(intValue(t, r)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,12 +773,11 @@ CallStaticFloatMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
jdouble JNICALL
|
jdouble JNICALL
|
||||||
CallStaticDoubleMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticDoubleMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList
|
object r = t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
(t, getStaticMethod(t, *c, m), 0, true, a);
|
|
||||||
return (t->exception ? 0 : bitsToDouble(longValue(t, r)));
|
return (t->exception ? 0 : bitsToDouble(longValue(t, r)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -808,11 +795,11 @@ CallStaticDoubleMethod(Thread* t, jclass c, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JNICALL
|
void JNICALL
|
||||||
CallStaticVoidMethodV(Thread* t, jclass c, jmethodID m, va_list a)
|
CallStaticVoidMethodV(Thread* t, jclass, jmethodID m, va_list a)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
t->m->processor->invokeList(t, getStaticMethod(t, *c, m), 0, true, a);
|
t->m->processor->invokeList(t, getStaticMethod(t, m), 0, true, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JNICALL
|
void JNICALL
|
||||||
|
@ -356,15 +356,7 @@ postVisit(Thread* t, Heap::Visitor* v)
|
|||||||
Machine* m = t->m;
|
Machine* m = t->m;
|
||||||
bool major = m->heap->collectionType() == Heap::MajorCollection;
|
bool major = m->heap->collectionType() == Heap::MajorCollection;
|
||||||
|
|
||||||
for (object* p = &(m->finalizeQueue); *p; p = &(finalizerNext(t, *p))) {
|
assert(t, m->finalizeQueue == 0);
|
||||||
v->visit(p);
|
|
||||||
v->visit(&finalizerTarget(t, *p));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (object* p = &(m->finalizeQueue); *p; p = &(finalizerNext(t, *p))) {
|
|
||||||
v->visit(p);
|
|
||||||
v->visit(&finalizerTarget(t, *p));
|
|
||||||
}
|
|
||||||
|
|
||||||
object firstNewTenuredFinalizer = 0;
|
object firstNewTenuredFinalizer = 0;
|
||||||
object lastNewTenuredFinalizer = 0;
|
object lastNewTenuredFinalizer = 0;
|
||||||
@ -469,7 +461,8 @@ postVisit(Thread* t, Heap::Visitor* v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lastNewTenuredWeakReference) {
|
if (lastNewTenuredWeakReference) {
|
||||||
jreferenceVmNext(t, lastNewTenuredWeakReference) = m->tenuredWeakReferences;
|
jreferenceVmNext(t, lastNewTenuredWeakReference)
|
||||||
|
= m->tenuredWeakReferences;
|
||||||
m->tenuredWeakReferences = firstNewTenuredWeakReference;
|
m->tenuredWeakReferences = firstNewTenuredWeakReference;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1095,6 +1088,7 @@ parseMethodTable(Thread* t, Stream& s, object class_, object pool)
|
|||||||
methodParameterFootprint(t, method),
|
methodParameterFootprint(t, method),
|
||||||
methodFlags(t, method),
|
methodFlags(t, method),
|
||||||
virtualCount++,
|
virtualCount++,
|
||||||
|
0,
|
||||||
methodName(t, method),
|
methodName(t, method),
|
||||||
methodSpec(t, method),
|
methodSpec(t, method),
|
||||||
class_,
|
class_,
|
||||||
@ -1457,7 +1451,7 @@ removeMonitor(Thread* t, object o)
|
|||||||
|
|
||||||
object p = hashMapRemove(t, t->m->monitorMap, o, objectHash, objectEqual);
|
object p = hashMapRemove(t, t->m->monitorMap, o, objectHash, objectEqual);
|
||||||
|
|
||||||
assert(t, p);
|
expect(t, p);
|
||||||
|
|
||||||
if (DebugMonitors) {
|
if (DebugMonitors) {
|
||||||
fprintf(stderr, "dispose monitor %p for object %x\n",
|
fprintf(stderr, "dispose monitor %p for object %x\n",
|
||||||
@ -1545,7 +1539,7 @@ class HeapClient: public Heap::Client {
|
|||||||
v->visit(&(m->monitorMap));
|
v->visit(&(m->monitorMap));
|
||||||
v->visit(&(m->stringMap));
|
v->visit(&(m->stringMap));
|
||||||
v->visit(&(m->types));
|
v->visit(&(m->types));
|
||||||
v->visit(&(m->jniInterfaceTable));
|
v->visit(&(m->jniMethodTable));
|
||||||
|
|
||||||
for (Reference* r = m->jniReferences; r; r = r->next) {
|
for (Reference* r = m->jniReferences; r; r = r->next) {
|
||||||
v->visit(&(r->target));
|
v->visit(&(r->target));
|
||||||
@ -1665,7 +1659,7 @@ Machine::Machine(System* system, Heap* heap, Finder* finder,
|
|||||||
monitorMap(0),
|
monitorMap(0),
|
||||||
stringMap(0),
|
stringMap(0),
|
||||||
types(0),
|
types(0),
|
||||||
jniInterfaceTable(0),
|
jniMethodTable(0),
|
||||||
finalizers(0),
|
finalizers(0),
|
||||||
tenuredFinalizers(0),
|
tenuredFinalizers(0),
|
||||||
finalizeQueue(0),
|
finalizeQueue(0),
|
||||||
@ -1826,14 +1820,14 @@ Thread::init()
|
|||||||
m->monitorMap = makeWeakHashMap(this, 0, 0);
|
m->monitorMap = makeWeakHashMap(this, 0, 0);
|
||||||
m->stringMap = makeWeakHashMap(this, 0, 0);
|
m->stringMap = makeWeakHashMap(this, 0, 0);
|
||||||
|
|
||||||
m->jniInterfaceTable = makeVector(this, 0, 0, false);
|
m->jniMethodTable = makeVector(this, 0, 0, false);
|
||||||
|
|
||||||
m->localThread->set(this);
|
m->localThread->set(this);
|
||||||
|
|
||||||
{ object bootCode = makeCode(t, 0, 0, 0, 0, 0, 1, false);
|
{ object bootCode = makeCode(t, 0, 0, 0, 0, 0, 1, false);
|
||||||
codeBody(t, bootCode, 0) = impdep1;
|
codeBody(t, bootCode, 0) = impdep1;
|
||||||
object bootMethod = makeMethod
|
object bootMethod = makeMethod
|
||||||
(t, 0, 0, 0, 0, 0, 0, 0, 0, 0, bootCode, 0);
|
(t, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, bootCode, 0);
|
||||||
PROTECT(t, bootMethod);
|
PROTECT(t, bootMethod);
|
||||||
|
|
||||||
#include "type-java-initializations.cpp"
|
#include "type-java-initializations.cpp"
|
||||||
|
@ -1174,7 +1174,7 @@ class Machine {
|
|||||||
object monitorMap;
|
object monitorMap;
|
||||||
object stringMap;
|
object stringMap;
|
||||||
object types;
|
object types;
|
||||||
object jniInterfaceTable;
|
object jniMethodTable;
|
||||||
object finalizers;
|
object finalizers;
|
||||||
object tenuredFinalizers;
|
object tenuredFinalizers;
|
||||||
object finalizeQueue;
|
object finalizeQueue;
|
||||||
|
14
src/util.cpp
14
src/util.cpp
@ -340,9 +340,9 @@ void
|
|||||||
hashMapInsert(Thread* t, object map, object key, object value,
|
hashMapInsert(Thread* t, object map, object key, object value,
|
||||||
uint32_t (*hash)(Thread*, object))
|
uint32_t (*hash)(Thread*, object))
|
||||||
{
|
{
|
||||||
// note that we reinitialize the array and index variables whenever
|
// note that we reinitialize the array variable whenever an
|
||||||
// an allocation (and thus possibly a collection) occurs, in case
|
// allocation (and thus possibly a collection) occurs, in case the
|
||||||
// the array changes due to a table resize.
|
// array changes due to a table resize.
|
||||||
|
|
||||||
PROTECT(t, map);
|
PROTECT(t, map);
|
||||||
|
|
||||||
@ -378,13 +378,13 @@ hashMapInsert(Thread* t, object map, object key, object value,
|
|||||||
array = hashMapArray(t, map);
|
array = hashMapArray(t, map);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned index = h & (arrayLength(t, array) - 1);
|
object n = makeTriple(t, k, value, 0);
|
||||||
|
|
||||||
object n = makeTriple(t, k, value, arrayBody(t, array, index));
|
|
||||||
|
|
||||||
array = hashMapArray(t, map);
|
array = hashMapArray(t, map);
|
||||||
index = h & (arrayLength(t, array) - 1);
|
|
||||||
|
|
||||||
|
unsigned index = h & (arrayLength(t, array) - 1);
|
||||||
|
|
||||||
|
set(t, n, TripleThird, arrayBody(t, array, index));
|
||||||
set(t, array, ArrayBody + (index * BytesPerWord), n);
|
set(t, array, ArrayBody + (index * BytesPerWord), n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
src/x86.cpp
13
src/x86.cpp
@ -1694,6 +1694,18 @@ compareRM(Context* c, unsigned size, Assembler::Register* a,
|
|||||||
encode(c, 0x39, a->low, b, true);
|
encode(c, 0x39, a->low, b, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
compareAM(Context* c, unsigned size, Assembler::Address* a,
|
||||||
|
Assembler::Memory* b)
|
||||||
|
{
|
||||||
|
assert(c, BytesPerWord == 8 or size == 4);
|
||||||
|
|
||||||
|
Assembler::Register tmp(c->client->acquireTemporary());
|
||||||
|
moveAR(c, size, a, &tmp);
|
||||||
|
compareRM(c, size, &tmp, b);
|
||||||
|
c->client->releaseTemporary(tmp.low);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
compareMR(Context* c, unsigned size, Assembler::Memory* a,
|
compareMR(Context* c, unsigned size, Assembler::Memory* a,
|
||||||
Assembler::Register* b)
|
Assembler::Register* b)
|
||||||
@ -1984,6 +1996,7 @@ populateTables()
|
|||||||
BinaryOperations[INDEX2(Compare, Register, Constant)] = CAST2(compareRC);
|
BinaryOperations[INDEX2(Compare, Register, Constant)] = CAST2(compareRC);
|
||||||
BinaryOperations[INDEX2(Compare, Register, Register)] = CAST2(compareRR);
|
BinaryOperations[INDEX2(Compare, Register, Register)] = CAST2(compareRR);
|
||||||
BinaryOperations[INDEX2(Compare, Address, Register)] = CAST2(compareAR);
|
BinaryOperations[INDEX2(Compare, Address, Register)] = CAST2(compareAR);
|
||||||
|
BinaryOperations[INDEX2(Compare, Address, Memory)] = CAST2(compareAM);
|
||||||
BinaryOperations[INDEX2(Compare, Register, Memory)] = CAST2(compareRM);
|
BinaryOperations[INDEX2(Compare, Register, Memory)] = CAST2(compareRM);
|
||||||
BinaryOperations[INDEX2(Compare, Memory, Register)] = CAST2(compareMR);
|
BinaryOperations[INDEX2(Compare, Memory, Register)] = CAST2(compareMR);
|
||||||
BinaryOperations[INDEX2(Compare, Constant, Memory)] = CAST2(compareCM);
|
BinaryOperations[INDEX2(Compare, Constant, Memory)] = CAST2(compareCM);
|
||||||
|
Loading…
Reference in New Issue
Block a user