< prev index next >

src/hotspot/share/code/compiledMethod.cpp

Print this page
@@ -379,11 +379,22 @@
      // Bytecode can be inaccurate in such case.
      Method* callee = attached_method_before_pc(pc);
      if (callee != nullptr) {
        has_receiver = !(callee->access_flags().is_static());
        has_appendix = false;
-       signature    = callee->signature();
+       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 (is_compiled_by_c2() && callee->has_scalarized_args()) {
+         const GrowableArray<SigEntry>* sig = callee->adapter()->get_sig_cc();
+         assert(sig != nullptr, "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);
  
        Bytecode_invoke call(methodHandle(Thread::current(), ssd.method()), ssd.bci());
        has_receiver = call.has_receiver();
< prev index next >