1917 // 3) copy the rest of the incoming signature (shifted by the number of 1918 // hidden arguments). 1919 1920 int argc = 0; 1921 if (!is_critical_native) { 1922 out_sig_bt[argc++] = T_ADDRESS; 1923 if (method->is_static()) { 1924 out_sig_bt[argc++] = T_OBJECT; 1925 } 1926 1927 for (int i = 0; i < total_in_args ; i++ ) { 1928 out_sig_bt[argc++] = in_sig_bt[i]; 1929 } 1930 } else { 1931 in_elem_bt = NEW_RESOURCE_ARRAY(BasicType, total_c_args); 1932 SignatureStream ss(method->signature()); 1933 int o = 0; 1934 for (int i = 0; i < total_in_args ; i++, o++) { 1935 if (in_sig_bt[i] == T_ARRAY) { 1936 // Arrays are passed as int, elem* pair 1937 Symbol* atype = ss.as_symbol(); 1938 const char* at = atype->as_C_string(); 1939 if (strlen(at) == 2) { 1940 assert(at[0] == '[', "must be"); 1941 switch (at[1]) { 1942 case 'B': in_elem_bt[o] = T_BYTE; break; 1943 case 'C': in_elem_bt[o] = T_CHAR; break; 1944 case 'D': in_elem_bt[o] = T_DOUBLE; break; 1945 case 'F': in_elem_bt[o] = T_FLOAT; break; 1946 case 'I': in_elem_bt[o] = T_INT; break; 1947 case 'J': in_elem_bt[o] = T_LONG; break; 1948 case 'S': in_elem_bt[o] = T_SHORT; break; 1949 case 'Z': in_elem_bt[o] = T_BOOLEAN; break; 1950 default: ShouldNotReachHere(); 1951 } 1952 } 1953 } else { 1954 in_elem_bt[o] = T_VOID; 1955 } 1956 if (in_sig_bt[i] != T_VOID) { 1957 assert(in_sig_bt[i] == ss.type(), "must match"); 1958 ss.next(); 1959 } 1960 } 1961 1962 for (int i = 0; i < total_in_args ; i++ ) { 1963 if (in_sig_bt[i] == T_ARRAY) { 1964 // Arrays are passed as int, elem* pair. 1965 out_sig_bt[argc++] = T_INT; 1966 out_sig_bt[argc++] = T_ADDRESS; 1967 } else { 1968 out_sig_bt[argc++] = in_sig_bt[i]; 1969 } 1970 } 1971 } 1972 1973 1974 // Compute the wrapper's frame size. 1975 // -------------------------------------------------------------------------- 1976 1977 // Now figure out where the args must be stored and how much stack space | 1917 // 3) copy the rest of the incoming signature (shifted by the number of 1918 // hidden arguments). 1919 1920 int argc = 0; 1921 if (!is_critical_native) { 1922 out_sig_bt[argc++] = T_ADDRESS; 1923 if (method->is_static()) { 1924 out_sig_bt[argc++] = T_OBJECT; 1925 } 1926 1927 for (int i = 0; i < total_in_args ; i++ ) { 1928 out_sig_bt[argc++] = in_sig_bt[i]; 1929 } 1930 } else { 1931 in_elem_bt = NEW_RESOURCE_ARRAY(BasicType, total_c_args); 1932 SignatureStream ss(method->signature()); 1933 int o = 0; 1934 for (int i = 0; i < total_in_args ; i++, o++) { 1935 if (in_sig_bt[i] == T_ARRAY) { 1936 // Arrays are passed as int, elem* pair 1937 ss.skip_array_prefix(1); // skip one '[' 1938 if (ss.is_primitive()) 1939 in_elem_bt[o] = ss.type(); 1940 // else what is in_elem_bt[o]? 1941 } else { 1942 in_elem_bt[o] = T_VOID; 1943 } 1944 if (in_sig_bt[i] != T_VOID) { 1945 assert(in_sig_bt[i] == ss.type() || 1946 in_sig_bt[i] == T_ARRAY, "must match"); 1947 ss.next(); 1948 } 1949 } 1950 1951 for (int i = 0; i < total_in_args ; i++ ) { 1952 if (in_sig_bt[i] == T_ARRAY) { 1953 // Arrays are passed as int, elem* pair. 1954 out_sig_bt[argc++] = T_INT; 1955 out_sig_bt[argc++] = T_ADDRESS; 1956 } else { 1957 out_sig_bt[argc++] = in_sig_bt[i]; 1958 } 1959 } 1960 } 1961 1962 1963 // Compute the wrapper's frame size. 1964 // -------------------------------------------------------------------------- 1965 1966 // Now figure out where the args must be stored and how much stack space |