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;
|