303 arrayOop s = arrayOop(JNIHandles::resolve_non_null(src)); |
303 arrayOop s = arrayOop(JNIHandles::resolve_non_null(src)); |
304 arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst)); |
304 arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst)); |
305 assert(s->is_oop(), "JVM_ArrayCopy: src not an oop"); |
305 assert(s->is_oop(), "JVM_ArrayCopy: src not an oop"); |
306 assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop"); |
306 assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop"); |
307 // Do copy |
307 // Do copy |
308 Klass::cast(s->klass())->copy_array(s, src_pos, d, dst_pos, length, thread); |
308 s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread); |
309 JVM_END |
309 JVM_END |
310 |
310 |
311 |
311 |
312 static void set_property(Handle props, const char* key, const char* value, TRAPS) { |
312 static void set_property(Handle props, const char* key, const char* value, TRAPS) { |
313 JavaValue r(T_OBJECT); |
313 JavaValue r(T_OBJECT); |
673 |
673 |
674 |
674 |
675 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth)) |
675 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth)) |
676 JVMWrapper("JVM_GetCallerClass"); |
676 JVMWrapper("JVM_GetCallerClass"); |
677 Klass* k = thread->security_get_caller_class(depth); |
677 Klass* k = thread->security_get_caller_class(depth); |
678 return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror()); |
678 return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, k->java_mirror()); |
679 JVM_END |
679 JVM_END |
680 |
680 |
681 |
681 |
682 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf)) |
682 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf)) |
683 JVMWrapper("JVM_FindPrimitiveClass"); |
683 JVMWrapper("JVM_FindPrimitiveClass"); |
737 } |
737 } |
738 |
738 |
739 if (TraceClassResolution) { |
739 if (TraceClassResolution) { |
740 trace_class_resolution(k); |
740 trace_class_resolution(k); |
741 } |
741 } |
742 return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror()); |
742 return (jclass) JNIHandles::make_local(env, k->java_mirror()); |
743 JVM_END |
743 JVM_END |
744 |
744 |
745 JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, |
745 JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, |
746 jboolean init, jobject loader, |
746 jboolean init, jobject loader, |
747 jboolean throwError)) |
747 jboolean throwError)) |
783 ? (Klass*)NULL |
783 ? (Klass*)NULL |
784 : java_lang_Class::as_Klass(from_class_oop); |
784 : java_lang_Class::as_Klass(from_class_oop); |
785 oop class_loader = NULL; |
785 oop class_loader = NULL; |
786 oop protection_domain = NULL; |
786 oop protection_domain = NULL; |
787 if (from_class != NULL) { |
787 if (from_class != NULL) { |
788 class_loader = Klass::cast(from_class)->class_loader(); |
788 class_loader = from_class->class_loader(); |
789 protection_domain = Klass::cast(from_class)->protection_domain(); |
789 protection_domain = from_class->protection_domain(); |
790 } |
790 } |
791 Handle h_loader(THREAD, class_loader); |
791 Handle h_loader(THREAD, class_loader); |
792 Handle h_prot (THREAD, protection_domain); |
792 Handle h_prot (THREAD, protection_domain); |
793 jclass result = find_class_from_class_loader(env, h_name, init, h_loader, |
793 jclass result = find_class_from_class_loader(env, h_name, init, h_loader, |
794 h_prot, true, thread); |
794 h_prot, true, thread); |
796 if (TraceClassResolution && result != NULL) { |
796 if (TraceClassResolution && result != NULL) { |
797 // this function is generally only used for class loading during verification. |
797 // this function is generally only used for class loading during verification. |
798 ResourceMark rm; |
798 ResourceMark rm; |
799 oop from_mirror = JNIHandles::resolve_non_null(from); |
799 oop from_mirror = JNIHandles::resolve_non_null(from); |
800 Klass* from_class = java_lang_Class::as_Klass(from_mirror); |
800 Klass* from_class = java_lang_Class::as_Klass(from_mirror); |
801 const char * from_name = Klass::cast(from_class)->external_name(); |
801 const char * from_name = from_class->external_name(); |
802 |
802 |
803 oop mirror = JNIHandles::resolve_non_null(result); |
803 oop mirror = JNIHandles::resolve_non_null(result); |
804 Klass* to_class = java_lang_Class::as_Klass(mirror); |
804 Klass* to_class = java_lang_Class::as_Klass(mirror); |
805 const char * to = Klass::cast(to_class)->external_name(); |
805 const char * to = to_class->external_name(); |
806 tty->print("RESOLVE %s %s (verification)\n", from_name, to); |
806 tty->print("RESOLVE %s %s (verification)\n", from_name, to); |
807 } |
807 } |
808 |
808 |
809 return result; |
809 return result; |
810 JVM_END |
810 JVM_END |
873 |
873 |
874 if (TraceClassResolution && k != NULL) { |
874 if (TraceClassResolution && k != NULL) { |
875 trace_class_resolution(k); |
875 trace_class_resolution(k); |
876 } |
876 } |
877 |
877 |
878 return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror()); |
878 return (jclass) JNIHandles::make_local(env, k->java_mirror()); |
879 } |
879 } |
880 |
880 |
881 |
881 |
882 JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)) |
882 JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)) |
883 JVMWrapper2("JVM_DefineClass %s", name); |
883 JVMWrapper2("JVM_DefineClass %s", name); |
952 name = type2name(java_lang_Class::primitive_type(JNIHandles::resolve(cls))); |
952 name = type2name(java_lang_Class::primitive_type(JNIHandles::resolve(cls))); |
953 } else { |
953 } else { |
954 // Consider caching interned string in Klass |
954 // Consider caching interned string in Klass |
955 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
955 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
956 assert(k->is_klass(), "just checking"); |
956 assert(k->is_klass(), "just checking"); |
957 name = Klass::cast(k)->external_name(); |
957 name = k->external_name(); |
958 } |
958 } |
959 oop result = StringTable::intern((char*) name, CHECK_NULL); |
959 oop result = StringTable::intern((char*) name, CHECK_NULL); |
960 return (jstring) JNIHandles::make_local(env, result); |
960 return (jstring) JNIHandles::make_local(env, result); |
961 JVM_END |
961 JVM_END |
962 |
962 |
989 // Fill in result |
989 // Fill in result |
990 if (klass->oop_is_instance()) { |
990 if (klass->oop_is_instance()) { |
991 // Regular instance klass, fill in all local interfaces |
991 // Regular instance klass, fill in all local interfaces |
992 for (int index = 0; index < size; index++) { |
992 for (int index = 0; index < size; index++) { |
993 Klass* k = InstanceKlass::cast(klass())->local_interfaces()->at(index); |
993 Klass* k = InstanceKlass::cast(klass())->local_interfaces()->at(index); |
994 result->obj_at_put(index, Klass::cast(k)->java_mirror()); |
994 result->obj_at_put(index, k->java_mirror()); |
995 } |
995 } |
996 } else { |
996 } else { |
997 // All arrays implement java.lang.Cloneable and java.io.Serializable |
997 // All arrays implement java.lang.Cloneable and java.io.Serializable |
998 result->obj_at_put(0, Klass::cast(SystemDictionary::Cloneable_klass())->java_mirror()); |
998 result->obj_at_put(0, SystemDictionary::Cloneable_klass()->java_mirror()); |
999 result->obj_at_put(1, Klass::cast(SystemDictionary::Serializable_klass())->java_mirror()); |
999 result->obj_at_put(1, SystemDictionary::Serializable_klass()->java_mirror()); |
1000 } |
1000 } |
1001 return (jobjectArray) JNIHandles::make_local(env, result()); |
1001 return (jobjectArray) JNIHandles::make_local(env, result()); |
1002 JVM_END |
1002 JVM_END |
1003 |
1003 |
1004 |
1004 |
1006 JVMWrapper("JVM_GetClassLoader"); |
1006 JVMWrapper("JVM_GetClassLoader"); |
1007 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1007 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1008 return NULL; |
1008 return NULL; |
1009 } |
1009 } |
1010 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1010 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1011 oop loader = Klass::cast(k)->class_loader(); |
1011 oop loader = k->class_loader(); |
1012 return JNIHandles::make_local(env, loader); |
1012 return JNIHandles::make_local(env, loader); |
1013 JVM_END |
1013 JVM_END |
1014 |
1014 |
1015 |
1015 |
1016 JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls)) |
1016 JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls)) |
1018 oop mirror = JNIHandles::resolve_non_null(cls); |
1018 oop mirror = JNIHandles::resolve_non_null(cls); |
1019 if (java_lang_Class::is_primitive(mirror)) { |
1019 if (java_lang_Class::is_primitive(mirror)) { |
1020 return JNI_FALSE; |
1020 return JNI_FALSE; |
1021 } |
1021 } |
1022 Klass* k = java_lang_Class::as_Klass(mirror); |
1022 Klass* k = java_lang_Class::as_Klass(mirror); |
1023 jboolean result = Klass::cast(k)->is_interface(); |
1023 jboolean result = k->is_interface(); |
1024 assert(!result || Klass::cast(k)->oop_is_instance(), |
1024 assert(!result || k->oop_is_instance(), |
1025 "all interfaces are instance types"); |
1025 "all interfaces are instance types"); |
1026 // The compiler intrinsic for isInterface tests the |
1026 // The compiler intrinsic for isInterface tests the |
1027 // Klass::_access_flags bits in the same way. |
1027 // Klass::_access_flags bits in the same way. |
1028 return result; |
1028 return result; |
1029 JVM_END |
1029 JVM_END |
1037 return NULL; |
1037 return NULL; |
1038 } |
1038 } |
1039 |
1039 |
1040 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1040 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1041 objArrayOop signers = NULL; |
1041 objArrayOop signers = NULL; |
1042 if (Klass::cast(k)->oop_is_instance()) { |
1042 if (k->oop_is_instance()) { |
1043 signers = InstanceKlass::cast(k)->signers(); |
1043 signers = InstanceKlass::cast(k)->signers(); |
1044 } |
1044 } |
1045 |
1045 |
1046 // If there are no signers set in the class, or if the class |
1046 // If there are no signers set in the class, or if the class |
1047 // is an array, return NULL. |
1047 // is an array, return NULL. |
1064 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1064 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1065 // This call is ignored for primitive types and arrays. |
1065 // This call is ignored for primitive types and arrays. |
1066 // Signers are only set once, ClassLoader.java, and thus shouldn't |
1066 // Signers are only set once, ClassLoader.java, and thus shouldn't |
1067 // be called with an array. Only the bootstrap loader creates arrays. |
1067 // be called with an array. Only the bootstrap loader creates arrays. |
1068 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1068 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1069 if (Klass::cast(k)->oop_is_instance()) { |
1069 if (k->oop_is_instance()) { |
1070 InstanceKlass::cast(k)->set_signers(objArrayOop(JNIHandles::resolve(signers))); |
1070 InstanceKlass::cast(k)->set_signers(objArrayOop(JNIHandles::resolve(signers))); |
1071 } |
1071 } |
1072 } |
1072 } |
1073 JVM_END |
1073 JVM_END |
1074 |
1074 |
1083 // Primitive types does not have a protection domain. |
1083 // Primitive types does not have a protection domain. |
1084 return NULL; |
1084 return NULL; |
1085 } |
1085 } |
1086 |
1086 |
1087 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1087 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1088 return (jobject) JNIHandles::make_local(env, Klass::cast(k)->protection_domain()); |
1088 return (jobject) JNIHandles::make_local(env, k->protection_domain()); |
1089 JVM_END |
1089 JVM_END |
1090 |
1090 |
1091 |
1091 |
1092 // Obsolete since 1.2 (Class.setProtectionDomain removed), although |
1092 // Obsolete since 1.2 (Class.setProtectionDomain removed), although |
1093 // still defined in core libraries as of 1.5. |
1093 // still defined in core libraries as of 1.5. |
1099 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { |
1099 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { |
1100 // Call is ignored for primitive types |
1100 // Call is ignored for primitive types |
1101 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1101 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1102 |
1102 |
1103 // cls won't be an array, as this called only from ClassLoader.defineClass |
1103 // cls won't be an array, as this called only from ClassLoader.defineClass |
1104 if (Klass::cast(k)->oop_is_instance()) { |
1104 if (k->oop_is_instance()) { |
1105 oop pd = JNIHandles::resolve(protection_domain); |
1105 oop pd = JNIHandles::resolve(protection_domain); |
1106 assert(pd == NULL || pd->is_oop(), "just checking"); |
1106 assert(pd == NULL || pd->is_oop(), "just checking"); |
1107 InstanceKlass::cast(k)->set_protection_domain(pd); |
1107 InstanceKlass::cast(k)->set_protection_domain(pd); |
1108 } |
1108 } |
1109 } |
1109 } |
1122 |
1122 |
1123 // Check that action object understands "Object run()" |
1123 // Check that action object understands "Object run()" |
1124 Handle object (THREAD, JNIHandles::resolve(action)); |
1124 Handle object (THREAD, JNIHandles::resolve(action)); |
1125 |
1125 |
1126 // get run() method |
1126 // get run() method |
1127 Method* m_oop = Klass::cast(object->klass())->uncached_lookup_method( |
1127 Method* m_oop = object->klass()->uncached_lookup_method( |
1128 vmSymbols::run_method_name(), |
1128 vmSymbols::run_method_name(), |
1129 vmSymbols::void_object_signature()); |
1129 vmSymbols::void_object_signature()); |
1130 methodHandle m (THREAD, m_oop); |
1130 methodHandle m (THREAD, m_oop); |
1131 if (m.is_null() || !m->is_method() || !m()->is_public() || m()->is_static()) { |
1131 if (m.is_null() || !m->is_method() || !m()->is_public() || m()->is_static()) { |
1132 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method"); |
1132 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method"); |
1265 |
1265 |
1266 |
1266 |
1267 JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls)) |
1267 JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls)) |
1268 JVMWrapper("JVM_IsArrayClass"); |
1268 JVMWrapper("JVM_IsArrayClass"); |
1269 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1269 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1270 return (k != NULL) && Klass::cast(k)->oop_is_array() ? true : false; |
1270 return (k != NULL) && k->oop_is_array() ? true : false; |
1271 JVM_END |
1271 JVM_END |
1272 |
1272 |
1273 |
1273 |
1274 JVM_QUICK_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)) |
1274 JVM_QUICK_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)) |
1275 JVMWrapper("JVM_IsPrimitiveClass"); |
1275 JVMWrapper("JVM_IsPrimitiveClass"); |
1291 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1291 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1292 // Primitive type |
1292 // Primitive type |
1293 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; |
1293 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; |
1294 } |
1294 } |
1295 |
1295 |
1296 Klass* k = Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls))); |
1296 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1297 debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0)); |
1297 debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0)); |
1298 assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK"); |
1298 assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK"); |
1299 return k->modifier_flags(); |
1299 return k->modifier_flags(); |
1300 JVM_END |
1300 JVM_END |
1301 |
1301 |
1306 JvmtiVMObjectAllocEventCollector oam; |
1306 JvmtiVMObjectAllocEventCollector oam; |
1307 // ofClass is a reference to a java_lang_Class object. The mirror object |
1307 // ofClass is a reference to a java_lang_Class object. The mirror object |
1308 // of an InstanceKlass |
1308 // of an InstanceKlass |
1309 |
1309 |
1310 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || |
1310 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || |
1311 ! Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) { |
1311 ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) { |
1312 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); |
1312 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); |
1313 return (jobjectArray)JNIHandles::make_local(env, result); |
1313 return (jobjectArray)JNIHandles::make_local(env, result); |
1314 } |
1314 } |
1315 |
1315 |
1316 instanceKlassHandle k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); |
1316 instanceKlassHandle k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); |
1370 |
1370 |
1371 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)) |
1371 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)) |
1372 { |
1372 { |
1373 // ofClass is a reference to a java_lang_Class object. |
1373 // ofClass is a reference to a java_lang_Class object. |
1374 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || |
1374 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || |
1375 ! Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) { |
1375 ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) { |
1376 return NULL; |
1376 return NULL; |
1377 } |
1377 } |
1378 |
1378 |
1379 bool inner_is_member = false; |
1379 bool inner_is_member = false; |
1380 Klass* outer_klass |
1380 Klass* outer_klass |
1381 = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)) |
1381 = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)) |
1382 )->compute_enclosing_class(&inner_is_member, CHECK_NULL); |
1382 )->compute_enclosing_class(&inner_is_member, CHECK_NULL); |
1383 if (outer_klass == NULL) return NULL; // already a top-level class |
1383 if (outer_klass == NULL) return NULL; // already a top-level class |
1384 if (!inner_is_member) return NULL; // an anonymous class (inside a method) |
1384 if (!inner_is_member) return NULL; // an anonymous class (inside a method) |
1385 return (jclass) JNIHandles::make_local(env, Klass::cast(outer_klass)->java_mirror()); |
1385 return (jclass) JNIHandles::make_local(env, outer_klass->java_mirror()); |
1386 } |
1386 } |
1387 JVM_END |
1387 JVM_END |
1388 |
1388 |
1389 // should be in InstanceKlass.cpp, but is here for historical reasons |
1389 // should be in InstanceKlass.cpp, but is here for historical reasons |
1390 Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle k, |
1390 Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle k, |
1450 JvmtiVMObjectAllocEventCollector oam; |
1450 JvmtiVMObjectAllocEventCollector oam; |
1451 ResourceMark rm(THREAD); |
1451 ResourceMark rm(THREAD); |
1452 // Return null for arrays and primatives |
1452 // Return null for arrays and primatives |
1453 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { |
1453 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { |
1454 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1454 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1455 if (Klass::cast(k)->oop_is_instance()) { |
1455 if (k->oop_is_instance()) { |
1456 Symbol* sym = InstanceKlass::cast(k)->generic_signature(); |
1456 Symbol* sym = InstanceKlass::cast(k)->generic_signature(); |
1457 if (sym == NULL) return NULL; |
1457 if (sym == NULL) return NULL; |
1458 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); |
1458 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); |
1459 return (jstring) JNIHandles::make_local(env, str()); |
1459 return (jstring) JNIHandles::make_local(env, str()); |
1460 } |
1460 } |
1468 JVMWrapper("JVM_GetClassAnnotations"); |
1468 JVMWrapper("JVM_GetClassAnnotations"); |
1469 ResourceMark rm(THREAD); |
1469 ResourceMark rm(THREAD); |
1470 // Return null for arrays and primitives |
1470 // Return null for arrays and primitives |
1471 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { |
1471 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { |
1472 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1472 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); |
1473 if (Klass::cast(k)->oop_is_instance()) { |
1473 if (k->oop_is_instance()) { |
1474 typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL); |
1474 typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL); |
1475 return (jbyteArray) JNIHandles::make_local(env, a); |
1475 return (jbyteArray) JNIHandles::make_local(env, a); |
1476 } |
1476 } |
1477 } |
1477 } |
1478 return NULL; |
1478 return NULL; |
1581 JVMWrapper("JVM_GetClassDeclaredFields"); |
1581 JVMWrapper("JVM_GetClassDeclaredFields"); |
1582 JvmtiVMObjectAllocEventCollector oam; |
1582 JvmtiVMObjectAllocEventCollector oam; |
1583 |
1583 |
1584 // Exclude primitive types and array types |
1584 // Exclude primitive types and array types |
1585 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || |
1585 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || |
1586 Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_array()) { |
1586 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) { |
1587 // Return empty array |
1587 // Return empty array |
1588 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL); |
1588 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL); |
1589 return (jobjectArray) JNIHandles::make_local(env, res); |
1589 return (jobjectArray) JNIHandles::make_local(env, res); |
1590 } |
1590 } |
1591 |
1591 |
1644 JVMWrapper("JVM_GetClassDeclaredMethods"); |
1644 JVMWrapper("JVM_GetClassDeclaredMethods"); |
1645 JvmtiVMObjectAllocEventCollector oam; |
1645 JvmtiVMObjectAllocEventCollector oam; |
1646 |
1646 |
1647 // Exclude primitive types and array types |
1647 // Exclude primitive types and array types |
1648 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) |
1648 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) |
1649 || Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_array()) { |
1649 || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) { |
1650 // Return empty array |
1650 // Return empty array |
1651 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), 0, CHECK_NULL); |
1651 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), 0, CHECK_NULL); |
1652 return (jobjectArray) JNIHandles::make_local(env, res); |
1652 return (jobjectArray) JNIHandles::make_local(env, res); |
1653 } |
1653 } |
1654 |
1654 |
1696 JVMWrapper("JVM_GetClassDeclaredConstructors"); |
1696 JVMWrapper("JVM_GetClassDeclaredConstructors"); |
1697 JvmtiVMObjectAllocEventCollector oam; |
1697 JvmtiVMObjectAllocEventCollector oam; |
1698 |
1698 |
1699 // Exclude primitive types and array types |
1699 // Exclude primitive types and array types |
1700 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) |
1700 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) |
1701 || Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)))->oop_is_array()) { |
1701 || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) { |
1702 // Return empty array |
1702 // Return empty array |
1703 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0 , CHECK_NULL); |
1703 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0 , CHECK_NULL); |
1704 return (jobjectArray) JNIHandles::make_local(env, res); |
1704 return (jobjectArray) JNIHandles::make_local(env, res); |
1705 } |
1705 } |
1706 |
1706 |
1765 JvmtiVMObjectAllocEventCollector oam; |
1765 JvmtiVMObjectAllocEventCollector oam; |
1766 |
1766 |
1767 // Return null for primitives and arrays |
1767 // Return null for primitives and arrays |
1768 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1768 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
1769 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1769 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
1770 if (Klass::cast(k)->oop_is_instance()) { |
1770 if (k->oop_is_instance()) { |
1771 instanceKlassHandle k_h(THREAD, k); |
1771 instanceKlassHandle k_h(THREAD, k); |
1772 Handle jcp = sun_reflect_ConstantPool::create(CHECK_NULL); |
1772 Handle jcp = sun_reflect_ConstantPool::create(CHECK_NULL); |
1773 sun_reflect_ConstantPool::set_cp(jcp(), k_h->constants()); |
1773 sun_reflect_ConstantPool::set_cp(jcp(), k_h->constants()); |
1774 return JNIHandles::make_local(jcp()); |
1774 return JNIHandles::make_local(jcp()); |
1775 } |
1775 } |
2041 oop r = JNIHandles::resolve(cls); |
2041 oop r = JNIHandles::resolve(cls); |
2042 assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed"); |
2042 assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed"); |
2043 if (java_lang_Class::is_primitive(r)) return false; |
2043 if (java_lang_Class::is_primitive(r)) return false; |
2044 |
2044 |
2045 Klass* k = java_lang_Class::as_Klass(r); |
2045 Klass* k = java_lang_Class::as_Klass(r); |
2046 assert(Klass::cast(k)->oop_is_instance(), "must be an instance klass"); |
2046 assert(k->oop_is_instance(), "must be an instance klass"); |
2047 if (! Klass::cast(k)->oop_is_instance()) return false; |
2047 if (! k->oop_is_instance()) return false; |
2048 |
2048 |
2049 ResourceMark rm(THREAD); |
2049 ResourceMark rm(THREAD); |
2050 const char* name = Klass::cast(k)->name()->as_C_string(); |
2050 const char* name = k->name()->as_C_string(); |
2051 bool system_class = Klass::cast(k)->class_loader() == NULL; |
2051 bool system_class = k->class_loader() == NULL; |
2052 return JavaAssertions::enabled(name, system_class); |
2052 return JavaAssertions::enabled(name, system_class); |
2053 |
2053 |
2054 JVM_END |
2054 JVM_END |
2055 |
2055 |
2056 |
2056 |
2077 |
2077 |
2078 JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls)) |
2078 JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls)) |
2079 JVMWrapper("JVM_GetClassNameUTF"); |
2079 JVMWrapper("JVM_GetClassNameUTF"); |
2080 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2080 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2081 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2081 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2082 return Klass::cast(k)->name()->as_utf8(); |
2082 return k->name()->as_utf8(); |
2083 JVM_END |
2083 JVM_END |
2084 |
2084 |
2085 |
2085 |
2086 JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)) |
2086 JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)) |
2087 JVMWrapper("JVM_GetClassCPTypes"); |
2087 JVMWrapper("JVM_GetClassCPTypes"); |
2088 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2088 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2089 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2089 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2090 // types will have length zero if this is not an InstanceKlass |
2090 // types will have length zero if this is not an InstanceKlass |
2091 // (length is determined by call to JVM_GetClassCPEntriesCount) |
2091 // (length is determined by call to JVM_GetClassCPEntriesCount) |
2092 if (Klass::cast(k)->oop_is_instance()) { |
2092 if (k->oop_is_instance()) { |
2093 ConstantPool* cp = InstanceKlass::cast(k)->constants(); |
2093 ConstantPool* cp = InstanceKlass::cast(k)->constants(); |
2094 for (int index = cp->length() - 1; index >= 0; index--) { |
2094 for (int index = cp->length() - 1; index >= 0; index--) { |
2095 constantTag tag = cp->tag_at(index); |
2095 constantTag tag = cp->tag_at(index); |
2096 types[index] = (tag.is_unresolved_klass()) ? JVM_CONSTANT_Class : tag.value(); |
2096 types[index] = (tag.is_unresolved_klass()) ? JVM_CONSTANT_Class : tag.value(); |
2097 } |
2097 } |
2101 |
2101 |
2102 JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)) |
2102 JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)) |
2103 JVMWrapper("JVM_GetClassCPEntriesCount"); |
2103 JVMWrapper("JVM_GetClassCPEntriesCount"); |
2104 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2104 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2105 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2105 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2106 if (!Klass::cast(k)->oop_is_instance()) |
2106 if (!k->oop_is_instance()) |
2107 return 0; |
2107 return 0; |
2108 return InstanceKlass::cast(k)->constants()->length(); |
2108 return InstanceKlass::cast(k)->constants()->length(); |
2109 JVM_END |
2109 JVM_END |
2110 |
2110 |
2111 |
2111 |
2112 JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)) |
2112 JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)) |
2113 JVMWrapper("JVM_GetClassFieldsCount"); |
2113 JVMWrapper("JVM_GetClassFieldsCount"); |
2114 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2114 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2115 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2115 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2116 if (!Klass::cast(k)->oop_is_instance()) |
2116 if (!k->oop_is_instance()) |
2117 return 0; |
2117 return 0; |
2118 return InstanceKlass::cast(k)->java_fields_count(); |
2118 return InstanceKlass::cast(k)->java_fields_count(); |
2119 JVM_END |
2119 JVM_END |
2120 |
2120 |
2121 |
2121 |
2122 JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)) |
2122 JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)) |
2123 JVMWrapper("JVM_GetClassMethodsCount"); |
2123 JVMWrapper("JVM_GetClassMethodsCount"); |
2124 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2124 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
2125 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2125 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2126 if (!Klass::cast(k)->oop_is_instance()) |
2126 if (!k->oop_is_instance()) |
2127 return 0; |
2127 return 0; |
2128 return InstanceKlass::cast(k)->methods()->length(); |
2128 return InstanceKlass::cast(k)->methods()->length(); |
2129 JVM_END |
2129 JVM_END |
2130 |
2130 |
2131 |
2131 |
3121 // Create result array of type [Ljava/lang/Class; |
3121 // Create result array of type [Ljava/lang/Class; |
3122 objArrayOop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), depth, CHECK_NULL); |
3122 objArrayOop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), depth, CHECK_NULL); |
3123 // Fill in mirrors corresponding to method holders |
3123 // Fill in mirrors corresponding to method holders |
3124 int index = 0; |
3124 int index = 0; |
3125 while (first != NULL) { |
3125 while (first != NULL) { |
3126 result->obj_at_put(index++, Klass::cast(first->klass())->java_mirror()); |
3126 result->obj_at_put(index++, first->klass()->java_mirror()); |
3127 first = first->next; |
3127 first = first->next; |
3128 } |
3128 } |
3129 assert(index == depth, "just checking"); |
3129 assert(index == depth, "just checking"); |
3130 |
3130 |
3131 return (jobjectArray) JNIHandles::make_local(env, result); |
3131 return (jobjectArray) JNIHandles::make_local(env, result); |
3239 ResourceMark rm(THREAD); |
3239 ResourceMark rm(THREAD); |
3240 THROW_0(vmSymbols::java_lang_InvalidClassException()); |
3240 THROW_0(vmSymbols::java_lang_InvalidClassException()); |
3241 } |
3241 } |
3242 |
3242 |
3243 // Arrays not allowed here, must use JVM_AllocateNewArray |
3243 // Arrays not allowed here, must use JVM_AllocateNewArray |
3244 if (Klass::cast(java_lang_Class::as_Klass(curr_mirror))->oop_is_array() || |
3244 if (java_lang_Class::as_Klass(curr_mirror)->oop_is_array() || |
3245 Klass::cast(java_lang_Class::as_Klass(init_mirror))->oop_is_array()) { |
3245 java_lang_Class::as_Klass(init_mirror)->oop_is_array()) { |
3246 ResourceMark rm(THREAD); |
3246 ResourceMark rm(THREAD); |
3247 THROW_0(vmSymbols::java_lang_InvalidClassException()); |
3247 THROW_0(vmSymbols::java_lang_InvalidClassException()); |
3248 } |
3248 } |
3249 |
3249 |
3250 instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_Klass(curr_mirror)); |
3250 instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_Klass(curr_mirror)); |
3262 init_klass->find_method(vmSymbols::object_initializer_name(), |
3262 init_klass->find_method(vmSymbols::object_initializer_name(), |
3263 vmSymbols::void_method_signature())); |
3263 vmSymbols::void_method_signature())); |
3264 if (m.is_null()) { |
3264 if (m.is_null()) { |
3265 ResourceMark rm(THREAD); |
3265 ResourceMark rm(THREAD); |
3266 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), |
3266 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), |
3267 Method::name_and_sig_as_C_string(Klass::cast(init_klass()), |
3267 Method::name_and_sig_as_C_string(init_klass(), |
3268 vmSymbols::object_initializer_name(), |
3268 vmSymbols::object_initializer_name(), |
3269 vmSymbols::void_method_signature())); |
3269 vmSymbols::void_method_signature())); |
3270 } |
3270 } |
3271 |
3271 |
3272 if (curr_klass == init_klass && !m->is_public()) { |
3272 if (curr_klass == init_klass && !m->is_public()) { |
4243 // Special handling for primitive objects |
4243 // Special handling for primitive objects |
4244 if (java_lang_Class::is_primitive(mirror())) { |
4244 if (java_lang_Class::is_primitive(mirror())) { |
4245 return NULL; |
4245 return NULL; |
4246 } |
4246 } |
4247 Klass* k = java_lang_Class::as_Klass(mirror()); |
4247 Klass* k = java_lang_Class::as_Klass(mirror()); |
4248 if (!Klass::cast(k)->oop_is_instance()) { |
4248 if (!k->oop_is_instance()) { |
4249 return NULL; |
4249 return NULL; |
4250 } |
4250 } |
4251 instanceKlassHandle ik_h(THREAD, k); |
4251 instanceKlassHandle ik_h(THREAD, k); |
4252 int encl_method_class_idx = ik_h->enclosing_method_class_index(); |
4252 int encl_method_class_idx = ik_h->enclosing_method_class_index(); |
4253 if (encl_method_class_idx == 0) { |
4253 if (encl_method_class_idx == 0) { |
4254 return NULL; |
4254 return NULL; |
4255 } |
4255 } |
4256 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::Object_klass(), 3, CHECK_NULL); |
4256 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::Object_klass(), 3, CHECK_NULL); |
4257 objArrayHandle dest(THREAD, dest_o); |
4257 objArrayHandle dest(THREAD, dest_o); |
4258 Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL); |
4258 Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL); |
4259 dest->obj_at_put(0, Klass::cast(enc_k)->java_mirror()); |
4259 dest->obj_at_put(0, enc_k->java_mirror()); |
4260 int encl_method_method_idx = ik_h->enclosing_method_method_index(); |
4260 int encl_method_method_idx = ik_h->enclosing_method_method_index(); |
4261 if (encl_method_method_idx != 0) { |
4261 if (encl_method_method_idx != 0) { |
4262 Symbol* sym = ik_h->constants()->symbol_at( |
4262 Symbol* sym = ik_h->constants()->symbol_at( |
4263 extract_low_short_from_int( |
4263 extract_low_short_from_int( |
4264 ik_h->constants()->name_and_type_at(encl_method_method_idx))); |
4264 ik_h->constants()->name_and_type_at(encl_method_method_idx))); |