< prev index next >
src/share/vm/ci/ciInstanceKlass.cpp
Print this page
*** 31,40 ****
--- 31,41 ----
#include "classfile/systemDictionary.hpp"
#include "memory/allocation.hpp"
#include "memory/allocation.inline.hpp"
#include "oops/oop.inline.hpp"
#include "oops/fieldStreams.hpp"
+ #include "oops/valueKlass.hpp"
#include "runtime/fieldDescriptor.hpp"
// ciInstanceKlass
//
// This class represents a Klass* in the HotSpot virtual machine
*** 653,733 ****
// out the actual value. For Strings it's the actual string value.
// For array types it it's first level array size since that's the
// only value which statically unchangeable. For all other reference
// types it simply prints out the dynamic type.
! class StaticFinalFieldPrinter : public FieldClosure {
outputStream* _out;
const char* _holder;
public:
StaticFinalFieldPrinter(outputStream* out, const char* holder) :
! _out(out),
! _holder(holder) {
}
void do_field(fieldDescriptor* fd) {
if (fd->is_final() && !fd->has_initial_value()) {
ResourceMark rm;
! oop mirror = fd->field_holder()->java_mirror();
_out->print("staticfield %s %s %s ", _holder, fd->name()->as_quoted_ascii(), fd->signature()->as_quoted_ascii());
switch (fd->field_type()) {
! case T_BYTE: _out->print_cr("%d", mirror->byte_field(fd->offset())); break;
! case T_BOOLEAN: _out->print_cr("%d", mirror->bool_field(fd->offset())); break;
! case T_SHORT: _out->print_cr("%d", mirror->short_field(fd->offset())); break;
! case T_CHAR: _out->print_cr("%d", mirror->char_field(fd->offset())); break;
! case T_INT: _out->print_cr("%d", mirror->int_field(fd->offset())); break;
! case T_LONG: _out->print_cr(INT64_FORMAT, (int64_t)(mirror->long_field(fd->offset()))); break;
case T_FLOAT: {
float f = mirror->float_field(fd->offset());
! _out->print_cr("%d", *(int*)&f);
break;
}
case T_DOUBLE: {
double d = mirror->double_field(fd->offset());
! _out->print_cr(INT64_FORMAT, *(int64_t*)&d);
break;
}
case T_ARRAY: {
oop value = mirror->obj_field_acquire(fd->offset());
if (value == NULL) {
! _out->print_cr("null");
} else {
typeArrayOop ta = (typeArrayOop)value;
_out->print("%d", ta->length());
if (value->is_objArray()) {
objArrayOop oa = (objArrayOop)value;
const char* klass_name = value->klass()->name()->as_quoted_ascii();
_out->print(" %s", klass_name);
}
- _out->cr();
}
break;
}
case T_OBJECT: {
oop value = mirror->obj_field_acquire(fd->offset());
if (value == NULL) {
! _out->print_cr("null");
} else if (value->is_instance()) {
if (value->is_a(SystemDictionary::String_klass())) {
_out->print("\"");
_out->print_raw(java_lang_String::as_quoted_ascii(value));
! _out->print_cr("\"");
} else {
const char* klass_name = value->klass()->name()->as_quoted_ascii();
! _out->print_cr("%s", klass_name);
}
} else {
ShouldNotReachHere();
}
break;
}
! default:
! ShouldNotReachHere();
}
}
}
! };
!
void ciInstanceKlass::dump_replay_data(outputStream* out) {
ResourceMark rm;
InstanceKlass* ik = get_instanceKlass();
--- 654,779 ----
// out the actual value. For Strings it's the actual string value.
// For array types it it's first level array size since that's the
// only value which statically unchangeable. For all other reference
// types it simply prints out the dynamic type.
! class StaticFieldPrinter : public FieldClosure {
! protected:
outputStream* _out;
+ public:
+ StaticFieldPrinter(outputStream* out) :
+ _out(out) {
+ }
+ void do_field_helper(fieldDescriptor* fd, oop obj, bool flattened);
+ };
+
+ class StaticFinalFieldPrinter : public StaticFieldPrinter {
const char* _holder;
public:
StaticFinalFieldPrinter(outputStream* out, const char* holder) :
! StaticFieldPrinter(out), _holder(holder) {
}
void do_field(fieldDescriptor* fd) {
if (fd->is_final() && !fd->has_initial_value()) {
ResourceMark rm;
! InstanceKlass* holder = fd->field_holder();
! oop mirror = holder->java_mirror();
_out->print("staticfield %s %s %s ", _holder, fd->name()->as_quoted_ascii(), fd->signature()->as_quoted_ascii());
+ do_field_helper(fd, mirror, false);
+ _out->cr();
+ }
+ }
+ };
+
+ class ValueTypeFieldPrinter : public StaticFieldPrinter {
+ oop _obj;
+ public:
+ ValueTypeFieldPrinter(outputStream* out, oop obj) :
+ StaticFieldPrinter(out), _obj(obj) {
+ }
+ void do_field(fieldDescriptor* fd) {
+ do_field_helper(fd, _obj, true);
+ _out->print(" ");
+ }
+ };
+
+ void StaticFieldPrinter::do_field_helper(fieldDescriptor* fd, oop mirror, bool flattened) {
switch (fd->field_type()) {
! case T_BYTE: _out->print("%d", mirror->byte_field(fd->offset())); break;
! case T_BOOLEAN: _out->print("%d", mirror->bool_field(fd->offset())); break;
! case T_SHORT: _out->print("%d", mirror->short_field(fd->offset())); break;
! case T_CHAR: _out->print("%d", mirror->char_field(fd->offset())); break;
! case T_INT: _out->print("%d", mirror->int_field(fd->offset())); break;
! case T_LONG: _out->print(INT64_FORMAT, (int64_t)(mirror->long_field(fd->offset()))); break;
case T_FLOAT: {
float f = mirror->float_field(fd->offset());
! _out->print("%d", *(int*)&f);
break;
}
case T_DOUBLE: {
double d = mirror->double_field(fd->offset());
! _out->print(INT64_FORMAT, *(int64_t*)&d);
break;
}
case T_ARRAY: {
oop value = mirror->obj_field_acquire(fd->offset());
if (value == NULL) {
! _out->print("null");
} else {
typeArrayOop ta = (typeArrayOop)value;
_out->print("%d", ta->length());
if (value->is_objArray()) {
objArrayOop oa = (objArrayOop)value;
const char* klass_name = value->klass()->name()->as_quoted_ascii();
_out->print(" %s", klass_name);
}
}
break;
}
case T_OBJECT: {
oop value = mirror->obj_field_acquire(fd->offset());
if (value == NULL) {
! _out->print("null");
} else if (value->is_instance()) {
if (value->is_a(SystemDictionary::String_klass())) {
_out->print("\"");
_out->print_raw(java_lang_String::as_quoted_ascii(value));
! _out->print("\"");
} else {
const char* klass_name = value->klass()->name()->as_quoted_ascii();
! _out->print("%s", klass_name);
}
} else {
ShouldNotReachHere();
}
break;
}
! case T_VALUETYPE: {
! ResetNoHandleMark rnhm;
! Thread* THREAD = Thread::current();
! SignatureStream ss(fd->signature(), false);
! Symbol* name = ss.as_symbol(THREAD);
! assert(!HAS_PENDING_EXCEPTION, "can resolve klass?");
! InstanceKlass* holder = fd->field_holder();
! Klass* k = SystemDictionary::find(name, Handle(holder->class_loader()), Handle(holder->protection_domain()), THREAD);
! assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?");
! ValueKlass* vk = ValueKlass::cast(k);
! oop obj;
! if (flattened) {
! int field_offset = fd->offset() - vk->first_field_offset();
! obj = (oop)((address)mirror + field_offset);
! } else {
! obj = mirror->obj_field_acquire(fd->offset());
}
+ ValueTypeFieldPrinter print_field(_out, obj);
+ vk->do_nonstatic_fields(&print_field);
+ break;
}
+ default:
+ ShouldNotReachHere();
}
! }
void ciInstanceKlass::dump_replay_data(outputStream* out) {
ResourceMark rm;
InstanceKlass* ik = get_instanceKlass();
< prev index next >