--- old/src/share/vm/code/nmethod.cpp 2017-07-26 10:59:32.784078235 +0200 +++ new/src/share/vm/code/nmethod.cpp 2017-07-26 10:59:32.696078239 +0200 @@ -2545,32 +2545,35 @@ } if (m.not_null() && !is_osr_method()) { ResourceMark rm; - int sizeargs = m->size_of_parameters(); - BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sizeargs); - VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, sizeargs); - { - int sig_index = 0; - if (!m->is_static()) - sig_bt[sig_index++] = T_OBJECT; // 'this' - for (SignatureStream ss(m->signature()); !ss.at_return_type(); ss.next()) { - BasicType t = ss.type(); - sig_bt[sig_index++] = t; - if (type2size[t] == 2) { - sig_bt[sig_index++] = T_VOID; - } else { - assert(type2size[t] == 1, "size is 1 or 2"); - } + int sizeargs = 0; + BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, 256); + VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, 256); + Symbol* sig = m->signature(); + bool has_value_arg = false; + if (ValueTypePassFieldsAsArgs && m->adapter()->get_sig_extended() != NULL) { + // Use extended signature if value type arguments are passed as fields + sig = m->adapter()->get_sig_extended(); + has_value_arg = true; + } else if (!m->is_static()) { + sig_bt[sizeargs++] = T_OBJECT; // 'this' + } + for (SignatureStream ss(sig); !ss.at_return_type(); ss.next()) { + BasicType t = ss.type(); + sig_bt[sizeargs++] = t; + if (type2size[t] == 2) { + sig_bt[sizeargs++] = T_VOID; + } else { + assert(type2size[t] == 1, "size is 1 or 2"); } - assert(sig_index == sizeargs, ""); } const char* spname = "sp"; // make arch-specific? intptr_t out_preserve = SharedRuntime::java_calling_convention(sig_bt, regs, sizeargs, false); int stack_slot_offset = this->frame_size() * wordSize; int tab1 = 14, tab2 = 24; int sig_index = 0; - int arg_index = (m->is_static() ? 0 : -1); + int arg_index = ((m->is_static() || has_value_arg) ? 0 : -1); bool did_old_sp = false; - for (SignatureStream ss(m->signature()); !ss.at_return_type(); ) { + for (SignatureStream ss(sig); !ss.at_return_type(); ) { bool at_this = (arg_index == -1); bool at_old_sp = false; BasicType t = (at_this ? T_OBJECT : ss.type());