src/share/vm/oops/method.hpp

Print this page
rev 4269 : 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
Summary: ConstMethod::max_stack() doesn't account for JSR 292 appendix.
Reviewed-by:

*** 271,283 **** ConstantPool* constants() const { return constMethod()->constants(); } void set_constants(ConstantPool* c) { constMethod()->set_constants(c); } // max stack // return original max stack size for method verification ! int verifier_max_stack() const { return constMethod()->max_stack(); } ! int max_stack() const { return constMethod()->max_stack() + extra_stack_entries(); } ! void set_max_stack(int size) { constMethod()->set_max_stack(size); } // max locals int max_locals() const { return constMethod()->max_locals(); } void set_max_locals(int size) { constMethod()->set_max_locals(size); } --- 271,283 ---- ConstantPool* constants() const { return constMethod()->constants(); } void set_constants(ConstantPool* c) { constMethod()->set_constants(c); } // max stack // return original max stack size for method verification ! int verifier_max_stack() const { return constMethod()->max_stack() - extra_stack_entries(); } ! int max_stack() const { return constMethod()->max_stack(); } ! void set_max_stack(int size) { constMethod()->set_max_stack(size + extra_stack_entries()); } // max locals int max_locals() const { return constMethod()->max_locals(); } void set_max_locals(int size) { constMethod()->set_max_locals(size); }
*** 626,639 **** Symbol* signature, //anything at all TRAPS); static Klass* check_non_bcp_klass(Klass* klass); // these operate only on invoke methods: // presize interpreter frames for extra interpreter stack entries, if needed ! // method handles want to be able to push a few extra values (e.g., a bound receiver), and ! // invokedynamic sometimes needs to push a bootstrap method, call site, and arglist, ! // all without checking for a stack overflow ! static int extra_stack_entries() { return EnableInvokeDynamic ? 2 : 0; } static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize() // RedefineClasses() support: bool is_old() const { return access_flags().is_old(); } void set_is_old() { _access_flags.set_is_old(); } --- 626,637 ---- Symbol* signature, //anything at all TRAPS); static Klass* check_non_bcp_klass(Klass* klass); // these operate only on invoke methods: // presize interpreter frames for extra interpreter stack entries, if needed ! // Account for the extra appendix argument for invokehandle/invokedynamic ! static int extra_stack_entries() { return EnableInvokeDynamic ? 1 : 0; } static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize() // RedefineClasses() support: bool is_old() const { return access_flags().is_old(); } void set_is_old() { _access_flags.set_is_old(); }