< prev index next >
src/hotspot/share/runtime/fieldDescriptor.cpp
Print this page
*** 30,39 ****
--- 30,40 ----
#include "oops/annotations.hpp"
#include "oops/constantPool.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/oop.inline.hpp"
#include "oops/fieldStreams.hpp"
+ #include "oops/valueKlass.hpp"
#include "runtime/fieldDescriptor.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/signature.hpp"
*** 145,156 ****
}
}
}
void fieldDescriptor::print_on_for(outputStream* st, oop obj) {
- print_on(st);
BasicType ft = field_type();
jint as_int = 0;
switch (ft) {
case T_BYTE:
as_int = (jint)obj->byte_field(offset());
st->print(" %d", obj->byte_field(offset()));
--- 146,159 ----
}
}
}
void fieldDescriptor::print_on_for(outputStream* st, oop obj) {
BasicType ft = field_type();
+ if (ft != T_VALUETYPE) {
+ print_on(st);
+ }
jint as_int = 0;
switch (ft) {
case T_BYTE:
as_int = (jint)obj->byte_field(offset());
st->print(" %d", obj->byte_field(offset()));
*** 202,226 ****
obj->obj_field(offset())->print_value_on(st);
} else {
st->print_cr("NULL");
}
break;
default:
ShouldNotReachHere();
break;
}
// Print a hint as to the underlying integer representation. This can be wrong for
// pointers on an LP64 machine
#ifdef _LP64
! if ((ft == T_OBJECT || ft == T_ARRAY) && UseCompressedOops) {
st->print(" (%x)", obj->int_field(offset()));
}
else // <- intended
#endif
if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| !is_java_primitive(ft)) ) {
st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint)));
} else if (as_int < 0 || as_int > 9) {
st->print(" (%x)", as_int);
}
}
#endif /* PRODUCT */
--- 205,254 ----
obj->obj_field(offset())->print_value_on(st);
} else {
st->print_cr("NULL");
}
break;
+ case T_VALUETYPE:
+ if (is_flattened()) {
+ // Resolve klass of flattened value type field
+ Thread* THREAD = Thread::current();
+ ResourceMark rm(THREAD);
+ SignatureStream ss(signature(), false);
+ Klass* k = ss.as_klass(Handle(THREAD, field_holder()->class_loader()),
+ Handle(THREAD, field_holder()->protection_domain()),
+ SignatureStream::ReturnNull, THREAD);
+ assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?");
+ ValueKlass* vk = ValueKlass::cast(k);
+ int field_offset = offset() - vk->first_field_offset();
+ obj = (oop)((address)obj + field_offset);
+ // Print flattened fields of the value type field
+ st->print_cr("Flattened value type '%s':", vk->name()->as_C_string());
+ FieldPrinter print_field(st, obj);
+ vk->do_nonstatic_fields(&print_field);
+ return; // Do not print underlying representation
+ } else {
+ st->print(" ");
+ NOT_LP64(as_int = obj->int_field(offset()));
+ obj->obj_field(offset())->print_value_on(st);
+ }
+ break;
default:
ShouldNotReachHere();
break;
}
// Print a hint as to the underlying integer representation. This can be wrong for
// pointers on an LP64 machine
#ifdef _LP64
! if ((ft == T_OBJECT || ft == T_ARRAY || ft == T_VALUETYPE) && UseCompressedOops) {
st->print(" (%x)", obj->int_field(offset()));
}
else // <- intended
#endif
if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| !is_java_primitive(ft)) ) {
st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint)));
} else if (as_int < 0 || as_int > 9) {
st->print(" (%x)", as_int);
}
+ st->cr();
}
#endif /* PRODUCT */
< prev index next >