< prev index next >

src/hotspot/cpu/s390/sharedRuntime_s390.cpp

Print this page




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).


< prev index next >