hotspot/src/share/vm/prims/jvm.cpp
changeset 14488 ab48109f7d1b
parent 14391 df0a1573d5bd
child 15097 9db149412e0e
equal deleted inserted replaced
14486:7d079e0eedef 14488:ab48109f7d1b
   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);
   934                                                               h_loader,
   934                                                               h_loader,
   935                                                               Handle(),
   935                                                               Handle(),
   936                                                               CHECK_NULL);
   936                                                               CHECK_NULL);
   937 
   937 
   938   return (k == NULL) ? NULL :
   938   return (k == NULL) ? NULL :
   939             (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
   939             (jclass) JNIHandles::make_local(env, k->java_mirror());
   940 JVM_END
   940 JVM_END
   941 
   941 
   942 
   942 
   943 // Reflection support //////////////////////////////////////////////////////////////////////////////
   943 // Reflection support //////////////////////////////////////////////////////////////////////////////
   944 
   944 
   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 
  1749   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
  1749   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
  1750     // Primitive type
  1750     // Primitive type
  1751     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
  1751     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
  1752   }
  1752   }
  1753 
  1753 
  1754   Klass* k = Klass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)));
  1754   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
  1755   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
  1755   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
  1756 }
  1756 }
  1757 JVM_END
  1757 JVM_END
  1758 
  1758 
  1759 
  1759 
  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);
  3215     return true;
  3215     return true;
  3216   }
  3216   }
  3217 
  3217 
  3218   if (access.is_protected()) {
  3218   if (access.is_protected()) {
  3219     // See if current_class is a subclass of field_class
  3219     // See if current_class is a subclass of field_class
  3220     if (Klass::cast(current_class)->is_subclass_of(field_class)) {
  3220     if (current_class->is_subclass_of(field_class)) {
  3221       return true;
  3221       return true;
  3222     }
  3222     }
  3223   }
  3223   }
  3224 
  3224 
  3225   return (!access.is_private() && InstanceKlass::cast(current_class)->is_same_class_package(field_class));
  3225   return (!access.is_private() && InstanceKlass::cast(current_class)->is_same_class_package(field_class));
  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)));