< prev index next >

src/hotspot/share/prims/jvm.cpp

Print this page




1000                                       jobject loader, const jbyte *buf, jsize len, jobject pd,
1001                                       jboolean init, int flags, jobject classData, TRAPS) {
1002   assert(THREAD->is_Java_thread(), "must be a JavaThread");
1003   JavaThread* jt = (JavaThread*) THREAD;
1004   ResourceMark rm(THREAD);
1005 
1006   Klass* lookup_k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(lookup));
1007   // Lookup class must be a non-null instance
1008   if (lookup_k == NULL) {
1009     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is null");
1010   }
1011   assert(lookup_k->is_instance_klass(), "Lookup class must be an instance klass");
1012 
1013   jboolean is_nestmate = (flags & NESTMATE) == NESTMATE;
1014   jboolean is_hidden = (flags & HIDDEN_CLASS) == HIDDEN_CLASS;
1015   jboolean is_weak = (flags & WEAK_CLASS) == WEAK_CLASS;
1016   jboolean vm_annotations = (flags & ACCESS_VM_ANNOTATIONS) == ACCESS_VM_ANNOTATIONS;
1017 
1018   InstanceKlass* host_class = NULL;
1019   if (is_nestmate) {
1020     host_class = InstanceKlass::cast(lookup_k)->nest_host(THREAD);
1021   }
1022 
1023   if (log_is_enabled(Info, class, nestmates)) {
1024     log_info(class, nestmates)("LookupDefineClass: %s - %s%s, %s, %s, %s",
1025                                name,
1026                                is_nestmate ? "with dynamic nest-host " : "non-nestmate",
1027                                is_nestmate ? host_class->external_name() : "",
1028                                is_hidden ? "hidden" : "not hidden",
1029                                is_weak ? "weak" : "strong",
1030                                vm_annotations ? "with vm annotations" : "without vm annotation");
1031   }
1032 
1033   if (!is_hidden) {
1034     // classData is only applicable for hidden classes
1035     if (classData != NULL) {
1036       THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "classData is only applicable for hidden classes");
1037     }
1038     if (is_nestmate) {
1039       THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "dynamic nestmate is only applicable for hidden classes");
1040     }


