1609 // 3) copy the rest of the incoming signature (shifted by the number of 1610 // hidden arguments) 1611 1612 int argc = 0; 1613 if (!is_critical_native) { 1614 out_sig_bt[argc++] = T_ADDRESS; 1615 if (method->is_static()) { 1616 out_sig_bt[argc++] = T_OBJECT; 1617 } 1618 1619 for (int i = 0; i < total_in_args; i++) { 1620 out_sig_bt[argc++] = in_sig_bt[i]; 1621 } 1622 } else { 1623 in_elem_bt = NEW_RESOURCE_ARRAY(BasicType, total_in_args); 1624 SignatureStream ss(method->signature()); 1625 int o = 0; 1626 for (int i = 0; i < total_in_args; i++, o++) { 1627 if (in_sig_bt[i] == T_ARRAY) { 1628 // Arrays are passed as tuples (int, elem*). 1629 Symbol* atype = ss.as_symbol(); 1630 const char* at = atype->as_C_string(); 1631 if (strlen(at) == 2) { 1632 assert(at[0] == '[', "must be"); 1633 switch (at[1]) { 1634 case 'B': in_elem_bt[o] = T_BYTE; break; 1635 case 'C': in_elem_bt[o] = T_CHAR; break; 1636 case 'D': in_elem_bt[o] = T_DOUBLE; break; 1637 case 'F': in_elem_bt[o] = T_FLOAT; break; 1638 case 'I': in_elem_bt[o] = T_INT; break; 1639 case 'J': in_elem_bt[o] = T_LONG; break; 1640 case 'S': in_elem_bt[o] = T_SHORT; break; 1641 case 'Z': in_elem_bt[o] = T_BOOLEAN; break; 1642 default: ShouldNotReachHere(); 1643 } 1644 } 1645 } else { 1646 in_elem_bt[o] = T_VOID; 1647 } 1648 if (in_sig_bt[i] != T_VOID) { 1649 assert(in_sig_bt[i] == ss.type(), "must match"); 1650 ss.next(); 1651 } 1652 } 1653 assert(total_in_args == o, "must match"); 1654 1655 for (int i = 0; i < total_in_args; i++) { 1656 if (in_sig_bt[i] == T_ARRAY) { 1657 // Arrays are passed as tuples (int, elem*). 1658 out_sig_bt[argc++] = T_INT; 1659 out_sig_bt[argc++] = T_ADDRESS; 1660 } else { 1661 out_sig_bt[argc++] = in_sig_bt[i]; 1662 } 1663 } 1664 } 1665 1666 /////////////////////////////////////////////////////////////////////// 1667 // Now figure out where the args must be stored and how much stack space 1668 // they require (neglecting out_preserve_stack_slots but providing space 1669 // for storing the first five register arguments). | 1609 // 3) copy the rest of the incoming signature (shifted by the number of 1610 // hidden arguments) 1611 1612 int argc = 0; 1613 if (!is_critical_native) { 1614 out_sig_bt[argc++] = T_ADDRESS; 1615 if (method->is_static()) { 1616 out_sig_bt[argc++] = T_OBJECT; 1617 } 1618 1619 for (int i = 0; i < total_in_args; i++) { 1620 out_sig_bt[argc++] = in_sig_bt[i]; 1621 } 1622 } else { 1623 in_elem_bt = NEW_RESOURCE_ARRAY(BasicType, total_in_args); 1624 SignatureStream ss(method->signature()); 1625 int o = 0; 1626 for (int i = 0; i < total_in_args; i++, o++) { 1627 if (in_sig_bt[i] == T_ARRAY) { 1628 // Arrays are passed as tuples (int, elem*). 1629 ss.skip_array_prefix(1); // skip one '[' 1630 if (ss.is_primitive()) 1631 in_elem_bt[o] = ss.type(); 1632 // else what is in_elem_bt[o]? 1633 } else { 1634 in_elem_bt[o] = T_VOID; 1635 } 1636 if (in_sig_bt[i] != T_VOID) { 1637 assert(in_sig_bt[i] == ss.type() || 1638 in_sig_bt[i] == T_ARRAY, "must match"); 1639 ss.next(); 1640 } 1641 } 1642 assert(total_in_args == o, "must match"); 1643 1644 for (int i = 0; i < total_in_args; i++) { 1645 if (in_sig_bt[i] == T_ARRAY) { 1646 // Arrays are passed as tuples (int, elem*). 1647 out_sig_bt[argc++] = T_INT; 1648 out_sig_bt[argc++] = T_ADDRESS; 1649 } else { 1650 out_sig_bt[argc++] = in_sig_bt[i]; 1651 } 1652 } 1653 } 1654 1655 /////////////////////////////////////////////////////////////////////// 1656 // Now figure out where the args must be stored and how much stack space 1657 // they require (neglecting out_preserve_stack_slots but providing space 1658 // for storing the first five register arguments). |