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