68 source_file = s->as_C_string(); |
68 source_file = s->as_C_string(); |
69 } |
69 } |
70 } |
70 } |
71 } |
71 } |
72 if (caller != NULL) { |
72 if (caller != NULL) { |
73 const char * from = Klass::cast(caller)->external_name(); |
73 const char * from = caller->external_name(); |
74 const char * to = Klass::cast(to_class)->external_name(); |
74 const char * to = to_class->external_name(); |
75 // print in a single call to reduce interleaving between threads |
75 // print in a single call to reduce interleaving between threads |
76 if (source_file != NULL) { |
76 if (source_file != NULL) { |
77 tty->print("RESOLVE %s %s %s:%d (reflection)\n", from, to, source_file, line_number); |
77 tty->print("RESOLVE %s %s %s:%d (reflection)\n", from, to, source_file, line_number); |
78 } else { |
78 } else { |
79 tty->print("RESOLVE %s %s (reflection)\n", from, to); |
79 tty->print("RESOLVE %s %s (reflection)\n", from, to); |
328 if (java_lang_Class::is_primitive(element_mirror)) { |
328 if (java_lang_Class::is_primitive(element_mirror)) { |
329 Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL); |
329 Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL); |
330 return TypeArrayKlass::cast(tak)->allocate(length, THREAD); |
330 return TypeArrayKlass::cast(tak)->allocate(length, THREAD); |
331 } else { |
331 } else { |
332 Klass* k = java_lang_Class::as_Klass(element_mirror); |
332 Klass* k = java_lang_Class::as_Klass(element_mirror); |
333 if (Klass::cast(k)->oop_is_array() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) { |
333 if (k->oop_is_array() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) { |
334 THROW_0(vmSymbols::java_lang_IllegalArgumentException()); |
334 THROW_0(vmSymbols::java_lang_IllegalArgumentException()); |
335 } |
335 } |
336 return oopFactory::new_objArray(k, length, THREAD); |
336 return oopFactory::new_objArray(k, length, THREAD); |
337 } |
337 } |
338 } |
338 } |
364 int dim = len; |
364 int dim = len; |
365 if (java_lang_Class::is_primitive(element_mirror)) { |
365 if (java_lang_Class::is_primitive(element_mirror)) { |
366 klass = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL); |
366 klass = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL); |
367 } else { |
367 } else { |
368 klass = java_lang_Class::as_Klass(element_mirror); |
368 klass = java_lang_Class::as_Klass(element_mirror); |
369 if (Klass::cast(klass)->oop_is_array()) { |
369 if (klass->oop_is_array()) { |
370 int k_dim = ArrayKlass::cast(klass)->dimension(); |
370 int k_dim = ArrayKlass::cast(klass)->dimension(); |
371 if (k_dim + len > MAX_DIM) { |
371 if (k_dim + len > MAX_DIM) { |
372 THROW_0(vmSymbols::java_lang_IllegalArgumentException()); |
372 THROW_0(vmSymbols::java_lang_IllegalArgumentException()); |
373 } |
373 } |
374 dim += k_dim; |
374 dim += k_dim; |
375 } |
375 } |
376 } |
376 } |
377 klass = Klass::cast(klass)->array_klass(dim, CHECK_NULL); |
377 klass = klass->array_klass(dim, CHECK_NULL); |
378 oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, THREAD); |
378 oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, THREAD); |
379 assert(obj->is_array(), "just checking"); |
379 assert(obj->is_array(), "just checking"); |
380 return arrayOop(obj); |
380 return arrayOop(obj); |
381 } |
381 } |
382 |
382 |
385 if (java_lang_Class::is_primitive(mirror)) { |
385 if (java_lang_Class::is_primitive(mirror)) { |
386 return NULL; |
386 return NULL; |
387 } |
387 } |
388 |
388 |
389 Klass* klass = java_lang_Class::as_Klass(mirror); |
389 Klass* klass = java_lang_Class::as_Klass(mirror); |
390 if (!Klass::cast(klass)->oop_is_array()) { |
390 if (!klass->oop_is_array()) { |
391 return NULL; |
391 return NULL; |
392 } |
392 } |
393 |
393 |
394 oop result = ArrayKlass::cast(klass)->component_mirror(); |
394 oop result = ArrayKlass::cast(klass)->component_mirror(); |
395 #ifdef ASSERT |
395 #ifdef ASSERT |
396 oop result2 = NULL; |
396 oop result2 = NULL; |
397 if (ArrayKlass::cast(klass)->dimension() == 1) { |
397 if (ArrayKlass::cast(klass)->dimension() == 1) { |
398 if (Klass::cast(klass)->oop_is_typeArray()) { |
398 if (klass->oop_is_typeArray()) { |
399 result2 = basic_type_arrayklass_to_mirror(klass, CHECK_NULL); |
399 result2 = basic_type_arrayklass_to_mirror(klass, CHECK_NULL); |
400 } else { |
400 } else { |
401 result2 = Klass::cast(ObjArrayKlass::cast(klass)->element_klass())->java_mirror(); |
401 result2 = ObjArrayKlass::cast(klass)->element_klass()->java_mirror(); |
402 } |
402 } |
403 } else { |
403 } else { |
404 Klass* lower_dim = ArrayKlass::cast(klass)->lower_dimension(); |
404 Klass* lower_dim = ArrayKlass::cast(klass)->lower_dimension(); |
405 assert(Klass::cast(lower_dim)->oop_is_array(), "just checking"); |
405 assert(lower_dim->oop_is_array(), "just checking"); |
406 result2 = Klass::cast(lower_dim)->java_mirror(); |
406 result2 = lower_dim->java_mirror(); |
407 } |
407 } |
408 assert(result == result2, "results must be consistent"); |
408 assert(result == result2, "results must be consistent"); |
409 #endif //ASSERT |
409 #endif //ASSERT |
410 return result; |
410 return result; |
411 } |
411 } |
440 // Additional test for protected members: JLS 6.6.2 |
440 // Additional test for protected members: JLS 6.6.2 |
441 |
441 |
442 if (acc.is_protected()) { |
442 if (acc.is_protected()) { |
443 if (target_class != client_class) { |
443 if (target_class != client_class) { |
444 if (!is_same_class_package(client_class, field_class)) { |
444 if (!is_same_class_package(client_class, field_class)) { |
445 if (!Klass::cast(target_class)->is_subclass_of(client_class)) { |
445 if (!target_class->is_subclass_of(client_class)) { |
446 THROW_(vmSymbols::java_lang_IllegalAccessException(), false); |
446 THROW_(vmSymbols::java_lang_IllegalAccessException(), false); |
447 } |
447 } |
448 } |
448 } |
449 } |
449 } |
450 } |
450 } |
466 } |
466 } |
467 // New (1.4) reflection implementation. Allow all accesses from |
467 // New (1.4) reflection implementation. Allow all accesses from |
468 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
468 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
469 if ( JDK_Version::is_gte_jdk14x_version() |
469 if ( JDK_Version::is_gte_jdk14x_version() |
470 && UseNewReflection |
470 && UseNewReflection |
471 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) { |
471 && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) { |
472 return true; |
472 return true; |
473 } |
473 } |
474 |
474 |
475 // Also allow all accesses from |
475 // Also allow all accesses from |
476 // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. |
476 // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. |
544 } |
544 } |
545 |
545 |
546 if (access.is_protected()) { |
546 if (access.is_protected()) { |
547 if (!protected_restriction) { |
547 if (!protected_restriction) { |
548 // See if current_class is a subclass of field_class |
548 // See if current_class is a subclass of field_class |
549 if (Klass::cast(current_class)->is_subclass_of(field_class)) { |
549 if (current_class->is_subclass_of(field_class)) { |
550 if (access.is_static() || // static fields are ok, see 6622385 |
550 if (access.is_static() || // static fields are ok, see 6622385 |
551 current_class == resolved_class || |
551 current_class == resolved_class || |
552 field_class == resolved_class || |
552 field_class == resolved_class || |
553 Klass::cast(current_class)->is_subclass_of(resolved_class) || |
553 current_class->is_subclass_of(resolved_class) || |
554 Klass::cast(resolved_class)->is_subclass_of(current_class)) { |
554 resolved_class->is_subclass_of(current_class)) { |
555 return true; |
555 return true; |
556 } |
556 } |
557 } |
557 } |
558 } |
558 } |
559 } |
559 } |
564 |
564 |
565 // New (1.4) reflection implementation. Allow all accesses from |
565 // New (1.4) reflection implementation. Allow all accesses from |
566 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
566 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
567 if ( JDK_Version::is_gte_jdk14x_version() |
567 if ( JDK_Version::is_gte_jdk14x_version() |
568 && UseNewReflection |
568 && UseNewReflection |
569 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) { |
569 && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) { |
570 return true; |
570 return true; |
571 } |
571 } |
572 |
572 |
573 // Also allow all accesses from |
573 // Also allow all accesses from |
574 // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. |
574 // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. |
691 if (type != T_OBJECT) { |
691 if (type != T_OBJECT) { |
692 return Handle(THREAD, Universe::java_mirror(type)); |
692 return Handle(THREAD, Universe::java_mirror(type)); |
693 } |
693 } |
694 |
694 |
695 oop loader = InstanceKlass::cast(k())->class_loader(); |
695 oop loader = InstanceKlass::cast(k())->class_loader(); |
696 oop protection_domain = Klass::cast(k())->protection_domain(); |
696 oop protection_domain = k()->protection_domain(); |
697 Klass* result = SystemDictionary::resolve_or_fail(signature, |
697 Klass* result = SystemDictionary::resolve_or_fail(signature, |
698 Handle(THREAD, loader), |
698 Handle(THREAD, loader), |
699 Handle(THREAD, protection_domain), |
699 Handle(THREAD, protection_domain), |
700 true, CHECK_(Handle())); |
700 true, CHECK_(Handle())); |
701 |
701 |
702 if (TraceClassResolution) { |
702 if (TraceClassResolution) { |
703 trace_class_resolution(result); |
703 trace_class_resolution(result); |
704 } |
704 } |
705 |
705 |
706 oop nt = Klass::cast(result)->java_mirror(); |
706 oop nt = result->java_mirror(); |
707 return Handle(THREAD, nt); |
707 return Handle(THREAD, nt); |
708 } |
708 } |
709 |
709 |
710 |
710 |
711 oop Reflection::new_method(methodHandle method, bool intern_name, bool for_constant_pool_access, TRAPS) { |
711 oop Reflection::new_method(methodHandle method, bool intern_name, bool for_constant_pool_access, TRAPS) { |
935 // new default: 6531596 |
935 // new default: 6531596 |
936 if (ReflectionWrapResolutionErrors) { |
936 if (ReflectionWrapResolutionErrors) { |
937 ResourceMark rm(THREAD); |
937 ResourceMark rm(THREAD); |
938 Handle h_origexception = Exceptions::new_exception(THREAD, |
938 Handle h_origexception = Exceptions::new_exception(THREAD, |
939 vmSymbols::java_lang_AbstractMethodError(), |
939 vmSymbols::java_lang_AbstractMethodError(), |
940 Method::name_and_sig_as_C_string(Klass::cast(target_klass()), |
940 Method::name_and_sig_as_C_string(target_klass(), |
941 method->name(), |
941 method->name(), |
942 method->signature())); |
942 method->signature())); |
943 JavaCallArguments args(h_origexception); |
943 JavaCallArguments args(h_origexception); |
944 THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(), |
944 THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(), |
945 vmSymbols::throwable_void_signature(), |
945 vmSymbols::throwable_void_signature(), |
946 &args); |
946 &args); |
947 } else { |
947 } else { |
948 ResourceMark rm(THREAD); |
948 ResourceMark rm(THREAD); |
949 THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(), |
949 THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(), |
950 Method::name_and_sig_as_C_string(Klass::cast(target_klass()), |
950 Method::name_and_sig_as_C_string(target_klass(), |
951 method->name(), |
951 method->name(), |
952 method->signature())); |
952 method->signature())); |
953 } |
953 } |
954 } |
954 } |
955 } |
955 } |
960 // I believe this is a ShouldNotGetHere case which requires |
960 // I believe this is a ShouldNotGetHere case which requires |
961 // an internal vtable bug. If you ever get this please let Karen know. |
961 // an internal vtable bug. If you ever get this please let Karen know. |
962 if (method.is_null()) { |
962 if (method.is_null()) { |
963 ResourceMark rm(THREAD); |
963 ResourceMark rm(THREAD); |
964 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), |
964 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), |
965 Method::name_and_sig_as_C_string(Klass::cast(klass()), |
965 Method::name_and_sig_as_C_string(klass(), |
966 reflected_method->name(), |
966 reflected_method->name(), |
967 reflected_method->signature())); |
967 reflected_method->signature())); |
968 } |
968 } |
969 |
969 |
970 // In the JDK 1.4 reflection implementation, the security check is |
970 // In the JDK 1.4 reflection implementation, the security check is |