555 // 556 // We'll check for the method name first, as that's most likely 557 // to be false (so we'll short-circuit out of these tests). 558 if (sel_method->name() == vmSymbols::clone_name() && 559 sel_klass == SystemDictionary::Object_klass() && 560 resolved_klass->is_array_klass()) { 561 // We need to change "protected" to "public". 562 assert(flags.is_protected(), "clone not protected?"); 563 jint new_flags = flags.as_int(); 564 new_flags = new_flags & (~JVM_ACC_PROTECTED); 565 new_flags = new_flags | JVM_ACC_PUBLIC; 566 flags.set_flags(new_flags); 567 } 568 // assert(extra_arg_result_or_null != NULL, "must be able to return extra argument"); 569 570 if (!Reflection::verify_field_access(ref_klass, 571 resolved_klass, 572 sel_klass, 573 flags, 574 true)) { 575 ResourceMark rm(THREAD); 576 Exceptions::fthrow( 577 THREAD_AND_LOCATION, 578 vmSymbols::java_lang_IllegalAccessError(), 579 "tried to access method %s.%s%s from class %s", 580 sel_klass->external_name(), 581 sel_method->name()->as_C_string(), 582 sel_method->signature()->as_C_string(), 583 ref_klass->external_name() 584 ); 585 return; 586 } 587 } 588 589 methodHandle LinkResolver::resolve_method_statically(Bytecodes::Code code, 590 const constantPoolHandle& pool, int index, TRAPS) { 591 // This method is used only 592 // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call), 593 // and 594 // (2) in Bytecode_invoke::static_target 902 trace_method_resolution(buf, link_info.current_klass(), resolved_klass, 903 resolved_method, true); 904 } 905 906 return resolved_method; 907 } 908 909 //------------------------------------------------------------------------------------------------------------------------ 910 // Field resolution 911 912 void LinkResolver::check_field_accessability(Klass* ref_klass, 913 Klass* resolved_klass, 914 Klass* sel_klass, 915 const fieldDescriptor& fd, 916 TRAPS) { 917 if (!Reflection::verify_field_access(ref_klass, 918 resolved_klass, 919 sel_klass, 920 fd.access_flags(), 921 true)) { 922 ResourceMark rm(THREAD); 923 Exceptions::fthrow( 924 THREAD_AND_LOCATION, 925 vmSymbols::java_lang_IllegalAccessError(), 926 "tried to access field %s.%s from class %s", 927 sel_klass->external_name(), 928 fd.name()->as_C_string(), 929 ref_klass->external_name() 930 ); 931 return; 932 } 933 } 934 935 void LinkResolver::resolve_field_access(fieldDescriptor& fd, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) { 936 LinkInfo link_info(pool, index, method, CHECK); 937 resolve_field(fd, link_info, byte, true, CHECK); 938 } 939 940 void LinkResolver::resolve_field(fieldDescriptor& fd, 941 const LinkInfo& link_info, | 555 // 556 // We'll check for the method name first, as that's most likely 557 // to be false (so we'll short-circuit out of these tests). 558 if (sel_method->name() == vmSymbols::clone_name() && 559 sel_klass == SystemDictionary::Object_klass() && 560 resolved_klass->is_array_klass()) { 561 // We need to change "protected" to "public". 562 assert(flags.is_protected(), "clone not protected?"); 563 jint new_flags = flags.as_int(); 564 new_flags = new_flags & (~JVM_ACC_PROTECTED); 565 new_flags = new_flags | JVM_ACC_PUBLIC; 566 flags.set_flags(new_flags); 567 } 568 // assert(extra_arg_result_or_null != NULL, "must be able to return extra argument"); 569 570 if (!Reflection::verify_field_access(ref_klass, 571 resolved_klass, 572 sel_klass, 573 flags, 574 true)) { 575 // Propagate any existing exceptions that may have been thrown 576 if (HAS_PENDING_EXCEPTION) { 577 return; 578 } 579 ResourceMark rm(THREAD); 580 Exceptions::fthrow( 581 THREAD_AND_LOCATION, 582 vmSymbols::java_lang_IllegalAccessError(), 583 "tried to access method %s.%s%s from class %s", 584 sel_klass->external_name(), 585 sel_method->name()->as_C_string(), 586 sel_method->signature()->as_C_string(), 587 ref_klass->external_name() 588 ); 589 return; 590 } 591 } 592 593 methodHandle LinkResolver::resolve_method_statically(Bytecodes::Code code, 594 const constantPoolHandle& pool, int index, TRAPS) { 595 // This method is used only 596 // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call), 597 // and 598 // (2) in Bytecode_invoke::static_target 906 trace_method_resolution(buf, link_info.current_klass(), resolved_klass, 907 resolved_method, true); 908 } 909 910 return resolved_method; 911 } 912 913 //------------------------------------------------------------------------------------------------------------------------ 914 // Field resolution 915 916 void LinkResolver::check_field_accessability(Klass* ref_klass, 917 Klass* resolved_klass, 918 Klass* sel_klass, 919 const fieldDescriptor& fd, 920 TRAPS) { 921 if (!Reflection::verify_field_access(ref_klass, 922 resolved_klass, 923 sel_klass, 924 fd.access_flags(), 925 true)) { 926 // Propagate any existing exceptions that may have been thrown 927 if (HAS_PENDING_EXCEPTION) { 928 return; 929 } 930 931 ResourceMark rm(THREAD); 932 Exceptions::fthrow( 933 THREAD_AND_LOCATION, 934 vmSymbols::java_lang_IllegalAccessError(), 935 "tried to access field %s.%s from class %s", 936 sel_klass->external_name(), 937 fd.name()->as_C_string(), 938 ref_klass->external_name() 939 ); 940 return; 941 } 942 } 943 944 void LinkResolver::resolve_field_access(fieldDescriptor& fd, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) { 945 LinkInfo link_info(pool, index, method, CHECK); 946 resolve_field(fd, link_info, byte, true, CHECK); 947 } 948 949 void LinkResolver::resolve_field(fieldDescriptor& fd, 950 const LinkInfo& link_info, |