src/share/vm/interpreter/linkResolver.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/interpreter/linkResolver.cpp
src/share/vm/interpreter/linkResolver.cpp
Print this page
*** 96,106 ****
methodHandle resolved_method,
methodHandle selected_method,
CallKind kind,
int index,
TRAPS) {
! assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
_resolved_klass = resolved_klass;
_selected_klass = selected_klass;
_resolved_method = resolved_method;
_selected_method = selected_method;
_call_kind = kind;
--- 96,106 ----
methodHandle resolved_method,
methodHandle selected_method,
CallKind kind,
int index,
TRAPS) {
! assert(resolved_method->signature()->equals(selected_method->signature()), "signatures must correspond");
_resolved_klass = resolved_klass;
_selected_klass = selected_klass;
_resolved_method = resolved_method;
_selected_method = selected_method;
_call_kind = kind;
*** 166,179 ****
#ifdef ASSERT
// Ensure that this is really the case.
KlassHandle object_klass = SystemDictionary::Object_klass();
Method * object_resolved_method = object_klass()->vtable()->method_at(index);
! assert(object_resolved_method->name() == resolved_method->name(),
err_msg("Object and interface method names should match at vtable index %d, %s != %s",
index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string()));
! assert(object_resolved_method->signature() == resolved_method->signature(),
err_msg("Object and interface method signatures should match at vtable index %d, %s != %s",
index, object_resolved_method->signature()->as_C_string(), resolved_method->signature()->as_C_string()));
#endif // ASSERT
kind = CallInfo::vtable_call;
--- 166,179 ----
#ifdef ASSERT
// Ensure that this is really the case.
KlassHandle object_klass = SystemDictionary::Object_klass();
Method * object_resolved_method = object_klass()->vtable()->method_at(index);
! assert(object_resolved_method->name()->equals(resolved_method->name()),
err_msg("Object and interface method names should match at vtable index %d, %s != %s",
index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string()));
! assert(object_resolved_method->signature()->equals(resolved_method->signature()),
err_msg("Object and interface method signatures should match at vtable index %d, %s != %s",
index, object_resolved_method->signature()->as_C_string(), resolved_method->signature()->as_C_string()));
#endif // ASSERT
kind = CallInfo::vtable_call;
*** 460,470 ****
// is java.lang.Object and the method is "clone", set the flags
// to public.
//
// We'll check for the method name first, as that's most likely
// to be false (so we'll short-circuit out of these tests).
! if (sel_method->name() == vmSymbols::clone_name() &&
sel_klass() == SystemDictionary::Object_klass() &&
resolved_klass->oop_is_array()) {
// We need to change "protected" to "public".
assert(flags.is_protected(), "clone not protected?");
jint new_flags = flags.as_int();
--- 460,470 ----
// is java.lang.Object and the method is "clone", set the flags
// to public.
//
// We'll check for the method name first, as that's most likely
// to be false (so we'll short-circuit out of these tests).
! if (sel_method->name()->equals(vmSymbols::clone_name()) &&
sel_klass() == SystemDictionary::Object_klass() &&
resolved_klass->oop_is_array()) {
// We need to change "protected" to "public".
assert(flags.is_protected(), "clone not protected?");
jint new_flags = flags.as_int();
*** 898,908 ****
if (!resolved_klass->is_interface()) {
resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
} else {
resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
}
! assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
// check if static
if (!resolved_method->is_static()) {
ResourceMark rm(THREAD);
char buf[200];
--- 898,908 ----
if (!resolved_klass->is_interface()) {
resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
} else {
resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
}
! assert(resolved_method->name()->not_equals(vmSymbols::class_initializer_name()), "should have been checked in verifier");
// check if static
if (!resolved_method->is_static()) {
ResourceMark rm(THREAD);
char buf[200];
*** 938,948 ****
} else {
resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
}
// check if method name is <init>, that it is found in same klass as static type
! if (resolved_method->name() == vmSymbols::object_initializer_name() &&
resolved_method->method_holder() != resolved_klass()) {
ResourceMark rm(THREAD);
Exceptions::fthrow(
THREAD_AND_LOCATION,
vmSymbols::java_lang_NoSuchMethodError(),
--- 938,948 ----
} else {
resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
}
// check if method name is <init>, that it is found in same klass as static type
! if (resolved_method->name()->equals(vmSymbols::object_initializer_name()) &&
resolved_method->method_holder() != resolved_klass()) {
ResourceMark rm(THREAD);
Exceptions::fthrow(
THREAD_AND_LOCATION,
vmSymbols::java_lang_NoSuchMethodError(),
*** 1032,1042 ****
// This check is not performed for super.invoke for interface methods
// in super interfaces.
current_klass->is_subclass_of(resolved_klass()) &&
current_klass() != resolved_klass() &&
// c) check if the method is not <init>
! resolved_method->name() != vmSymbols::object_initializer_name()) {
// Lookup super method
KlassHandle super_klass(THREAD, current_klass->super());
lookup_instance_method_in_klasses(sel_method, super_klass,
resolved_method->name(),
resolved_method->signature(), CHECK);
--- 1032,1042 ----
// This check is not performed for super.invoke for interface methods
// in super interfaces.
current_klass->is_subclass_of(resolved_klass()) &&
current_klass() != resolved_klass() &&
// c) check if the method is not <init>
! resolved_method->name()->not_equals(vmSymbols::object_initializer_name())) {
// Lookup super method
KlassHandle super_klass(THREAD, current_klass->super());
lookup_instance_method_in_klasses(sel_method, super_klass,
resolved_method->name(),
resolved_method->signature(), CHECK);
*** 1106,1117 ****
Symbol* method_name, Symbol* method_signature,
KlassHandle current_klass, bool check_access, TRAPS) {
// normal method resolution
resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
! assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
! assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
// check if private interface method
if (resolved_klass->is_interface() && resolved_method->is_private()) {
ResourceMark rm(THREAD);
char buf[200];
--- 1106,1117 ----
Symbol* method_name, Symbol* method_signature,
KlassHandle current_klass, bool check_access, TRAPS) {
// normal method resolution
resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
! assert(resolved_method->name()->not_equals(vmSymbols::object_initializer_name()), "should have been checked in verifier");
! assert(resolved_method->name()->not_equals(vmSymbols::class_initializer_name ()), "should have been checked in verifier");
// check if private interface method
if (resolved_klass->is_interface() && resolved_method->is_private()) {
ResourceMark rm(THREAD);
char buf[200];
*** 1262,1273 ****
void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
// normal interface method resolution
resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
! assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
! assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
}
// throws runtime exceptions
void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
--- 1262,1273 ----
void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
// normal interface method resolution
resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
! assert(resolved_method->name()->not_equals(vmSymbols::object_initializer_name()), "should have been checked in verifier");
! assert(resolved_method->name()->not_equals(vmSymbols::class_initializer_name ()), "should have been checked in verifier");
}
// throws runtime exceptions
void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
src/share/vm/interpreter/linkResolver.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File