182 break; 183 case T_SHORT: 184 as_int = obj->short_field(offset()); 185 st->print(" %d", obj->short_field(offset())); 186 break; 187 case T_BOOLEAN: 188 as_int = obj->bool_field(offset()); 189 st->print(" %s", obj->bool_field(offset()) ? "true" : "false"); 190 break; 191 case T_ARRAY: 192 st->print(" "); 193 NOT_LP64(as_int = obj->int_field(offset())); 194 obj->obj_field(offset())->print_value_on(st); 195 break; 196 case T_OBJECT: 197 st->print(" "); 198 NOT_LP64(as_int = obj->int_field(offset())); 199 obj->obj_field(offset())->print_value_on(st); 200 break; 201 case T_VALUETYPE: 202 { 203 // Resolve klass of flattened value type field 204 Thread* THREAD = Thread::current(); 205 ResourceMark rm(THREAD); 206 SignatureStream ss(signature(), false); 207 Klass* k = ss.as_klass(Handle(THREAD, field_holder()->class_loader()), 208 Handle(THREAD, field_holder()->protection_domain()), 209 SignatureStream::ReturnNull, THREAD); 210 assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?"); 211 ValueKlass* vk = ValueKlass::cast(k); 212 int field_offset = offset() - vk->first_field_offset(); 213 obj = (oop)((address)obj + field_offset); 214 // Print flattened fields of the value type field 215 st->print_cr("Flattened value type '%s':", vk->name()->as_C_string()); 216 FieldPrinter print_field(st, obj); 217 vk->do_nonstatic_fields(&print_field); 218 return; // Do not print underlying representation 219 break; 220 } 221 default: 222 ShouldNotReachHere(); 223 break; 224 } 225 // Print a hint as to the underlying integer representation. This can be wrong for 226 // pointers on an LP64 machine 227 if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| !is_java_primitive(ft)) ) { 228 st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint))); 229 } else if (as_int < 0 || as_int > 9) { 230 st->print(" (%x)", as_int); 231 } 232 st->cr(); 233 } 234 235 #endif /* PRODUCT */ | 182 break; 183 case T_SHORT: 184 as_int = obj->short_field(offset()); 185 st->print(" %d", obj->short_field(offset())); 186 break; 187 case T_BOOLEAN: 188 as_int = obj->bool_field(offset()); 189 st->print(" %s", obj->bool_field(offset()) ? "true" : "false"); 190 break; 191 case T_ARRAY: 192 st->print(" "); 193 NOT_LP64(as_int = obj->int_field(offset())); 194 obj->obj_field(offset())->print_value_on(st); 195 break; 196 case T_OBJECT: 197 st->print(" "); 198 NOT_LP64(as_int = obj->int_field(offset())); 199 obj->obj_field(offset())->print_value_on(st); 200 break; 201 case T_VALUETYPE: 202 if (is_flatten()) { 203 // Resolve klass of flattened value type field 204 Thread* THREAD = Thread::current(); 205 ResourceMark rm(THREAD); 206 SignatureStream ss(signature(), false); 207 Klass* k = ss.as_klass(Handle(THREAD, field_holder()->class_loader()), 208 Handle(THREAD, field_holder()->protection_domain()), 209 SignatureStream::ReturnNull, THREAD); 210 assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?"); 211 ValueKlass* vk = ValueKlass::cast(k); 212 int field_offset = offset() - vk->first_field_offset(); 213 obj = (oop)((address)obj + field_offset); 214 // Print flattened fields of the value type field 215 st->print_cr("Flattened value type '%s':", vk->name()->as_C_string()); 216 FieldPrinter print_field(st, obj); 217 vk->do_nonstatic_fields(&print_field); 218 return; // Do not print underlying representation 219 } else { 220 st->print(" "); 221 NOT_LP64(as_int = obj->int_field(offset())); 222 obj->obj_field(offset())->print_value_on(st); 223 } 224 break; 225 default: 226 ShouldNotReachHere(); 227 break; 228 } 229 // Print a hint as to the underlying integer representation. This can be wrong for 230 // pointers on an LP64 machine 231 if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| !is_java_primitive(ft)) ) { 232 st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint))); 233 } else if (as_int < 0 || as_int > 9) { 234 st->print(" (%x)", as_int); 235 } 236 st->cr(); 237 } 238 239 #endif /* PRODUCT */ |