mirror of
https://github.com/corda/corda.git
synced 2025-01-23 21:08:48 +00:00
Merge branch 'master' of oss:/var/local/git/avian into dynamic
This commit is contained in:
commit
1c49b3bc1b
@ -70,7 +70,8 @@ class MyThread: public Thread {
|
|||||||
base(0),
|
base(0),
|
||||||
stack(0),
|
stack(0),
|
||||||
trace(0),
|
trace(0),
|
||||||
reference(0)
|
reference(0),
|
||||||
|
methodInvoked(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void* ip;
|
void* ip;
|
||||||
@ -78,6 +79,7 @@ class MyThread: public Thread {
|
|||||||
void* stack;
|
void* stack;
|
||||||
CallTrace* trace;
|
CallTrace* trace;
|
||||||
Reference* reference;
|
Reference* reference;
|
||||||
|
object methodInvoked;
|
||||||
};
|
};
|
||||||
|
|
||||||
object
|
object
|
||||||
@ -4087,10 +4089,17 @@ uint64_t FORCE_ALIGN
|
|||||||
invokeNative(MyThread* t)
|
invokeNative(MyThread* t)
|
||||||
{
|
{
|
||||||
object node = findTraceNode(t, *static_cast<void**>(t->stack));
|
object node = findTraceNode(t, *static_cast<void**>(t->stack));
|
||||||
object target = traceNodeTarget(t, node);
|
object target;
|
||||||
|
if (node) {
|
||||||
|
target = traceNodeTarget(t, node);
|
||||||
if (traceNodeVirtualCall(t, node)) {
|
if (traceNodeVirtualCall(t, node)) {
|
||||||
target = resolveTarget(t, t->stack, target);
|
target = resolveTarget(t, t->stack, target);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
target = t->methodInvoked;
|
||||||
|
t->methodInvoked = 0;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t result = 0;
|
uint64_t result = 0;
|
||||||
|
|
||||||
if (LIKELY(t->exception == 0)) {
|
if (LIKELY(t->exception == 0)) {
|
||||||
@ -4339,6 +4348,10 @@ invoke(Thread* thread, object method, ArgumentList* arguments)
|
|||||||
unsigned returnCode = methodReturnCode(t, method);
|
unsigned returnCode = methodReturnCode(t, method);
|
||||||
unsigned returnType = fieldType(t, returnCode);
|
unsigned returnType = fieldType(t, returnCode);
|
||||||
|
|
||||||
|
if (methodFlags(t, method) & ACC_NATIVE) {
|
||||||
|
t->methodInvoked = method;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t result;
|
uint64_t result;
|
||||||
|
|
||||||
{ MyThread::CallTrace trace(t);
|
{ MyThread::CallTrace trace(t);
|
||||||
@ -4348,6 +4361,8 @@ invoke(Thread* thread, object method, ArgumentList* arguments)
|
|||||||
arguments->position, returnType);
|
arguments->position, returnType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(t, t->methodInvoked == 0);
|
||||||
|
|
||||||
object r;
|
object r;
|
||||||
switch (returnCode) {
|
switch (returnCode) {
|
||||||
case ByteField:
|
case ByteField:
|
||||||
@ -4528,6 +4543,8 @@ class MyProcessor: public Processor {
|
|||||||
v->visit(&addressTable);
|
v->visit(&addressTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v->visit(&(t->methodInvoked));
|
||||||
|
|
||||||
for (Reference* r = t->reference; r; r = r->next) {
|
for (Reference* r = t->reference; r; r = r->next) {
|
||||||
v->visit(&(r->target));
|
v->visit(&(r->target));
|
||||||
}
|
}
|
||||||
@ -4577,6 +4594,8 @@ class MyProcessor: public Processor {
|
|||||||
virtual object
|
virtual object
|
||||||
invokeArray(Thread* t, object method, object this_, object arguments)
|
invokeArray(Thread* t, object method, object this_, object arguments)
|
||||||
{
|
{
|
||||||
|
if (UNLIKELY(t->exception)) return 0;
|
||||||
|
|
||||||
assert(t, t->state == Thread::ActiveState
|
assert(t, t->state == Thread::ActiveState
|
||||||
or t->state == Thread::ExclusiveState);
|
or t->state == Thread::ExclusiveState);
|
||||||
|
|
||||||
@ -4605,6 +4624,8 @@ class MyProcessor: public Processor {
|
|||||||
invokeList(Thread* t, object method, object this_, bool indirectObjects,
|
invokeList(Thread* t, object method, object this_, bool indirectObjects,
|
||||||
va_list arguments)
|
va_list arguments)
|
||||||
{
|
{
|
||||||
|
if (UNLIKELY(t->exception)) return 0;
|
||||||
|
|
||||||
assert(t, t->state == Thread::ActiveState
|
assert(t, t->state == Thread::ActiveState
|
||||||
or t->state == Thread::ExclusiveState);
|
or t->state == Thread::ExclusiveState);
|
||||||
|
|
||||||
@ -4634,6 +4655,8 @@ class MyProcessor: public Processor {
|
|||||||
invokeList(Thread* t, const char* className, const char* methodName,
|
invokeList(Thread* t, const char* className, const char* methodName,
|
||||||
const char* methodSpec, object this_, va_list arguments)
|
const char* methodSpec, object this_, va_list arguments)
|
||||||
{
|
{
|
||||||
|
if (UNLIKELY(t->exception)) return 0;
|
||||||
|
|
||||||
assert(t, t->state == Thread::ActiveState
|
assert(t, t->state == Thread::ActiveState
|
||||||
or t->state == Thread::ExclusiveState);
|
or t->state == Thread::ExclusiveState);
|
||||||
|
|
||||||
|
@ -287,12 +287,21 @@ getMethod(Thread* t, object o, jmethodID m)
|
|||||||
{
|
{
|
||||||
if (m & InterfaceMethodID) {
|
if (m & InterfaceMethodID) {
|
||||||
return vectorBody(t, t->m->jniInterfaceTable, m & (~InterfaceMethodID));
|
return vectorBody(t, t->m->jniInterfaceTable, m & (~InterfaceMethodID));
|
||||||
} else if (m & NonVirtualMethodID) {
|
} else {
|
||||||
|
if (classVmFlags(t, objectClass(t, o)) & BootstrapFlag) {
|
||||||
|
PROTECT(t, o);
|
||||||
|
|
||||||
|
resolveClass(t, className(t, objectClass(t, o)));
|
||||||
|
if (UNLIKELY(t->exception)) return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & NonVirtualMethodID) {
|
||||||
return arrayBody(t, classMethodTable(t, objectClass(t, o)),
|
return arrayBody(t, classMethodTable(t, objectClass(t, o)),
|
||||||
m & (~NonVirtualMethodID));
|
m & (~NonVirtualMethodID));
|
||||||
} else {
|
} else {
|
||||||
return arrayBody(t, classVirtualTable(t, objectClass(t, o)), m - 1);
|
return arrayBody(t, classVirtualTable(t, objectClass(t, o)), m - 1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject JNICALL
|
jobject JNICALL
|
||||||
@ -326,8 +335,9 @@ CallObjectMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
return makeLocalReference(t, t->m->processor->invokeList
|
object method = getMethod(t, *o, m);
|
||||||
(t, getMethod(t, *o, m), *o, true, a));
|
return makeLocalReference
|
||||||
|
(t, t->m->processor->invokeList(t, method, *o, true, a));
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject JNICALL
|
jobject JNICALL
|
||||||
@ -348,7 +358,8 @@ CallBooleanMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +381,8 @@ CallByteMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,7 +404,8 @@ CallCharMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,7 +427,8 @@ CallShortMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,7 +450,8 @@ CallIntMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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 +473,8 @@ CallLongMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,7 +496,8 @@ CallFloatMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,7 +519,8 @@ CallDoubleMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
object r = t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -524,7 +542,8 @@ CallVoidMethodV(Thread* t, jobject o, jmethodID m, va_list a)
|
|||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
t->m->processor->invokeList(t, getMethod(t, *o, m), *o, true, a);
|
object method = getMethod(t, *o, m);
|
||||||
|
t->m->processor->invokeList(t, method, *o, true, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JNICALL
|
void JNICALL
|
||||||
@ -539,9 +558,16 @@ CallVoidMethod(Thread* t, jobject o, jmethodID m, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline object
|
inline object
|
||||||
getStaticMethod(Thread* t, object class_, jmethodID m)
|
getStaticMethod(Thread* t, object c, jmethodID m)
|
||||||
{
|
{
|
||||||
return arrayBody(t, classMethodTable(t, class_), m - 1);
|
if (classVmFlags(t, c) & BootstrapFlag) {
|
||||||
|
PROTECT(t, c);
|
||||||
|
|
||||||
|
resolveClass(t, className(t, c));
|
||||||
|
if (UNLIKELY(t->exception)) return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return arrayBody(t, classMethodTable(t, c), m - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject JNICALL
|
jobject JNICALL
|
||||||
|
@ -861,7 +861,7 @@ parseFieldTable(Thread* t, Stream& s, object class_, object pool)
|
|||||||
|
|
||||||
if (flags & ACC_STATIC) {
|
if (flags & ACC_STATIC) {
|
||||||
unsigned size = fieldSize(t, code);
|
unsigned size = fieldSize(t, code);
|
||||||
unsigned excess = staticOffset % size;
|
unsigned excess = (staticOffset % size) % BytesPerWord;
|
||||||
if (excess) {
|
if (excess) {
|
||||||
staticOffset += BytesPerWord - excess;
|
staticOffset += BytesPerWord - excess;
|
||||||
}
|
}
|
||||||
@ -878,7 +878,7 @@ parseFieldTable(Thread* t, Stream& s, object class_, object pool)
|
|||||||
abort(t); // todo: handle non-static field initializers
|
abort(t); // todo: handle non-static field initializers
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned excess = memberOffset % fieldSize(t, code);
|
unsigned excess = (memberOffset % fieldSize(t, code)) % BytesPerWord;
|
||||||
if (excess) {
|
if (excess) {
|
||||||
memberOffset += BytesPerWord - excess;
|
memberOffset += BytesPerWord - excess;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,22 @@ public class Misc {
|
|||||||
private static int alpha;
|
private static int alpha;
|
||||||
private static int beta;
|
private static int beta;
|
||||||
private static byte byte1, byte2, byte3;
|
private static byte byte1, byte2, byte3;
|
||||||
|
|
||||||
private int gamma;
|
private int gamma;
|
||||||
|
private int pajama;
|
||||||
|
private boolean boolean1;
|
||||||
|
private boolean boolean2;
|
||||||
|
private long time;
|
||||||
|
|
||||||
|
public Misc() {
|
||||||
|
expect(! boolean1);
|
||||||
|
expect(! boolean2);
|
||||||
|
|
||||||
|
time = 0xffffffffffffffffL;
|
||||||
|
|
||||||
|
expect(! boolean1);
|
||||||
|
expect(! boolean2);
|
||||||
|
}
|
||||||
|
|
||||||
private String foo(String s) {
|
private String foo(String s) {
|
||||||
return s;
|
return s;
|
||||||
|
Loading…
Reference in New Issue
Block a user