src/share/vm/oops/method.cpp

Print this page

        

*** 579,598 **** bool Method::can_be_statically_bound() const { return can_be_statically_bound(method_holder()->access_flags()); } ! bool Method::is_accessor() const { if (code_size() != 5) return false; if (size_of_parameters() != 1) return false; if (java_code_at(0) != Bytecodes::_aload_0 ) return false; if (java_code_at(1) != Bytecodes::_getfield) return false; if (java_code_at(4) != Bytecodes::_areturn && java_code_at(4) != Bytecodes::_ireturn ) return false; return true; } bool Method::is_constant_getter() const { int last_index = code_size() - 1; // Check if the first 1-3 bytecodes are a constant push // and the last bytecode is a return. return (2 <= code_size() && code_size() <= 4 && --- 579,639 ---- bool Method::can_be_statically_bound() const { return can_be_statically_bound(method_holder()->access_flags()); } ! bool Method::is_simple_accessor() const { if (code_size() != 5) return false; if (size_of_parameters() != 1) return false; if (java_code_at(0) != Bytecodes::_aload_0 ) return false; if (java_code_at(1) != Bytecodes::_getfield) return false; if (java_code_at(4) != Bytecodes::_areturn && java_code_at(4) != Bytecodes::_ireturn ) return false; return true; } + bool Method::is_accessor() const { + if (code_size() == 5) { // potential getter + if (size_of_parameters() != 1) return false; + if (java_code_at(0) != Bytecodes::_aload_0) return false; + if (java_code_at(1) != Bytecodes::_getfield) return false; + switch (java_code_at(4)) { + case Bytecodes::_ireturn: + case Bytecodes::_lreturn: + case Bytecodes::_freturn: + case Bytecodes::_dreturn: + case Bytecodes::_areturn: + break; + default: + return false; + } + return true; + } + + if (code_size() == 6) { // potential setter + if (java_code_at(0) != Bytecodes::_aload_0) return false; + switch (java_code_at(1)) { + case Bytecodes::_iload_1: + case Bytecodes::_aload_1: + case Bytecodes::_fload_1: + if (size_of_parameters() != 2) return false; + break; + case Bytecodes::_dload_1: + case Bytecodes::_lload_1: + if (size_of_parameters() != 3) return false; + break; + default: + return false; + } + if (java_code_at(2) != Bytecodes::_putfield) return false; + if (java_code_at(5) != Bytecodes::_return) return false; + return true; + } + + return false; + } + bool Method::is_constant_getter() const { int last_index = code_size() - 1; // Check if the first 1-3 bytecodes are a constant push // and the last bytecode is a return. return (2 <= code_size() && code_size() <= 4 &&