src/share/vm/oops/method.cpp

changeset 5732
b2e698d2276c
parent 5638
8947af8a9cec
child 5792
510fbd28919c
     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  }

mercurial