< prev index next >

src/hotspot/share/interpreter/linkResolver.cpp

Print this page




 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,


< prev index next >