2035 {
2036   JVMWrapper("JVM_AreNestMates");
2037   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
2038   assert(c->is_instance_klass(), "must be");
2039   InstanceKlass* ck = InstanceKlass::cast(c);
2040   Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member));
2041   assert(m->is_instance_klass(), "must be");
2042   InstanceKlass* mk = InstanceKlass::cast(m);
2043   return ck->has_nestmate_access_to(mk, THREAD);
2044 }
2045 JVM_END
2046 
2047 JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current))
2048 {
2049   // current is not a primitive or array class
2050   JVMWrapper("JVM_GetNestHost");
2051   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
2052   assert(c->is_instance_klass(), "must be");
2053   InstanceKlass* ck = InstanceKlass::cast(c);
2054   InstanceKlass* host = ck->nest_host(THREAD);
2055   assert(host != NULL, "host should never be NULL");
2056   return (jclass) JNIHandles::make_local(THREAD, host->java_mirror());
2057 }
2058 JVM_END
2059 
2060 JVM_ENTRY(jobjectArray, JVM_GetNestMembers(JNIEnv* env, jclass current))
2061 {
2062   // current is not a primitive or array class
2063   JVMWrapper("JVM_GetNestMembers");
2064   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
2065   assert(c->is_instance_klass(), "must be");
2066   InstanceKlass* ck = InstanceKlass::cast(c);
2067   InstanceKlass* host = ck->nest_host(THREAD);
2068 
2069   const bool doLog = log_is_enabled(Trace, class, nestmates);
2070 
2071   if (doLog) {
2072     ResourceMark rm(THREAD);
2073     log_trace(class, nestmates)("Calling GetNestMembers for type %s with nest-host %s",
2074                                 ck->external_name(), host->external_name());
2075   }
2076 
2077   {
2078     JvmtiVMObjectAllocEventCollector oam;
2079     Array<u2>* members = host->nest_members();
2080     int length = members == NULL ? 0 : members->length();
2081 
2082     if (doLog) {
2083       log_trace(class, nestmates)(" - host has %d listed nest members", length);
2084     }
2085 
2086     // nest host is first in the array so make it one bigger
2087     objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(),
2088                                              length + 1, CHECK_NULL);
2089     objArrayHandle result(THREAD, r);
2090     result->obj_at_put(0, host->java_mirror());
2091     if (length != 0) {
2092       int count = 0;
2093       for (int i = 0; i < length; i++) {
2094         int cp_index = members->at(i);
2095         Klass* k = host->constants()->klass_at(cp_index, THREAD);
2096         if (HAS_PENDING_EXCEPTION) {



2097           if (doLog) {
2098             ResourceMark rm(THREAD);
2099             stringStream ss;
2100             char* target_member_class = host->constants()->klass_name_at(cp_index)->as_C_string();
2101             ss.print(" - resolution of nest member %s failed: ", target_member_class);
2102             java_lang_Throwable::print(PENDING_EXCEPTION, &ss);
2103             log_trace(class, nestmates)("%s", ss.as_string());
2104           }
2105           CLEAR_PENDING_EXCEPTION;
2106           continue;
2107         }
2108         if (k->is_instance_klass()) {
2109           InstanceKlass* ik = InstanceKlass::cast(k);
2110           InstanceKlass* nest_host_k = ik->nest_host(THREAD);
2111           if (nest_host_k == host) {
2112             result->obj_at_put(count+1, k->java_mirror());
2113             count++;
2114             if (doLog) {
2115               ResourceMark rm(THREAD);
2116               log_trace(class, nestmates)(" - [%d] = %s", count, ik->external_name());
2117             }
2118           } else {
2119             if (doLog) {
2120               ResourceMark rm(THREAD);
2121               log_trace(class, nestmates)(" - skipping member %s with different host %s",
2122                                           ik->external_name(), nest_host_k->external_name());
2123             }
2124           }
2125         } else {
2126           if (doLog) {
2127             ResourceMark rm(THREAD);
2128             log_trace(class, nestmates)(" - skipping member %s that is not an instance class",
2129                                         k->external_name());
2130           }




1000                                       jobject loader, const jbyte *buf, jsize len, jobject pd,
1001                                       jboolean init, int flags, jobject classData, TRAPS) {
1002   assert(THREAD->is_Java_thread(), "must be a JavaThread");
1003   JavaThread* jt = (JavaThread*) THREAD;
1004   ResourceMark rm(THREAD);
1005 
1006   Klass* lookup_k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(lookup));
1007   // Lookup class must be a non-null instance
1008   if (lookup_k == NULL) {
1009     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Lookup class is null");
1010   }
1011   assert(lookup_k->is_instance_klass(), "Lookup class must be an instance klass");
1012 
1013   jboolean is_nestmate = (flags & NESTMATE) == NESTMATE;
1014   jboolean is_hidden = (flags & HIDDEN_CLASS) == HIDDEN_CLASS;
1015   jboolean is_weak = (flags & WEAK_CLASS) == WEAK_CLASS;
1016   jboolean vm_annotations = (flags & ACCESS_VM_ANNOTATIONS) == ACCESS_VM_ANNOTATIONS;
1017 
1018   InstanceKlass* host_class = NULL;
1019   if (is_nestmate) {
1020     host_class = InstanceKlass::cast(lookup_k)->nest_host(CHECK_NULL);
1021   }
1022 
1023   if (log_is_enabled(Info, class, nestmates)) {
1024     log_info(class, nestmates)("LookupDefineClass: %s - %s%s, %s, %s, %s",
1025                                name,
1026                                is_nestmate ? "with dynamic nest-host " : "non-nestmate",
1027                                is_nestmate ? host_class->external_name() : "",
1028                                is_hidden ? "hidden" : "not hidden",
1029                                is_weak ? "weak" : "strong",
1030                                vm_annotations ? "with vm annotations" : "without vm annotation");
1031   }
1032 
1033   if (!is_hidden) {
1034     // classData is only applicable for hidden classes
1035     if (classData != NULL) {
1036       THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "classData is only applicable for hidden classes");
1037     }
1038     if (is_nestmate) {
1039       THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "dynamic nestmate is only applicable for hidden classes");
1040     }


2035 {
2036   JVMWrapper("JVM_AreNestMates");
2037   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
2038   assert(c->is_instance_klass(), "must be");
2039   InstanceKlass* ck = InstanceKlass::cast(c);
2040   Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member));
2041   assert(m->is_instance_klass(), "must be");
2042   InstanceKlass* mk = InstanceKlass::cast(m);
2043   return ck->has_nestmate_access_to(mk, THREAD);
2044 }
2045 JVM_END
2046 
2047 JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current))
2048 {
2049   // current is not a primitive or array class
2050   JVMWrapper("JVM_GetNestHost");
2051   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
2052   assert(c->is_instance_klass(), "must be");
2053   InstanceKlass* ck = InstanceKlass::cast(c);
2054   InstanceKlass* host = ck->nest_host(THREAD);
2055   return (jclass) (host == NULL ? NULL :
2056                    JNIHandles::make_local(THREAD, host->java_mirror()));
2057 }
2058 JVM_END
2059 
2060 JVM_ENTRY(jobjectArray, JVM_GetNestMembers(JNIEnv* env, jclass current))
2061 {
2062   // current is not a primitive or array class
2063   JVMWrapper("JVM_GetNestMembers");
2064   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
2065   assert(c->is_instance_klass(), "must be");
2066   InstanceKlass* ck = InstanceKlass::cast(c);
2067   InstanceKlass* host = ck->nest_host(THREAD);
2068 
2069   const bool doLog = log_is_enabled(Trace, class, nestmates);
2070 
2071   if (doLog) {
2072     ResourceMark rm(THREAD);
2073     log_trace(class, nestmates)("Calling GetNestMembers for type %s with nest-host %s",
2074                                 ck->external_name(), host->external_name());
2075   }
2076 
2077   {
2078     JvmtiVMObjectAllocEventCollector oam;
2079     Array<u2>* members = host->nest_members();
2080     int length = members == NULL ? 0 : members->length();
2081 
2082     if (doLog) {
2083       log_trace(class, nestmates)(" - host has %d listed nest members", length);
2084     }
2085 
2086     // nest host is first in the array so make it one bigger
2087     objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(),
2088                                              length + 1, CHECK_NULL);
2089     objArrayHandle result(THREAD, r);
2090     result->obj_at_put(0, host->java_mirror());
2091     if (length != 0) {
2092       int count = 0;
2093       for (int i = 0; i < length; i++) {
2094         int cp_index = members->at(i);
2095         Klass* k = host->constants()->klass_at(cp_index, THREAD);
2096         if (HAS_PENDING_EXCEPTION) {
2097           if (PENDING_EXCEPTION->is_a(SystemDictionary::VirtualMachineError_klass())) {
2098             return NULL; // propagate VMEs
2099           }
2100           if (doLog) {
2101             ResourceMark rm(THREAD);
2102             stringStream ss;
2103             char* target_member_class = host->constants()->klass_name_at(cp_index)->as_C_string();
2104             ss.print(" - resolution of nest member %s failed: ", target_member_class);
2105             java_lang_Throwable::print(PENDING_EXCEPTION, &ss);
2106             log_trace(class, nestmates)("%s", ss.as_string());
2107           }
2108           CLEAR_PENDING_EXCEPTION;
2109           continue;
2110         }
2111         if (k->is_instance_klass()) {
2112           InstanceKlass* ik = InstanceKlass::cast(k);
2113           InstanceKlass* nest_host_k = ik->nest_host(CHECK_NULL);
2114           if (nest_host_k == host) {
2115             result->obj_at_put(count+1, k->java_mirror());
2116             count++;
2117             if (doLog) {
2118               ResourceMark rm(THREAD);
2119               log_trace(class, nestmates)(" - [%d] = %s", count, ik->external_name());
2120             }
2121           } else {
2122             if (doLog) {
2123               ResourceMark rm(THREAD);
2124               log_trace(class, nestmates)(" - skipping member %s with different host %s",
2125                                           ik->external_name(), nest_host_k->external_name());
2126             }
2127           }
2128         } else {
2129           if (doLog) {
2130             ResourceMark rm(THREAD);
2131             log_trace(class, nestmates)(" - skipping member %s that is not an instance class",
2132                                         k->external_name());
2133           }


< prev index next >