< prev index next >

src/share/vm/interpreter/linkResolver.cpp

Print this page




 841     jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
 842                  Method::name_and_sig_as_C_string(resolved_klass(),
 843                  resolved_method->name(), resolved_method->signature()));
 844     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 845   }
 846 
 847   if (code == Bytecodes::_invokeinterface && resolved_method->is_private()) {
 848     ResourceMark rm(THREAD);
 849     char buf[200];
 850 
 851     KlassHandle current_klass = link_info.current_klass();
 852     jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokeinterface: method %s, caller-class:%s",
 853                  Method::name_and_sig_as_C_string(resolved_klass(),
 854                                                   resolved_method->name(),
 855                                                   resolved_method->signature()),
 856                                                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
 857      THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 858   }
 859 
 860   if (log_develop_is_enabled(Trace, itables)) {
 861     trace_method_resolution("invokeinterface resolved method: caller-class",
 862                             link_info.current_klass(), resolved_klass,


 863                             resolved_method, true);
 864   }
 865 
 866   return resolved_method;
 867 }
 868 
 869 //------------------------------------------------------------------------------------------------------------------------
 870 // Field resolution
 871 
 872 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
 873                                              KlassHandle resolved_klass,
 874                                              KlassHandle sel_klass,
 875                                              const fieldDescriptor& fd,
 876                                              TRAPS) {
 877   if (!Reflection::verify_field_access(ref_klass(),
 878                                        resolved_klass(),
 879                                        sel_klass(),
 880                                        fd.access_flags(),
 881                                        true)) {
 882     ResourceMark rm(THREAD);


1407   }
1408   // check access
1409   // Throw Illegal Access Error if sel_method is not public.
1410   if (!sel_method->is_public()) {
1411     ResourceMark rm(THREAD);
1412     THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
1413               Method::name_and_sig_as_C_string(recv_klass(),
1414                                                sel_method->name(),
1415                                                sel_method->signature()));
1416   }
1417   // check if abstract
1418   if (check_null_and_abstract && sel_method->is_abstract()) {
1419     ResourceMark rm(THREAD);
1420     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1421               Method::name_and_sig_as_C_string(recv_klass(),
1422                                                       sel_method->name(),
1423                                                       sel_method->signature()));
1424   }
1425 
1426   if (log_develop_is_enabled(Trace, itables)) {
1427     trace_method_resolution("invokeinterface selected method: receiver-class",
1428                             recv_klass, resolved_klass, sel_method, true);
1429   }
1430   // setup result
1431   if (!resolved_method->has_itable_index()) {
1432     int vtable_index = resolved_method->vtable_index();
1433     assert(vtable_index == sel_method->vtable_index(), "sanity check");
1434     result.set_virtual(resolved_klass, recv_klass, resolved_method, sel_method, vtable_index, CHECK);
1435   } else {
1436     int itable_index = resolved_method()->itable_index();
1437     result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, itable_index, CHECK);
1438   }
1439 }
1440 
1441 
1442 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
1443                                                  const LinkInfo& link_info) {
1444   EXCEPTION_MARK;
1445   methodHandle method_result = linktime_resolve_interface_method(link_info, THREAD);
1446   if (HAS_PENDING_EXCEPTION) {
1447     CLEAR_PENDING_EXCEPTION;




 841     jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
 842                  Method::name_and_sig_as_C_string(resolved_klass(),
 843                  resolved_method->name(), resolved_method->signature()));
 844     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 845   }
 846 
 847   if (code == Bytecodes::_invokeinterface && resolved_method->is_private()) {
 848     ResourceMark rm(THREAD);
 849     char buf[200];
 850 
 851     KlassHandle current_klass = link_info.current_klass();
 852     jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokeinterface: method %s, caller-class:%s",
 853                  Method::name_and_sig_as_C_string(resolved_klass(),
 854                                                   resolved_method->name(),
 855                                                   resolved_method->signature()),
 856                                                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
 857      THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 858   }
 859 
 860   if (log_develop_is_enabled(Trace, itables)) {
 861     char buf[200];
 862     jio_snprintf(buf, sizeof(buf), "%s resolved interface method: caller-class:",
 863                  Bytecodes::name(code));
 864     trace_method_resolution(buf, link_info.current_klass(), resolved_klass,
 865                             resolved_method, true);
 866   }
 867 
 868   return resolved_method;
 869 }
 870 
 871 //------------------------------------------------------------------------------------------------------------------------
 872 // Field resolution
 873 
 874 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
 875                                              KlassHandle resolved_klass,
 876                                              KlassHandle sel_klass,
 877                                              const fieldDescriptor& fd,
 878                                              TRAPS) {
 879   if (!Reflection::verify_field_access(ref_klass(),
 880                                        resolved_klass(),
 881                                        sel_klass(),
 882                                        fd.access_flags(),
 883                                        true)) {
 884     ResourceMark rm(THREAD);


1409   }
1410   // check access
1411   // Throw Illegal Access Error if sel_method is not public.
1412   if (!sel_method->is_public()) {
1413     ResourceMark rm(THREAD);
1414     THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
1415               Method::name_and_sig_as_C_string(recv_klass(),
1416                                                sel_method->name(),
1417                                                sel_method->signature()));
1418   }
1419   // check if abstract
1420   if (check_null_and_abstract && sel_method->is_abstract()) {
1421     ResourceMark rm(THREAD);
1422     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1423               Method::name_and_sig_as_C_string(recv_klass(),
1424                                                       sel_method->name(),
1425                                                       sel_method->signature()));
1426   }
1427 
1428   if (log_develop_is_enabled(Trace, itables)) {
1429     trace_method_resolution("invokeinterface selected method: receiver-class:",
1430                             recv_klass, resolved_klass, sel_method, true);
1431   }
1432   // setup result
1433   if (!resolved_method->has_itable_index()) {
1434     int vtable_index = resolved_method->vtable_index();
1435     assert(vtable_index == sel_method->vtable_index(), "sanity check");
1436     result.set_virtual(resolved_klass, recv_klass, resolved_method, sel_method, vtable_index, CHECK);
1437   } else {
1438     int itable_index = resolved_method()->itable_index();
1439     result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, itable_index, CHECK);
1440   }
1441 }
1442 
1443 
1444 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
1445                                                  const LinkInfo& link_info) {
1446   EXCEPTION_MARK;
1447   methodHandle method_result = linktime_resolve_interface_method(link_info, THREAD);
1448   if (HAS_PENDING_EXCEPTION) {
1449     CLEAR_PENDING_EXCEPTION;


< prev index next >