--- old/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp 2020-01-24 19:16:59.879186270 +0000 +++ new/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp 2020-01-24 19:16:59.079401244 +0000 @@ -1697,28 +1697,17 @@ // Arrays are passed as int, elem* pair out_sig_bt[argc++] = T_INT; out_sig_bt[argc++] = T_ADDRESS; - Symbol* atype = ss.as_symbol(); - const char* at = atype->as_C_string(); - if (strlen(at) == 2) { - assert(at[0] == '[', "must be"); - switch (at[1]) { - case 'B': in_elem_bt[i] = T_BYTE; break; - case 'C': in_elem_bt[i] = T_CHAR; break; - case 'D': in_elem_bt[i] = T_DOUBLE; break; - case 'F': in_elem_bt[i] = T_FLOAT; break; - case 'I': in_elem_bt[i] = T_INT; break; - case 'J': in_elem_bt[i] = T_LONG; break; - case 'S': in_elem_bt[i] = T_SHORT; break; - case 'Z': in_elem_bt[i] = T_BOOLEAN; break; - default: ShouldNotReachHere(); - } - } + ss.skip_array_prefix(1); // skip one '[' + if (ss.is_primitive()) + in_elem_bt[i] = ss.type(); + // else what is in_elem_bt[i]? } else { out_sig_bt[argc++] = in_sig_bt[i]; in_elem_bt[i] = T_VOID; } if (in_sig_bt[i] != T_VOID) { - assert(in_sig_bt[i] == ss.type(), "must match"); + assert(in_sig_bt[i] == ss.type() || + in_sig_bt[i] == T_ARRAY, "must match"); ss.next(); } }