186 void BytecodeTracer::trace(methodHandle method, address bcp, outputStream* st) { |
186 void BytecodeTracer::trace(methodHandle method, address bcp, outputStream* st) { |
187 ttyLocker ttyl; // 5065316: keep the following output coherent |
187 ttyLocker ttyl; // 5065316: keep the following output coherent |
188 _closure->trace(method, bcp, st); |
188 _closure->trace(method, bcp, st); |
189 } |
189 } |
190 |
190 |
191 void print_symbol(symbolOop sym, outputStream* st) { |
191 void print_symbol(Symbol* sym, outputStream* st) { |
192 char buf[40]; |
192 char buf[40]; |
193 int len = sym->utf8_length(); |
193 int len = sym->utf8_length(); |
194 if (len >= (int)sizeof(buf)) { |
194 if (len >= (int)sizeof(buf)) { |
195 st->print_cr(" %s...[%d]", sym->as_C_string(buf, sizeof(buf)), len); |
195 st->print_cr(" %s...[%d]", sym->as_C_string(buf, sizeof(buf)), len); |
196 } else { |
196 } else { |
203 if (value == NULL) { |
203 if (value == NULL) { |
204 st->print_cr(" NULL"); |
204 st->print_cr(" NULL"); |
205 } else if (java_lang_String::is_instance(value)) { |
205 } else if (java_lang_String::is_instance(value)) { |
206 EXCEPTION_MARK; |
206 EXCEPTION_MARK; |
207 Handle h_value (THREAD, value); |
207 Handle h_value (THREAD, value); |
208 symbolHandle sym = java_lang_String::as_symbol(h_value, CATCH); |
208 Symbol* sym = java_lang_String::as_symbol(h_value, CATCH); |
209 print_symbol(sym(), st); |
209 print_symbol(sym, st); |
210 } else if (value->is_symbol()) { |
210 sym->decrement_refcount(); |
211 print_symbol(symbolOop(value), st); |
|
212 } else { |
211 } else { |
213 st->print_cr(" " PTR_FORMAT, (intptr_t) value); |
212 st->print_cr(" " PTR_FORMAT, (intptr_t) value); |
214 } |
213 } |
215 } |
214 } |
216 |
215 |
314 st->print(" <Object>"); |
313 st->print(" <Object>"); |
315 print_oop(constants->object_at(i), st); |
314 print_oop(constants->object_at(i), st); |
316 } else if (tag.is_method_type()) { |
315 } else if (tag.is_method_type()) { |
317 int i2 = constants->method_type_index_at(i); |
316 int i2 = constants->method_type_index_at(i); |
318 st->print(" <MethodType> %d", i2); |
317 st->print(" <MethodType> %d", i2); |
319 print_oop(constants->symbol_at(i2), st); |
318 print_symbol(constants->symbol_at(i2), st); |
320 } else if (tag.is_method_handle()) { |
319 } else if (tag.is_method_handle()) { |
321 int kind = constants->method_handle_ref_kind_at(i); |
320 int kind = constants->method_handle_ref_kind_at(i); |
322 int i2 = constants->method_handle_index_at(i); |
321 int i2 = constants->method_handle_index_at(i); |
323 st->print(" <MethodHandle of kind %d>", kind, i2); |
322 st->print(" <MethodHandle of kind %d>", kind, i2); |
324 print_field_or_method(-i, i2, st); |
323 print_field_or_method(-i, i2, st); |
352 default: |
351 default: |
353 st->print_cr(" bad tag=%d at %d", tag.value(), i); |
352 st->print_cr(" bad tag=%d at %d", tag.value(), i); |
354 return; |
353 return; |
355 } |
354 } |
356 |
355 |
357 symbolOop name = constants->uncached_name_ref_at(i); |
356 Symbol* name = constants->uncached_name_ref_at(i); |
358 symbolOop signature = constants->uncached_signature_ref_at(i); |
357 Symbol* signature = constants->uncached_signature_ref_at(i); |
359 const char* sep = (tag.is_field() ? "/" : ""); |
358 const char* sep = (tag.is_field() ? "/" : ""); |
360 if (has_klass) { |
359 if (has_klass) { |
361 symbolOop klass = constants->klass_name_at(constants->uncached_klass_ref_index_at(i)); |
360 Symbol* klass = constants->klass_name_at(constants->uncached_klass_ref_index_at(i)); |
362 st->print_cr(" %d <%s.%s%s%s> ", i, klass->as_C_string(), name->as_C_string(), sep, signature->as_C_string()); |
361 st->print_cr(" %d <%s.%s%s%s> ", i, klass->as_C_string(), name->as_C_string(), sep, signature->as_C_string()); |
363 } else { |
362 } else { |
364 if (tag.is_invoke_dynamic()) { |
363 if (tag.is_invoke_dynamic()) { |
365 int bsm = constants->invoke_dynamic_bootstrap_method_ref_index_at(i); |
364 int bsm = constants->invoke_dynamic_bootstrap_method_ref_index_at(i); |
366 st->print(" bsm=%d", bsm); |
365 st->print(" bsm=%d", bsm); |
436 } |
435 } |
437 break; |
436 break; |
438 case Bytecodes::_anewarray: { |
437 case Bytecodes::_anewarray: { |
439 int klass_index = get_index_u2(); |
438 int klass_index = get_index_u2(); |
440 constantPoolOop constants = method()->constants(); |
439 constantPoolOop constants = method()->constants(); |
441 symbolOop name = constants->klass_name_at(klass_index); |
440 Symbol* name = constants->klass_name_at(klass_index); |
442 st->print_cr(" %s ", name->as_C_string()); |
441 st->print_cr(" %s ", name->as_C_string()); |
443 } |
442 } |
444 break; |
443 break; |
445 case Bytecodes::_multianewarray: { |
444 case Bytecodes::_multianewarray: { |
446 int klass_index = get_index_u2(); |
445 int klass_index = get_index_u2(); |
447 int nof_dims = get_index_u1(); |
446 int nof_dims = get_index_u1(); |
448 constantPoolOop constants = method()->constants(); |
447 constantPoolOop constants = method()->constants(); |
449 symbolOop name = constants->klass_name_at(klass_index); |
448 Symbol* name = constants->klass_name_at(klass_index); |
450 st->print_cr(" %s %d", name->as_C_string(), nof_dims); |
449 st->print_cr(" %s %d", name->as_C_string(), nof_dims); |
451 } |
450 } |
452 break; |
451 break; |
453 |
452 |
454 case Bytecodes::_ifeq: |
453 case Bytecodes::_ifeq: |
550 case Bytecodes::_new: |
549 case Bytecodes::_new: |
551 case Bytecodes::_checkcast: |
550 case Bytecodes::_checkcast: |
552 case Bytecodes::_instanceof: |
551 case Bytecodes::_instanceof: |
553 { int i = get_index_u2(); |
552 { int i = get_index_u2(); |
554 constantPoolOop constants = method()->constants(); |
553 constantPoolOop constants = method()->constants(); |
555 symbolOop name = constants->klass_name_at(i); |
554 Symbol* name = constants->klass_name_at(i); |
556 st->print_cr(" %d <%s>", i, name->as_C_string()); |
555 st->print_cr(" %d <%s>", i, name->as_C_string()); |
557 } |
556 } |
558 break; |
557 break; |
559 |
558 |
560 case Bytecodes::_wide: |
559 case Bytecodes::_wide: |