< 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 >