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(); |