Mercurial > hg > graal-jvmci-8
comparison src/share/vm/interpreter/bytecodeTracer.cpp @ 2177:3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
Summary: move symbols from permgen into C heap and reference count them
Reviewed-by: never, acorn, jmasa, stefank
author | coleenp |
---|---|
date | Thu, 27 Jan 2011 16:11:27 -0800 |
parents | 8012aa3ccede |
children | ed69575596ac |
comparison
equal
deleted
inserted
replaced
2176:27e4ea99855d | 2177:3582bf76420e |
---|---|
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: |