From: Stefan Ring Date: Mon, 29 Aug 2011 18:32:30 +0000 (+0200) Subject: PR149: Used wrong class loader. X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=cacao.git;a=commitdiff_plain;h=4a6cefba48d8720b9e33f2e89823b8ed7fa0b78d PR149: Used wrong class loader. * 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. --- diff --git a/src/vm/globals.cpp b/src/vm/globals.cpp index c29c90a6f..5769174c8 100644 --- a/src/vm/globals.cpp +++ b/src/vm/globals.cpp @@ -1,6 +1,6 @@ /* 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. @@ -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; +classinfo *class_sun_reflect_MethodAccessorImpl; +classinfo *class_sun_reflect_ConstructorAccessorImpl; #endif #if defined(ENABLE_JAVASE) diff --git a/src/vm/globals.hpp b/src/vm/globals.hpp index 3adf25976..5d7c7085d 100644 --- a/src/vm/globals.hpp +++ b/src/vm/globals.hpp @@ -1,6 +1,6 @@ /* 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. @@ -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; +extern classinfo *class_sun_reflect_MethodAccessorImpl; +extern classinfo *class_sun_reflect_ConstructorAccessorImpl; #endif #if defined(ENABLE_JAVASE) diff --git a/src/vm/jit/stacktrace.cpp b/src/vm/jit/stacktrace.cpp index 1593bd2fa..c59d05ac1 100644 --- a/src/vm/jit/stacktrace.cpp +++ b/src/vm/jit/stacktrace.cpp @@ -904,6 +904,14 @@ classloader_t* stacktrace_first_nonnull_classloader(void) 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; } diff --git a/src/vm/linker.cpp b/src/vm/linker.cpp index 0d389dc34..aa6cc39bc 100644 --- a/src/vm/linker.cpp +++ b/src/vm/linker.cpp @@ -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_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)) diff --git a/src/vm/loader.cpp b/src/vm/loader.cpp index 9ff93a4aa..de0cae192 100644 --- a/src/vm/loader.cpp +++ b/src/vm/loader.cpp @@ -1,6 +1,6 @@ /* 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. @@ -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_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 =