< prev index next >

src/hotspot/share/interpreter/linkResolver.cpp

Print this page




 562   //
 563   // We'll check for the method name first, as that's most likely
 564   // to be false (so we'll short-circuit out of these tests).
 565   if (sel_method->name() == vmSymbols::clone_name() &&
 566       sel_klass == SystemDictionary::Object_klass() &&
 567       resolved_klass->is_array_klass()) {
 568     // We need to change "protected" to "public".
 569     assert(flags.is_protected(), "clone not protected?");
 570     jint new_flags = flags.as_int();
 571     new_flags = new_flags & (~JVM_ACC_PROTECTED);
 572     new_flags = new_flags | JVM_ACC_PUBLIC;
 573     flags.set_flags(new_flags);
 574   }
 575 //  assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
 576 
 577   bool can_access = Reflection::verify_member_access(ref_klass,
 578                                                      resolved_klass,
 579                                                      sel_klass,
 580                                                      flags,
 581                                                      true, false, CHECK);
 582   // Any existing exceptions that may have been thrown, for example LinkageErrors
 583   // from nest-host resolution, have been allowed to propagate.
 584   if (!can_access) {
 585     ResourceMark rm(THREAD);

 586     bool same_module = (sel_klass->module() == ref_klass->module());
 587     Exceptions::fthrow(
 588       THREAD_AND_LOCATION,
 589       vmSymbols::java_lang_IllegalAccessError(),
 590       "class %s tried to access %s%s%smethod '%s' (%s%s%s)",
 591       ref_klass->external_name(),
 592       sel_method->is_abstract()  ? "abstract "  : "",
 593       sel_method->is_protected() ? "protected " : "",
 594       sel_method->is_private()   ? "private "   : "",
 595       sel_method->external_name(),
 596       (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(),
 597       (same_module) ? "" : "; ",
 598       (same_module) ? "" : sel_klass->class_in_module_of_loader()
 599     );





























 600     return;
 601   }
 602 }
 603 
 604 Method* LinkResolver::resolve_method_statically(Bytecodes::Code code,
 605                                                 const constantPoolHandle& pool, int index, TRAPS) {
 606   // This method is used only
 607   // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
 608   // and
 609   // (2) in Bytecode_invoke::static_target
 610   // It appears to fail when applied to an invokeinterface call site.
 611   // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
 612   // resolve klass
 613   if (code == Bytecodes::_invokedynamic) {
 614     Klass* resolved_klass = SystemDictionary::MethodHandle_klass();
 615     Symbol* method_name = vmSymbols::invoke_name();
 616     Symbol* method_signature = pool->signature_ref_at(index);
 617     Klass*  current_klass = pool->pool_holder();
 618     LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
 619     return resolve_method(link_info, code, THREAD);


 898 }
 899 
 900 //------------------------------------------------------------------------------------------------------------------------
 901 // Field resolution
 902 
 903 void LinkResolver::check_field_accessability(Klass* ref_klass,
 904                                              Klass* resolved_klass,
 905                                              Klass* sel_klass,
 906                                              const fieldDescriptor& fd,
 907                                              TRAPS) {
 908   bool can_access = Reflection::verify_member_access(ref_klass,
 909                                                      resolved_klass,
 910                                                      sel_klass,
 911                                                      fd.access_flags(),
 912                                                      true, false, CHECK);
 913   // Any existing exceptions that may have been thrown, for example LinkageErrors
 914   // from nest-host resolution, have been allowed to propagate.
 915   if (!can_access) {
 916     bool same_module = (sel_klass->module() == ref_klass->module());
 917     ResourceMark rm(THREAD);
 918     Exceptions::fthrow(
 919       THREAD_AND_LOCATION,
 920       vmSymbols::java_lang_IllegalAccessError(),
 921       "class %s tried to access %s%sfield %s.%s (%s%s%s)",
 922       ref_klass->external_name(),
 923       fd.is_protected() ? "protected " : "",
 924       fd.is_private()   ? "private "   : "",
 925       sel_klass->external_name(),
 926       fd.name()->as_C_string(),
 927       (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(),
 928       (same_module) ? "" : "; ",
 929       (same_module) ? "" : sel_klass->class_in_module_of_loader()
 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,
 942                                  Bytecodes::Code byte, bool initialize_class,
 943                                  TRAPS) {
 944   assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
 945          byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield  ||
 946          byte == Bytecodes::_nofast_getfield  || byte == Bytecodes::_nofast_putfield  ||
 947          (byte == Bytecodes::_nop && !link_info.check_access()), "bad field access bytecode");
 948 
 949   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
 950   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic || byte == Bytecodes::_nofast_putfield);




 562   //
 563   // We'll check for the method name first, as that's most likely
 564   // to be false (so we'll short-circuit out of these tests).
 565   if (sel_method->name() == vmSymbols::clone_name() &&
 566       sel_klass == SystemDictionary::Object_klass() &&
 567       resolved_klass->is_array_klass()) {
 568     // We need to change "protected" to "public".
 569     assert(flags.is_protected(), "clone not protected?");
 570     jint new_flags = flags.as_int();
 571     new_flags = new_flags & (~JVM_ACC_PROTECTED);
 572     new_flags = new_flags | JVM_ACC_PUBLIC;
 573     flags.set_flags(new_flags);
 574   }
 575 //  assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
 576 
 577   bool can_access = Reflection::verify_member_access(ref_klass,
 578                                                      resolved_klass,
 579                                                      sel_klass,
 580                                                      flags,
 581                                                      true, false, CHECK);
 582   // Any existing exceptions that may have been thrown
 583   // have been allowed to propagate.
 584   if (!can_access) {
 585     ResourceMark rm(THREAD);
 586     stringStream ss;
 587     bool same_module = (sel_klass->module() == ref_klass->module());
 588     ss.print("class %s tried to access %s%s%smethod '%s' (%s%s%s)",



 589              ref_klass->external_name(),
 590              sel_method->is_abstract()  ? "abstract "  : "",
 591              sel_method->is_protected() ? "protected " : "",
 592              sel_method->is_private()   ? "private "   : "",
 593              sel_method->external_name(),
 594              (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(),
 595              (same_module) ? "" : "; ",
 596              (same_module) ? "" : sel_klass->class_in_module_of_loader()
 597              );
 598 
 599     // For private access check if there was a problem with nest host
 600     // resolution, and if so report that as part of the message.
 601     if (sel_method->is_private()) {
 602       assert(ref_klass->is_instance_klass(), "must be");
 603       assert(sel_klass->is_instance_klass(), "must be");
 604       InstanceKlass* ref_ik = InstanceKlass::cast(ref_klass);
 605       InstanceKlass* sel_ik = InstanceKlass::cast(sel_klass);
 606       const char* nest_host_error_1 = ref_ik->nest_host_resolution_error();
 607       const char* nest_host_error_2 = sel_ik->nest_host_resolution_error();
 608       if (nest_host_error_1 != NULL || nest_host_error_2 != NULL) {
 609         ss.print("(");
 610         if (nest_host_error_1 != NULL) {
 611           ss.print("%s", nest_host_error_1);
 612           if (nest_host_error_2 != NULL) {
 613             ss.print(", %s", nest_host_error_2);
 614           }
 615         } else if (nest_host_error_2 != NULL) {
 616           ss.print("%s", nest_host_error_2);
 617         }
 618         ss.print(")");
 619       }
 620     }
 621 
 622     Exceptions::fthrow(THREAD_AND_LOCATION,
 623                        vmSymbols::java_lang_IllegalAccessError(),
 624                        "%s",
 625                        ss.as_string()
 626                        );
 627     return;
 628   }
 629 }
 630 
 631 Method* LinkResolver::resolve_method_statically(Bytecodes::Code code,
 632                                                 const constantPoolHandle& pool, int index, TRAPS) {
 633   // This method is used only
 634   // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
 635   // and
 636   // (2) in Bytecode_invoke::static_target
 637   // It appears to fail when applied to an invokeinterface call site.
 638   // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
 639   // resolve klass
 640   if (code == Bytecodes::_invokedynamic) {
 641     Klass* resolved_klass = SystemDictionary::MethodHandle_klass();
 642     Symbol* method_name = vmSymbols::invoke_name();
 643     Symbol* method_signature = pool->signature_ref_at(index);
 644     Klass*  current_klass = pool->pool_holder();
 645     LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
 646     return resolve_method(link_info, code, THREAD);


 925 }
 926 
 927 //------------------------------------------------------------------------------------------------------------------------
 928 // Field resolution
 929 
 930 void LinkResolver::check_field_accessability(Klass* ref_klass,
 931                                              Klass* resolved_klass,
 932                                              Klass* sel_klass,
 933                                              const fieldDescriptor& fd,
 934                                              TRAPS) {
 935   bool can_access = Reflection::verify_member_access(ref_klass,
 936                                                      resolved_klass,
 937                                                      sel_klass,
 938                                                      fd.access_flags(),
 939                                                      true, false, CHECK);
 940   // Any existing exceptions that may have been thrown, for example LinkageErrors
 941   // from nest-host resolution, have been allowed to propagate.
 942   if (!can_access) {
 943     bool same_module = (sel_klass->module() == ref_klass->module());
 944     ResourceMark rm(THREAD);
 945     stringStream ss;
 946     ss.print("class %s tried to access %s%sfield %s.%s (%s%s%s)",


 947              ref_klass->external_name(),
 948              fd.is_protected() ? "protected " : "",
 949              fd.is_private()   ? "private "   : "",
 950              sel_klass->external_name(),
 951              fd.name()->as_C_string(),
 952              (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(),
 953              (same_module) ? "" : "; ",
 954              (same_module) ? "" : sel_klass->class_in_module_of_loader()
 955              );
 956     // For private access check if there was a problem with nest host
 957     // resolution, and if so report that as part of the message.
 958     if (fd.is_private()) {
 959       assert(ref_klass->is_instance_klass(), "must be");
 960       assert(sel_klass->is_instance_klass(), "must be");
 961       InstanceKlass* ref_ik = InstanceKlass::cast(ref_klass);
 962       InstanceKlass* sel_ik = InstanceKlass::cast(sel_klass);
 963       const char* nest_host_error_1 = ref_ik->nest_host_resolution_error();
 964       const char* nest_host_error_2 = sel_ik->nest_host_resolution_error();
 965       if (nest_host_error_1 != NULL || nest_host_error_2 != NULL) {
 966         ss.print("(");
 967         if (nest_host_error_1 != NULL) {
 968           ss.print("%s", nest_host_error_1);
 969           if (nest_host_error_2 != NULL) {
 970             ss.print(", %s", nest_host_error_2);
 971           }
 972         } else if (nest_host_error_2 != NULL) {
 973           ss.print("%s", nest_host_error_2);
 974         }
 975         ss.print(")");
 976       }
 977     }
 978     Exceptions::fthrow(THREAD_AND_LOCATION,
 979                        vmSymbols::java_lang_IllegalAccessError(),
 980                        "%s",
 981                        ss.as_string()
 982                        );
 983     return;
 984   }
 985 }
 986 
 987 void LinkResolver::resolve_field_access(fieldDescriptor& fd, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) {
 988   LinkInfo link_info(pool, index, method, CHECK);
 989   resolve_field(fd, link_info, byte, true, CHECK);
 990 }
 991 
 992 void LinkResolver::resolve_field(fieldDescriptor& fd,
 993                                  const LinkInfo& link_info,
 994                                  Bytecodes::Code byte, bool initialize_class,
 995                                  TRAPS) {
 996   assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
 997          byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield  ||
 998          byte == Bytecodes::_nofast_getfield  || byte == Bytecodes::_nofast_putfield  ||
 999          (byte == Bytecodes::_nop && !link_info.check_access()), "bad field access bytecode");
1000 
1001   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
1002   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic || byte == Bytecodes::_nofast_putfield);


< prev index next >