2128 jlsValue->char_at_addr(jlsOffset);
2129 (void) UNICODE::as_utf8(jlsPos, jlsLen, (char *)dst, max_dtrace_string_size);
2130 }
2131 #endif // ndef HAVE_DTRACE_H
2132
2133 // -------------------------------------------------------------------------
2134 // Java-Java calling convention
2135 // (what you use when Java calls Java)
2136
2137 //------------------------------name_for_receiver----------------------------------
2138 // For a given signature, return the VMReg for parameter 0.
2139 VMReg SharedRuntime::name_for_receiver() {
2140 VMRegPair regs;
2141 BasicType sig_bt = T_OBJECT;
2142 (void) java_calling_convention(&sig_bt, ®s, 1, true);
2143 // Return argument 0 register. In the LP64 build pointers
2144 // take 2 registers, but the VM wants only the 'main' name.
2145 return regs.first();
2146 }
2147
2148 VMRegPair *SharedRuntime::find_callee_arguments(symbolOop sig, bool is_static, int* arg_size) {
2149 // This method is returning a data structure allocating as a
2150 // ResourceObject, so do not put any ResourceMarks in here.
2151 char *s = sig->as_C_string();
2152 int len = (int)strlen(s);
2153 *s++; len--; // Skip opening paren
2154 char *t = s+len;
2155 while( *(--t) != ')' ) ; // Find close paren
2156
2157 BasicType *sig_bt = NEW_RESOURCE_ARRAY( BasicType, 256 );
2158 VMRegPair *regs = NEW_RESOURCE_ARRAY( VMRegPair, 256 );
2159 int cnt = 0;
2160 if (!is_static) {
2161 sig_bt[cnt++] = T_OBJECT; // Receiver is argument 0; not in signature
2162 }
2163
2164 while( s < t ) {
2165 switch( *s++ ) { // Switch on signature character
2166 case 'B': sig_bt[cnt++] = T_BYTE; break;
2167 case 'C': sig_bt[cnt++] = T_CHAR; break;
2168 case 'D': sig_bt[cnt++] = T_DOUBLE; sig_bt[cnt++] = T_VOID; break;
2169 case 'F': sig_bt[cnt++] = T_FLOAT; break;
2170 case 'I': sig_bt[cnt++] = T_INT; break;
2171 case 'J': sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break;
2172 case 'S': sig_bt[cnt++] = T_SHORT; break;
2173 case 'Z': sig_bt[cnt++] = T_BOOLEAN; break;
2174 case 'V': sig_bt[cnt++] = T_VOID; break;
2175 case 'L': // Oop
2176 while( *s++ != ';' ) ; // Skip signature
2177 sig_bt[cnt++] = T_OBJECT;
2178 break;
2179 case '[': { // Array
2180 do { // Skip optional size
|
2128 jlsValue->char_at_addr(jlsOffset);
2129 (void) UNICODE::as_utf8(jlsPos, jlsLen, (char *)dst, max_dtrace_string_size);
2130 }
2131 #endif // ndef HAVE_DTRACE_H
2132
2133 // -------------------------------------------------------------------------
2134 // Java-Java calling convention
2135 // (what you use when Java calls Java)
2136
2137 //------------------------------name_for_receiver----------------------------------
2138 // For a given signature, return the VMReg for parameter 0.
2139 VMReg SharedRuntime::name_for_receiver() {
2140 VMRegPair regs;
2141 BasicType sig_bt = T_OBJECT;
2142 (void) java_calling_convention(&sig_bt, ®s, 1, true);
2143 // Return argument 0 register. In the LP64 build pointers
2144 // take 2 registers, but the VM wants only the 'main' name.
2145 return regs.first();
2146 }
2147
2148 VMRegPair *SharedRuntime::find_callee_arguments(symbolOop sig, bool has_receiver, int* arg_size) {
2149 // This method is returning a data structure allocating as a
2150 // ResourceObject, so do not put any ResourceMarks in here.
2151 char *s = sig->as_C_string();
2152 int len = (int)strlen(s);
2153 *s++; len--; // Skip opening paren
2154 char *t = s+len;
2155 while( *(--t) != ')' ) ; // Find close paren
2156
2157 BasicType *sig_bt = NEW_RESOURCE_ARRAY( BasicType, 256 );
2158 VMRegPair *regs = NEW_RESOURCE_ARRAY( VMRegPair, 256 );
2159 int cnt = 0;
2160 if (has_receiver) {
2161 sig_bt[cnt++] = T_OBJECT; // Receiver is argument 0; not in signature
2162 }
2163
2164 while( s < t ) {
2165 switch( *s++ ) { // Switch on signature character
2166 case 'B': sig_bt[cnt++] = T_BYTE; break;
2167 case 'C': sig_bt[cnt++] = T_CHAR; break;
2168 case 'D': sig_bt[cnt++] = T_DOUBLE; sig_bt[cnt++] = T_VOID; break;
2169 case 'F': sig_bt[cnt++] = T_FLOAT; break;
2170 case 'I': sig_bt[cnt++] = T_INT; break;
2171 case 'J': sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break;
2172 case 'S': sig_bt[cnt++] = T_SHORT; break;
2173 case 'Z': sig_bt[cnt++] = T_BOOLEAN; break;
2174 case 'V': sig_bt[cnt++] = T_VOID; break;
2175 case 'L': // Oop
2176 while( *s++ != ';' ) ; // Skip signature
2177 sig_bt[cnt++] = T_OBJECT;
2178 break;
2179 case '[': { // Array
2180 do { // Skip optional size
|