src/share/vm/prims/jvm.cpp

Print this page

        

*** 871,880 **** --- 871,894 ---- if (TraceClassResolution && k != NULL) { trace_class_resolution(k); } + if (UsePrimordialLoaderCache) { + // Skip caching the reflection loader and the extension loader + instanceKlass* loader_klass = instanceKlass::cast((JNIHandles::resolve(loader))->klass()); + const char* loader_name = loader_klass->external_name(); + bool is_reflection_loader = strncmp(loader_name, "sun.reflect", 11) == 0 ? true : false; + bool is_ext_loader = strncmp(loader_name, "sun.misc.Launcher$ExtClassLoader", 32) == 0 ? true : false; + #ifdef ASSERT + tty->print("NEW LDR TYPE is %s for %s, %1x\n", loader_name, name, is_reflection_loader); + #endif + if ((!is_reflection_loader) && (!is_ext_loader)) { + Universe::check_or_set_cached_loader(*(class_loader.raw_value())); + } + } + return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror()); } JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
*** 3315,3330 **** --- 3329,3354 ---- // Return the first non-null class loader up the execution stack, or null // if only code from the null class loader is on the stack. JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env)) + if (UsePrimordialLoaderCache) { + oop cachedLoader = Universe::get_cached_loader(); + if (cachedLoader != NULL && (oop)cachedLoader != (oop)-1) { + return JNIHandles::make_local(env, cachedLoader); + } + } + for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { // UseNewReflection vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection klassOop holder = vfst.method()->method_holder(); oop loader = instanceKlass::cast(holder)->class_loader(); if (loader != NULL) { + if (UsePrimordialLoaderCache) { + Universe::check_or_set_cached_loader(loader); + } return JNIHandles::make_local(env, loader); } } return NULL; JVM_END