187 Symbol* klass_name = klass->name(); 188 klass_name->as_klass_external_name(buf, size); 189 int len = (int)strlen(buf); 190 191 if (len < size - 1) { 192 buf[len++] = '.'; 193 194 method_name->as_C_string(&(buf[len]), size - len); 195 len = (int)strlen(buf); 196 197 signature->as_C_string(&(buf[len]), size - len); 198 } 199 200 return buf; 201 } 202 203 const char* Method::external_name() const { 204 return external_name(constants()->pool_holder(), name(), signature()); 205 } 206 207 void Method::print_external_name(outputStream *os) const { 208 print_external_name(os, constants()->pool_holder(), name(), signature()); 209 } 210 211 const char* Method::external_name(Klass* klass, Symbol* method_name, Symbol* signature) { 212 stringStream ss; 213 print_external_name(&ss, klass, method_name, signature); 214 return ss.as_string(); 215 } 216 217 void Method::print_external_name(outputStream *os, Klass* klass, Symbol* method_name, Symbol* signature) { 218 signature->print_as_signature_external_return_type(os); 219 os->print(" %s.%s(", klass->external_name(), method_name->as_C_string()); 220 signature->print_as_signature_external_parameters(os); 221 os->print(")"); 222 } 223 224 int Method::fast_exception_handler_bci_for(const methodHandle& mh, Klass* ex_klass, int throw_bci, TRAPS) { 225 // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index) 226 // access exception table 227 ExceptionTable table(mh()); 228 int length = table.length(); 229 // iterate through all entries sequentially 230 constantPoolHandle pool(THREAD, mh->constants()); 231 for (int i = 0; i < length; i ++) { 232 //reacquire the table in case a GC happened 233 ExceptionTable table(mh()); 234 int beg_bci = table.start_pc(i); 235 int end_bci = table.end_pc(i); 236 assert(beg_bci <= end_bci, "inconsistent exception table"); 237 if (beg_bci <= throw_bci && throw_bci < end_bci) { 238 // exception handler bci range covers throw_bci => investigate further 239 int handler_bci = table.handler_pc(i); 240 int klass_index = table.catch_type_index(i); 241 if (klass_index == 0) { | 187 Symbol* klass_name = klass->name(); 188 klass_name->as_klass_external_name(buf, size); 189 int len = (int)strlen(buf); 190 191 if (len < size - 1) { 192 buf[len++] = '.'; 193 194 method_name->as_C_string(&(buf[len]), size - len); 195 len = (int)strlen(buf); 196 197 signature->as_C_string(&(buf[len]), size - len); 198 } 199 200 return buf; 201 } 202 203 const char* Method::external_name() const { 204 return external_name(constants()->pool_holder(), name(), signature()); 205 } 206 207 const char* Method::external_name_short() const { 208 return external_name(constants()->pool_holder(), name(), NULL); 209 } 210 211 void Method::print_external_name(outputStream *os) const { 212 print_external_name(os, constants()->pool_holder(), name(), signature()); 213 } 214 215 const char* Method::external_name(Klass* klass, Symbol* method_name, Symbol* signature) { 216 stringStream ss; 217 print_external_name(&ss, klass, method_name, signature); 218 return ss.as_string(); 219 } 220 221 void Method::print_external_name(outputStream *os, Klass* klass, Symbol* method_name, Symbol* signature) { 222 if (!signature) { 223 os->print("%s::%s", klass->external_name(), method_name->as_C_string()); 224 } 225 else { 226 signature->print_as_signature_external_return_type(os); 227 os->print(" %s.%s(", klass->external_name(), method_name->as_C_string()); 228 signature->print_as_signature_external_parameters(os); 229 os->print(")"); 230 } 231 } 232 233 int Method::fast_exception_handler_bci_for(const methodHandle& mh, Klass* ex_klass, int throw_bci, TRAPS) { 234 // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index) 235 // access exception table 236 ExceptionTable table(mh()); 237 int length = table.length(); 238 // iterate through all entries sequentially 239 constantPoolHandle pool(THREAD, mh->constants()); 240 for (int i = 0; i < length; i ++) { 241 //reacquire the table in case a GC happened 242 ExceptionTable table(mh()); 243 int beg_bci = table.start_pc(i); 244 int end_bci = table.end_pc(i); 245 assert(beg_bci <= end_bci, "inconsistent exception table"); 246 if (beg_bci <= throw_bci && throw_bci < end_bci) { 247 // exception handler bci range covers throw_bci => investigate further 248 int handler_bci = table.handler_pc(i); 249 int klass_index = table.catch_type_index(i); 250 if (klass_index == 0) { |