< prev index next >

src/hotspot/share/runtime/fieldDescriptor.cpp

Print this page




 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 */
< prev index next >