src/share/vm/oops/method.hpp
Print this page
rev 4376 : 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:
*** 152,161 ****
--- 152,167 ----
nmethod* volatile _code; // Points to the corresponding piece of native code
volatile address _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry
// Constructor
Method(ConstMethod* xconst, AccessFlags access_flags, int size);
+
+ // this operates 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; }
+
public:
static Method* allocate(ClassLoaderData* loader_data,
int byte_code_size,
AccessFlags access_flags,
*** 272,284 ****
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); }
--- 278,290 ----
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); }
*** 628,644 ****
bool has_member_arg() const; // intrinsic_id() == vmIntrinsics::_linkToSpecial, etc.
static methodHandle make_method_handle_intrinsic(vmIntrinsics::ID iid, // _invokeBasic, _linkToVirtual
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(); }
bool is_obsolete() const { return access_flags().is_obsolete(); }
--- 634,643 ----