< prev index next > src/hotspot/share/code/compiledMethod.cpp
Print this page
// Method that knows how to preserve outgoing arguments at call. This method must be
// called with a frame corresponding to a Java invoke
void CompiledMethod::preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f) {
if (method() != NULL && !method()->is_native()) {
address pc = fr.pc();
- SimpleScopeDesc ssd(this, pc);
- if (ssd.is_optimized_linkToNative()) return; // call was replaced
- Bytecode_invoke call(methodHandle(Thread::current(), ssd.method()), ssd.bci());
- bool has_receiver = call.has_receiver();
- bool has_appendix = call.has_appendix();
- Symbol* signature = call.signature();
-
// The method attached by JIT-compilers should be used, if present.
// Bytecode can be inaccurate in such case.
Method* callee = attached_method_before_pc(pc);
if (callee != NULL) {
has_receiver = !(callee->access_flags().is_static());
has_appendix = false;
signature = callee->signature();
}
fr.oops_compiled_arguments_do(signature, has_receiver, has_appendix, reg_map, f);
}
}
// Method that knows how to preserve outgoing arguments at call. This method must be
// called with a frame corresponding to a Java invoke
void CompiledMethod::preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f) {
if (method() != NULL && !method()->is_native()) {
address pc = fr.pc();
// The method attached by JIT-compilers should be used, if present.
// Bytecode can be inaccurate in such case.
Method* callee = attached_method_before_pc(pc);
+ bool has_receiver = false;
+ bool has_appendix = false;
+ Symbol* signature = NULL;
if (callee != NULL) {
has_receiver = !(callee->access_flags().is_static());
has_appendix = false;
signature = callee->signature();
+
+ // If inline types are passed as fields, use the extended signature
+ // which contains the types of all (oop) fields of the inline type.
+ if (this->is_compiled_by_c2() && callee->has_scalarized_args()) {
+ const GrowableArray<SigEntry>* sig = callee->adapter()->get_sig_cc();
+ assert(sig != NULL, "sig should never be null");
+ TempNewSymbol tmp_sig = SigEntry::create_symbol(sig);
+ has_receiver = false; // The extended signature contains the receiver type
+ fr.oops_compiled_arguments_do(tmp_sig, has_receiver, has_appendix, reg_map, f);
+ return;
+ }
+ } else {
+ SimpleScopeDesc ssd(this, pc);
+ if (ssd.is_optimized_linkToNative()) return; // call was replaced
+ Bytecode_invoke call(methodHandle(Thread::current(), ssd.method()), ssd.bci());
+ has_receiver = call.has_receiver();
+ has_appendix = call.has_appendix();
+ signature = call.signature();
}
fr.oops_compiled_arguments_do(signature, has_receiver, has_appendix, reg_map, f);
}
}
< prev index next >