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);
|
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_flattened()) {
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);
|