void BytecodePrinter::print_constant(int i, outputStream* st) { int orig_i = i; if (!check_index(orig_i, i, st)) return; ConstantPool* constants = method()->constants(); constantTag tag = constants->tag_at(i); if (tag.is_int()) { st->print_cr(" " INT32_FORMAT, constants->int_at(i)); } else if (tag.is_long()) { st->print_cr(" " INT64_FORMAT, constants->long_at(i)); } else if (tag.is_float()) { st->print_cr(" %f", constants->float_at(i)); } else if (tag.is_double()) { st->print_cr(" %f", constants->double_at(i)); } else if (tag.is_string()) { const char* string = constants->string_at_noresolve(i); st->print_cr(" %s", string); } else if (tag.is_klass()) { st->print_cr(" %s", constants->resolved_klass_at(i)->external_name()); } else if (tag.is_unresolved_klass()) { st->print_cr(" <unresolved klass at %d>", i); } else if (tag.is_method_type()) { int i2 = constants->method_type_index_at(i); st->print(" <MethodType> %d", i2); print_symbol(constants->symbol_at(i2), st); } else if (tag.is_method_handle()) { int kind = constants->method_handle_ref_kind_at(i); int i2 = constants->method_handle_index_at(i); st->print(" <MethodHandle of kind %d>", kind, i2); print_field_or_method(-i, i2, st); } else { st->print_cr(" bad tag=%d at %d", tag.value(), i); } }
ConstantPool* BytecodeConstantPool::create_constant_pool(TRAPS) const { if (_entries.length() == 0) { return _orig; } ConstantPool* cp = ConstantPool::allocate( _orig->pool_holder()->class_loader_data(), _orig->length() + _entries.length(), CHECK_NULL); cp->set_pool_holder(_orig->pool_holder()); _orig->copy_cp_to(1, _orig->length() - 1, cp, 1, CHECK_NULL); for (int i = 0; i < _entries.length(); ++i) { BytecodeCPEntry entry = _entries.at(i); int idx = i + _orig->length(); switch (entry._tag) { case BytecodeCPEntry::UTF8: entry._u.utf8->increment_refcount(); cp->symbol_at_put(idx, entry._u.utf8); break; case BytecodeCPEntry::KLASS: cp->unresolved_klass_at_put( idx, cp->symbol_at(entry._u.klass)); break; case BytecodeCPEntry::STRING: cp->unresolved_string_at_put( idx, cp->symbol_at(entry._u.string)); break; case BytecodeCPEntry::NAME_AND_TYPE: cp->name_and_type_at_put(idx, entry._u.name_and_type.name_index, entry._u.name_and_type.type_index); break; case BytecodeCPEntry::METHODREF: cp->method_at_put(idx, entry._u.methodref.class_index, entry._u.methodref.name_and_type_index); break; default: ShouldNotReachHere(); } } return cp; }