1010 }; 1011 1012 int compare(ReassignedField* left, ReassignedField* right) { 1013 return left->_offset - right->_offset; 1014 } 1015 1016 // Restore fields of an eliminated instance object using the same field order 1017 // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true) 1018 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) { 1019 if (klass->superklass() != NULL) { 1020 svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj, skip_internal, 0, CHECK_0); 1021 } 1022 1023 GrowableArray<ReassignedField>* fields = new GrowableArray<ReassignedField>(); 1024 for (AllFieldStream fs(klass); !fs.done(); fs.next()) { 1025 if (!fs.access_flags().is_static() && (!skip_internal || !fs.access_flags().is_internal())) { 1026 ReassignedField field; 1027 field._offset = fs.offset(); 1028 field._type = FieldType::basic_type(fs.signature()); 1029 if (field._type == T_VALUETYPE) { 1030 // Resolve klass of flattened value type field 1031 SignatureStream ss(fs.signature(), false); 1032 Klass* vk = ss.as_klass(Handle(THREAD, klass->class_loader()), Handle(THREAD, klass->protection_domain()), SignatureStream::NCDFError, THREAD); 1033 guarantee(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending"); 1034 assert(vk->is_value(), "must be a ValueKlass"); 1035 field._klass = InstanceKlass::cast(vk); 1036 } 1037 fields->append(field); 1038 } 1039 } 1040 fields->sort(compare); 1041 for (int i = 0; i < fields->length(); i++) { 1042 intptr_t val; 1043 ScopeValue* scope_field = sv->field_at(svIndex); 1044 StackValue* value = StackValue::create_stack_value(fr, reg_map, scope_field); 1045 int offset = base_offset + fields->at(i)._offset; 1046 BasicType type = fields->at(i)._type; 1047 switch (type) { 1048 case T_OBJECT: case T_ARRAY: 1049 assert(value->type() == T_OBJECT, "Agreement."); 1050 obj->obj_field_put(offset, value->get_obj()()); 1051 break; 1052 1053 case T_VALUETYPE: { 1054 // Recursively re-assign flattened value type fields 1055 InstanceKlass* vk = fields->at(i)._klass; | 1010 }; 1011 1012 int compare(ReassignedField* left, ReassignedField* right) { 1013 return left->_offset - right->_offset; 1014 } 1015 1016 // Restore fields of an eliminated instance object using the same field order 1017 // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true) 1018 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) { 1019 if (klass->superklass() != NULL) { 1020 svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj, skip_internal, 0, CHECK_0); 1021 } 1022 1023 GrowableArray<ReassignedField>* fields = new GrowableArray<ReassignedField>(); 1024 for (AllFieldStream fs(klass); !fs.done(); fs.next()) { 1025 if (!fs.access_flags().is_static() && (!skip_internal || !fs.access_flags().is_internal())) { 1026 ReassignedField field; 1027 field._offset = fs.offset(); 1028 field._type = FieldType::basic_type(fs.signature()); 1029 if (field._type == T_VALUETYPE) { 1030 if (fs.is_flatten()) { 1031 // Resolve klass of flattened value type field 1032 SignatureStream ss(fs.signature(), false); 1033 Klass* vk = ss.as_klass(Handle(THREAD, klass->class_loader()), Handle(THREAD, klass->protection_domain()), SignatureStream::NCDFError, THREAD); 1034 guarantee(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending"); 1035 assert(vk->is_value(), "must be a ValueKlass"); 1036 field._klass = InstanceKlass::cast(vk); 1037 } else { 1038 // Non-flattened value type field 1039 // TODO change this when we use T_VALUETYPEPTR 1040 field._type = T_OBJECT; 1041 } 1042 } 1043 fields->append(field); 1044 } 1045 } 1046 fields->sort(compare); 1047 for (int i = 0; i < fields->length(); i++) { 1048 intptr_t val; 1049 ScopeValue* scope_field = sv->field_at(svIndex); 1050 StackValue* value = StackValue::create_stack_value(fr, reg_map, scope_field); 1051 int offset = base_offset + fields->at(i)._offset; 1052 BasicType type = fields->at(i)._type; 1053 switch (type) { 1054 case T_OBJECT: case T_ARRAY: 1055 assert(value->type() == T_OBJECT, "Agreement."); 1056 obj->obj_field_put(offset, value->get_obj()()); 1057 break; 1058 1059 case T_VALUETYPE: { 1060 // Recursively re-assign flattened value type fields 1061 InstanceKlass* vk = fields->at(i)._klass; |