1000 };
1001
1002 int compare(ReassignedField* left, ReassignedField* right) {
1003 return left->_offset - right->_offset;
1004 }
1005
1006 // Restore fields of an eliminated instance object using the same field order
1007 // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true)
1008 static int reassign_fields_by_klass(InstanceKlass* klass, frame* fr, RegisterMap* reg_map, ObjectValue* sv, int svIndex, oop obj, bool skip_internal, int base_offset, TRAPS) {
1009 if (klass->superklass() != NULL) {
1010 svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj, skip_internal, 0, CHECK_0);
1011 }
1012
1013 GrowableArray<ReassignedField>* fields = new GrowableArray<ReassignedField>();
1014 for (AllFieldStream fs(klass); !fs.done(); fs.next()) {
1015 if (!fs.access_flags().is_static() && (!skip_internal || !fs.access_flags().is_internal())) {
1016 ReassignedField field;
1017 field._offset = fs.offset();
1018 field._type = FieldType::basic_type(fs.signature());
1019 if (field._type == T_VALUETYPE) {
1020 if (fs.is_flatten()) {
1021 // Resolve klass of flattened value type field
1022 SignatureStream ss(fs.signature(), false);
1023 Klass* vk = ss.as_klass(Handle(THREAD, klass->class_loader()), Handle(THREAD, klass->protection_domain()), SignatureStream::NCDFError, THREAD);
1024 guarantee(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending");
1025 assert(vk->is_value(), "must be a ValueKlass");
1026 field._klass = InstanceKlass::cast(vk);
1027 } else {
1028 // Non-flattened value type field
1029 field._type = T_VALUETYPEPTR;
1030 }
1031 }
1032 fields->append(field);
1033 }
1034 }
1035 fields->sort(compare);
1036 for (int i = 0; i < fields->length(); i++) {
1037 intptr_t val;
1038 ScopeValue* scope_field = sv->field_at(svIndex);
1039 StackValue* value = StackValue::create_stack_value(fr, reg_map, scope_field);
1040 int offset = base_offset + fields->at(i)._offset;
|
1000 };
1001
1002 int compare(ReassignedField* left, ReassignedField* right) {
1003 return left->_offset - right->_offset;
1004 }
1005
1006 // Restore fields of an eliminated instance object using the same field order
1007 // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true)
1008 static int reassign_fields_by_klass(InstanceKlass* klass, frame* fr, RegisterMap* reg_map, ObjectValue* sv, int svIndex, oop obj, bool skip_internal, int base_offset, TRAPS) {
1009 if (klass->superklass() != NULL) {
1010 svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj, skip_internal, 0, CHECK_0);
1011 }
1012
1013 GrowableArray<ReassignedField>* fields = new GrowableArray<ReassignedField>();
1014 for (AllFieldStream fs(klass); !fs.done(); fs.next()) {
1015 if (!fs.access_flags().is_static() && (!skip_internal || !fs.access_flags().is_internal())) {
1016 ReassignedField field;
1017 field._offset = fs.offset();
1018 field._type = FieldType::basic_type(fs.signature());
1019 if (field._type == T_VALUETYPE) {
1020 if (fs.is_flattened()) {
1021 // Resolve klass of flattened value type field
1022 SignatureStream ss(fs.signature(), false);
1023 Klass* vk = ss.as_klass(Handle(THREAD, klass->class_loader()), Handle(THREAD, klass->protection_domain()), SignatureStream::NCDFError, THREAD);
1024 guarantee(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending");
1025 assert(vk->is_value(), "must be a ValueKlass");
1026 field._klass = InstanceKlass::cast(vk);
1027 } else {
1028 // Non-flattened value type field
1029 field._type = T_VALUETYPEPTR;
1030 }
1031 }
1032 fields->append(field);
1033 }
1034 }
1035 fields->sort(compare);
1036 for (int i = 0; i < fields->length(); i++) {
1037 intptr_t val;
1038 ScopeValue* scope_field = sv->field_at(svIndex);
1039 StackValue* value = StackValue::create_stack_value(fr, reg_map, scope_field);
1040 int offset = base_offset + fields->at(i)._offset;
|