--- old/src/share/vm/ci/ciMethod.cpp 2014-03-20 11:29:01.718631955 +0100 +++ new/src/share/vm/ci/ciMethod.cpp 2014-03-20 11:29:01.199269805 +0100 @@ -80,6 +80,7 @@ _code_size = h_m()->code_size(); _intrinsic_id = h_m()->intrinsic_id(); _handler_count = h_m()->exception_table_length(); + _size_of_parameters = h_m()->size_of_parameters(); _uses_monitors = h_m()->access_flags().has_monitor_bytecodes(); _balanced_monitors = !_uses_monitors || h_m()->access_flags().is_monitor_matching(); _is_c1_compilable = !h_m()->is_not_c1_compilable(); @@ -877,6 +878,27 @@ return iter.get_method(will_link, declared_signature); } +// How much stack slots is this invoke going to add or remove? +int ciMethod::get_stack_effect_at_invoke(int bci, Bytecodes::Code code, int& inputs) { + assert(Bytecodes::is_invoke(code), "not an invoke"); + bool ignored_will_link; + ciSignature* declared_signature = NULL; + ciMethod* ignored_callee = get_method_at_bci(bci, ignored_will_link, &declared_signature); + assert(declared_signature != NULL, "cannot be null"); + inputs = declared_signature->arg_size_for_bc(code); + int size = declared_signature->return_type()->size(); + return size - inputs; +} + +int ciMethod::get_stack_effect_if_at_invoke(int bci) { + Bytecodes::Code code = java_code_at_bci(bci); + if (Bytecodes::is_invoke(code)) { + int ignored = 0; + return get_stack_effect_at_invoke(bci, code, ignored); + } + return 0; +} + // ------------------------------------------------------------------ // Adjust a CounterData count to be commensurate with // interpreter_invocation_count. If the MDO exists for