PR149: Used wrong class loader.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 29 Aug 2011 18:32:30 +0000 (20:32 +0200)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 29 Aug 2011 18:32:30 +0000 (20:32 +0200)
* src/vm/globals.cpp: Added two new classes: sun/reflect/MethodAccessorImpl and
sun/reflect/ConstructorAccessorImpl.
* src/vm/globals.hpp: Likewise.
* src/vm/jit/stacktrace.cpp: Skip stack frames belonging to these classes when
looking for a class loader.
* src/vm/linker.cpp: Link these classes.
* src/vm/loader.cpp: Load these classes.

src/vm/globals.cpp
src/vm/globals.hpp
src/vm/jit/stacktrace.cpp
src/vm/linker.cpp
src/vm/loader.cpp

index c29c90a6f8213c6c01d3a00340d567c36940f2f1..5769174c8d138fe9f7c2d8bf3c740ec0a56adaff 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/globals.cpp - global variables
 
 /* src/vm/globals.cpp - global variables
 
-   Copyright (C) 2008
+   Copyright (C) 1996-2011
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
@@ -61,6 +61,8 @@ classinfo *class_java_lang_RuntimeException;
 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 classinfo *class_sun_misc_Signal;
 classinfo *class_sun_reflect_MagicAccessorImpl;
 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 classinfo *class_sun_misc_Signal;
 classinfo *class_sun_reflect_MagicAccessorImpl;
+classinfo *class_sun_reflect_MethodAccessorImpl;
+classinfo *class_sun_reflect_ConstructorAccessorImpl;
 #endif
 
 #if defined(ENABLE_JAVASE)
 #endif
 
 #if defined(ENABLE_JAVASE)
index 3adf259767e9361bd397ed660ee6dc55b7949baa..5d7c7085dc616063709c0196e2653f0433b39681 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/globals.hpp - global variables
 
 /* src/vm/globals.hpp - global variables
 
-   Copyright (C) 2008
+   Copyright (C) 1996-2011
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
@@ -69,6 +69,8 @@ extern classinfo *class_java_lang_VMThrowable;
 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 extern classinfo *class_sun_misc_Signal;
 extern classinfo *class_sun_reflect_MagicAccessorImpl;
 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 extern classinfo *class_sun_misc_Signal;
 extern classinfo *class_sun_reflect_MagicAccessorImpl;
+extern classinfo *class_sun_reflect_MethodAccessorImpl;
+extern classinfo *class_sun_reflect_ConstructorAccessorImpl;
 #endif
 
 #if defined(ENABLE_JAVASE)
 #endif
 
 #if defined(ENABLE_JAVASE)
index 1593bd2fa4ba22a8b67b26f37c5060713ead3818..c59d05ac1bf7299add8422432dbd1cc7041da8ba 100644 (file)
@@ -904,6 +904,14 @@ classloader_t* stacktrace_first_nonnull_classloader(void)
                m  = tmpsfi.code->m;
                cl = class_get_classloader(m->clazz);
 
                m  = tmpsfi.code->m;
                cl = class_get_classloader(m->clazz);
 
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+               /* NOTE: See hotspot/src/share/vm/runtime/vframe.cpp
+                  (vframeStreamCommon::skip_reflection_related_frames). */
+               if (class_issubclass(m->clazz, class_sun_reflect_MethodAccessorImpl) ||
+                       class_issubclass(m->clazz, class_sun_reflect_ConstructorAccessorImpl))
+                       continue;
+#endif
+
                if (cl != NULL)
                        return cl;
        }
                if (cl != NULL)
                        return cl;
        }
index 0d389dc345c8dfc657a0d6809a6b5598c51ae04b..aa6cc39bc98a4799ed92bd710e4db67a09628b43 100644 (file)
@@ -298,6 +298,12 @@ void linker_init(void)
 
        if (!link_class(class_sun_reflect_MagicAccessorImpl))
                vm_abort("linker_init: linking failed");
 
        if (!link_class(class_sun_reflect_MagicAccessorImpl))
                vm_abort("linker_init: linking failed");
+
+       if (!link_class(class_sun_reflect_MethodAccessorImpl))
+               vm_abort("linker_init: linking failed");
+
+       if (!link_class(class_sun_reflect_ConstructorAccessorImpl))
+               vm_abort("linker_init: linking failed");
 # endif
 
        if (!link_class(arrayclass_java_lang_Object))
 # endif
 
        if (!link_class(arrayclass_java_lang_Object))
index 9ff93a4aa527601af3b90c97b4180b271a1585ba..de0cae192a481d3e572d6a17a01a454f6af30ff9 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/loader.cpp - class loader functions
 
 /* src/vm/loader.cpp - class loader functions
 
-   Copyright (C) 1996-2005, 2006, 2007, 2008
+   Copyright (C) 1996-2011
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
    Copyright (C) 2009 Theobroma Systems Ltd.
 
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
    Copyright (C) 2009 Theobroma Systems Ltd.
 
@@ -229,8 +229,10 @@ void loader_init(void)
        class_java_util_Vector                 = load_class_bootstrap(utf_java_util_Vector);
 
 # if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
        class_java_util_Vector                 = load_class_bootstrap(utf_java_util_Vector);
 
 # if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
-       class_sun_misc_Signal                  = load_class_bootstrap(utf_new_char("sun/misc/Signal"));
-       class_sun_reflect_MagicAccessorImpl    = load_class_bootstrap(utf_new_char("sun/reflect/MagicAccessorImpl"));
+       class_sun_misc_Signal                     = load_class_bootstrap(utf_new_char("sun/misc/Signal"));
+       class_sun_reflect_MagicAccessorImpl       = load_class_bootstrap(utf_new_char("sun/reflect/MagicAccessorImpl"));
+       class_sun_reflect_MethodAccessorImpl      = load_class_bootstrap(utf_new_char("sun/reflect/MethodAccessorImpl"));
+       class_sun_reflect_ConstructorAccessorImpl = load_class_bootstrap(utf_new_char("sun/reflect/ConstructorAccessorImpl"));
 # endif
 
        arrayclass_java_lang_Object =
 # endif
 
        arrayclass_java_lang_Object =