mirror of
https://github.com/corda/corda.git
synced 2025-01-03 19:54:13 +00:00
fix crash when calling Class.getDeclaredMethods using the OpenJDK class library
This method ends up defering to JVM_GetClassDeclaredMethods, which creates an array of java.lang.reflect.Method instances and then calling getName on each one through the java.lang.reflect.Member interface. However, Method is a "bootstrap" class, meaning the VM has built-in knowledge of it and includes a tentative version built-in but must load the real version from the classpath at runtime before invoking methods on it. Normally this happens naturally when Method instances are created in Java code, but here we're creating them in the VM instead, which doesn't automatically cause the real class to be loaded. So we must do so explicitly.
This commit is contained in:
parent
5def0e4658
commit
afbd4ff303
@ -2452,10 +2452,19 @@ object makeJconstructor(Thread* t,
|
||||
}
|
||||
#endif // HAVE_JexecutableHasRealParameterData
|
||||
|
||||
void resolveBootstrap(Thread* t, Gc::Type type)
|
||||
{
|
||||
if (vm::type(t, type)->vmFlags() & BootstrapFlag) {
|
||||
resolveSystemClass(t, roots(t)->bootLoader(), vm::type(t, type)->name());
|
||||
}
|
||||
}
|
||||
|
||||
object makeJmethod(Thread* t, GcMethod* vmMethod, int index)
|
||||
{
|
||||
PROTECT(t, vmMethod);
|
||||
|
||||
resolveBootstrap(t, GcJmethod::Type);
|
||||
|
||||
object name
|
||||
= intern(t,
|
||||
t->m->classpath->makeString(
|
||||
@ -2558,6 +2567,8 @@ object makeJconstructor(Thread* t, GcMethod* vmMethod, int index)
|
||||
{
|
||||
PROTECT(t, vmMethod);
|
||||
|
||||
resolveBootstrap(t, GcJconstructor::Type);
|
||||
|
||||
unsigned parameterCount;
|
||||
unsigned returnTypeSpec;
|
||||
object parameterTypes = resolveParameterJTypes(t,
|
||||
@ -2638,6 +2649,8 @@ object makeJfield(Thread* t, GcField* vmField, int index)
|
||||
{
|
||||
PROTECT(t, vmField);
|
||||
|
||||
resolveBootstrap(t, GcJfield::Type);
|
||||
|
||||
object name
|
||||
= intern(t,
|
||||
t->m->classpath->makeString(
|
||||
|
@ -135,6 +135,9 @@ public class UnsafeTest {
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println("method count is "
|
||||
+ Unsafe.class.getDeclaredMethods().length);
|
||||
|
||||
Unsafe u = avian.Machine.getUnsafe();
|
||||
|
||||
unsafeCatch(u);
|
||||
|
Loading…
Reference in New Issue
Block a user