mirror of
https://github.com/corda/corda.git
synced 2025-01-05 20:54:13 +00:00
add new array classes to classloader map upon creation
We were already doing this for non-array classes; we need to do it for all classes or else risk creating duplicates.
This commit is contained in:
parent
cca9a5ee0b
commit
4b1b3e032b
@ -3255,14 +3255,13 @@ resolveClass(Thread* t, object loader, object spec, bool throw_)
|
|||||||
PROTECT(t, loader);
|
PROTECT(t, loader);
|
||||||
PROTECT(t, spec);
|
PROTECT(t, spec);
|
||||||
|
|
||||||
{ object c = findLoadedClass(t, loader, spec);
|
object c = findLoadedClass(t, loader, spec);
|
||||||
if (c) {
|
if (c) {
|
||||||
return c;
|
return c;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (byteArrayBody(t, spec, 0) == '[') {
|
if (byteArrayBody(t, spec, 0) == '[') {
|
||||||
return resolveArrayClass(t, loader, spec, throw_);
|
c = resolveArrayClass(t, loader, spec, throw_);
|
||||||
} else {
|
} else {
|
||||||
if (root(t, Machine::LoadClassMethod) == 0) {
|
if (root(t, Machine::LoadClassMethod) == 0) {
|
||||||
object m = resolveMethod
|
object m = resolveMethod
|
||||||
@ -3295,34 +3294,35 @@ resolveClass(Thread* t, object loader, object spec, bool throw_)
|
|||||||
|
|
||||||
object specString = makeString(t, "%s", RUNTIME_ARRAY_BODY(s));
|
object specString = makeString(t, "%s", RUNTIME_ARRAY_BODY(s));
|
||||||
|
|
||||||
object c = t->m->processor->invoke(t, method, loader, specString);
|
object jc = t->m->processor->invoke(t, method, loader, specString);
|
||||||
|
if (LIKELY(jc and t->exception == 0)) {
|
||||||
if (LIKELY(c and t->exception == 0)) {
|
c = jclassVmClass(t, jc);
|
||||||
PROTECT(t, c);
|
|
||||||
|
|
||||||
ACQUIRE(t, t->m->classLock);
|
|
||||||
|
|
||||||
if (classLoaderMap(t, loader) == 0) {
|
|
||||||
object map = makeHashMap(t, 0, 0);
|
|
||||||
set(t, loader, ClassLoaderMap, map);
|
|
||||||
}
|
|
||||||
|
|
||||||
c = jclassVmClass(t, c);
|
|
||||||
|
|
||||||
hashMapInsert
|
|
||||||
(t, classLoaderMap(t, loader), spec, c, byteArrayHash);
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LIKELY(c and t->exception == 0)) {
|
||||||
|
PROTECT(t, c);
|
||||||
|
|
||||||
|
ACQUIRE(t, t->m->classLock);
|
||||||
|
|
||||||
|
if (classLoaderMap(t, loader) == 0) {
|
||||||
|
object map = makeHashMap(t, 0, 0);
|
||||||
|
set(t, loader, ClassLoaderMap, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
hashMapInsert
|
||||||
|
(t, classLoaderMap(t, loader), spec, c, byteArrayHash);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
} else {
|
||||||
if (t->exception == 0) {
|
if (t->exception == 0) {
|
||||||
object message = makeString(t, "%s", &byteArrayBody(t, spec, 0));
|
object message = makeString(t, "%s", &byteArrayBody(t, spec, 0));
|
||||||
t->exception = t->m->classpath->makeThrowable
|
t->exception = t->m->classpath->makeThrowable
|
||||||
(t, Machine::ClassNotFoundExceptionType, message);
|
(t, Machine::ClassNotFoundExceptionType, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3883,6 +3883,8 @@ printTrace(Thread* t, object exception)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
object
|
object
|
||||||
@ -4087,6 +4089,8 @@ vmPrintTrace(Thread* t)
|
|||||||
fprintf(stderr, "debug trace for thread %p\n", t);
|
fprintf(stderr, "debug trace for thread %p\n", t);
|
||||||
|
|
||||||
t->m->processor->walkStack(t, &v);
|
t->m->processor->walkStack(t, &v);
|
||||||
|
|
||||||
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// also for debugging
|
// also for debugging
|
||||||
|
Loading…
Reference in New Issue
Block a user