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: