1.1 --- a/src/share/vm/oops/method.cpp Tue Sep 17 23:12:27 2013 +0200 1.2 +++ b/src/share/vm/oops/method.cpp Fri Sep 13 22:38:02 2013 -0400 1.3 @@ -509,24 +509,31 @@ 1.4 return _access_flags.has_loops(); 1.5 } 1.6 1.7 +bool Method::is_final_method(AccessFlags class_access_flags) const { 1.8 + // or "does_not_require_vtable_entry" 1.9 + // overpass can occur, is not final (reuses vtable entry) 1.10 + // private methods get vtable entries for backward class compatibility. 1.11 + if (is_overpass()) return false; 1.12 + return is_final() || class_access_flags.is_final(); 1.13 +} 1.14 1.15 bool Method::is_final_method() const { 1.16 - // %%% Should return true for private methods also, 1.17 - // since there is no way to override them. 1.18 - return is_final() || method_holder()->is_final(); 1.19 + return is_final_method(method_holder()->access_flags()); 1.20 } 1.21 1.22 - 1.23 -bool Method::is_strict_method() const { 1.24 - return is_strict(); 1.25 -} 1.26 - 1.27 - 1.28 -bool Method::can_be_statically_bound() const { 1.29 - if (is_final_method()) return true; 1.30 +bool Method::can_be_statically_bound(AccessFlags class_access_flags) const { 1.31 + if (is_final_method(class_access_flags)) return true; 1.32 +#ifdef ASSERT 1.33 + bool is_nonv = (vtable_index() == nonvirtual_vtable_index); 1.34 + if (class_access_flags.is_interface()) assert(is_nonv == is_static(), err_msg("is_nonv=%s", is_nonv)); 1.35 +#endif 1.36 + assert(valid_vtable_index() || valid_itable_index(), "method must be linked before we ask this question"); 1.37 return vtable_index() == nonvirtual_vtable_index; 1.38 } 1.39 1.40 +bool Method::can_be_statically_bound() const { 1.41 + return can_be_statically_bound(method_holder()->access_flags()); 1.42 +} 1.43 1.44 bool Method::is_accessor() const { 1.45 if (code_size() != 5) return false; 1.46 @@ -967,7 +974,7 @@ 1.47 1.48 assert(ik->is_subclass_of(method_holder()), "should be subklass"); 1.49 assert(ik->vtable() != NULL, "vtable should exist"); 1.50 - if (vtable_index() == nonvirtual_vtable_index) { 1.51 + if (!has_vtable_index()) { 1.52 return false; 1.53 } else { 1.54 Method* vt_m = ik->method_at_vtable(vtable_index()); 1.55 @@ -1959,7 +1966,7 @@ 1.56 1.57 void Method::print_value_on(outputStream* st) const { 1.58 assert(is_method(), "must be method"); 1.59 - st->print_cr(internal_name()); 1.60 + st->print(internal_name()); 1.61 print_address_on(st); 1.62 st->print(" "); 1.63 name()->print_value_on(st); 1.64 @@ -1967,6 +1974,7 @@ 1.65 signature()->print_value_on(st); 1.66 st->print(" in "); 1.67 method_holder()->print_value_on(st); 1.68 + if (WizardMode) st->print("#%d", _vtable_index); 1.69 if (WizardMode) st->print("[%d,%d]", size_of_parameters(), max_locals()); 1.70 if (WizardMode && code() != NULL) st->print(" ((nmethod*)%p)", code()); 1.71 }