< prev index next >

src/hotspot/share/code/compiledMethod.cpp

Print this page
@@ -357,24 +357,38 @@
  // 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);
+     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 >