src/hotspot/share/runtime/reflection.cpp
changeset 52216 b705eb06588f
parent 52195 f08c1d7a5c53
child 52878 e6f52c533cbc
equal deleted inserted replaced
52215:0b0ba3a2fec9 52216:b705eb06588f
   324   else {
   324   else {
   325     return Universe::typeArrayKlassObj(type);
   325     return Universe::typeArrayKlassObj(type);
   326   }
   326   }
   327 }
   327 }
   328 
   328 
   329 #ifdef ASSERT
       
   330 static oop basic_type_arrayklass_to_mirror(Klass* basic_type_arrayklass, TRAPS) {
       
   331   BasicType type = TypeArrayKlass::cast(basic_type_arrayklass)->element_type();
       
   332   return Universe::java_mirror(type);
       
   333 }
       
   334 #endif
       
   335 
       
   336 arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
   329 arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
   337   if (element_mirror == NULL) {
   330   if (element_mirror == NULL) {
   338     THROW_0(vmSymbols::java_lang_NullPointerException());
   331     THROW_0(vmSymbols::java_lang_NullPointerException());
   339   }
   332   }
   340   if (length < 0) {
   333   if (length < 0) {
   393   oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, CHECK_NULL);
   386   oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, CHECK_NULL);
   394   assert(obj->is_array(), "just checking");
   387   assert(obj->is_array(), "just checking");
   395   return arrayOop(obj);
   388   return arrayOop(obj);
   396 }
   389 }
   397 
   390 
   398 
       
   399 oop Reflection::array_component_type(oop mirror, TRAPS) {
       
   400   if (java_lang_Class::is_primitive(mirror)) {
       
   401     return NULL;
       
   402   }
       
   403 
       
   404   Klass* klass = java_lang_Class::as_Klass(mirror);
       
   405   if (!klass->is_array_klass()) {
       
   406     return NULL;
       
   407   }
       
   408 
       
   409   oop result = java_lang_Class::component_mirror(mirror);
       
   410 #ifdef ASSERT
       
   411   oop result2 = NULL;
       
   412   if (ArrayKlass::cast(klass)->dimension() == 1) {
       
   413     if (klass->is_typeArray_klass()) {
       
   414       result2 = basic_type_arrayklass_to_mirror(klass, CHECK_NULL);
       
   415     } else {
       
   416       result2 = ObjArrayKlass::cast(klass)->element_klass()->java_mirror();
       
   417     }
       
   418   } else {
       
   419     Klass* lower_dim = ArrayKlass::cast(klass)->lower_dimension();
       
   420     assert(lower_dim->is_array_klass(), "just checking");
       
   421     result2 = lower_dim->java_mirror();
       
   422   }
       
   423   assert(oopDesc::equals(result, result2), "results must be consistent");
       
   424 #endif //ASSERT
       
   425   return result;
       
   426 }
       
   427 
   391 
   428 static bool under_unsafe_anonymous_host(const InstanceKlass* ik, const InstanceKlass* unsafe_anonymous_host) {
   392 static bool under_unsafe_anonymous_host(const InstanceKlass* ik, const InstanceKlass* unsafe_anonymous_host) {
   429   DEBUG_ONLY(int inf_loop_check = 1000 * 1000 * 1000);
   393   DEBUG_ONLY(int inf_loop_check = 1000 * 1000 * 1000);
   430   for (;;) {
   394   for (;;) {
   431     const InstanceKlass* hc = ik->unsafe_anonymous_host();
   395     const InstanceKlass* hc = ik->unsafe_anonymous_host();