944 int compare(ReassignedField* left, ReassignedField* right) {
945 return left->_offset - right->_offset;
946 }
947
948 // Restore fields of an eliminated instance object using the same field order
949 // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true)
950 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) {
951 if (klass->superklass() != NULL) {
952 svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj, skip_internal, 0, CHECK_0);
953 }
954
955 GrowableArray<ReassignedField>* fields = new GrowableArray<ReassignedField>();
956 for (AllFieldStream fs(klass); !fs.done(); fs.next()) {
957 if (!fs.access_flags().is_static() && (!skip_internal || !fs.access_flags().is_internal())) {
958 ReassignedField field;
959 field._offset = fs.offset();
960 field._type = FieldType::basic_type(fs.signature());
961 if (field._type == T_VALUETYPE) {
962 // Resolve klass of flattened value type field
963 SignatureStream ss(fs.signature(), false);
964 Klass* vk = ss.as_klass(Handle(klass->class_loader()), Handle(klass->protection_domain()), SignatureStream::NCDFError, CHECK_0);
965 assert(vk->is_value(), "must be a ValueKlass");
966 field._klass = InstanceKlass::cast(vk);
967 }
968 fields->append(field);
969 }
970 }
971 fields->sort(compare);
972 for (int i = 0; i < fields->length(); i++) {
973 intptr_t val;
974 ScopeValue* scope_field = sv->field_at(svIndex);
975 StackValue* value = StackValue::create_stack_value(fr, reg_map, scope_field);
976 int offset = base_offset + fields->at(i)._offset;
977 BasicType type = fields->at(i)._type;
978 switch (type) {
979 case T_OBJECT: case T_ARRAY:
980 assert(value->type() == T_OBJECT, "Agreement.");
981 obj->obj_field_put(offset, value->get_obj()());
982 break;
983
984 case T_VALUETYPE: {
|
944 int compare(ReassignedField* left, ReassignedField* right) {
945 return left->_offset - right->_offset;
946 }
947
948 // Restore fields of an eliminated instance object using the same field order
949 // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true)
950 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) {
951 if (klass->superklass() != NULL) {
952 svIndex = reassign_fields_by_klass(klass->superklass(), fr, reg_map, sv, svIndex, obj, skip_internal, 0, CHECK_0);
953 }
954
955 GrowableArray<ReassignedField>* fields = new GrowableArray<ReassignedField>();
956 for (AllFieldStream fs(klass); !fs.done(); fs.next()) {
957 if (!fs.access_flags().is_static() && (!skip_internal || !fs.access_flags().is_internal())) {
958 ReassignedField field;
959 field._offset = fs.offset();
960 field._type = FieldType::basic_type(fs.signature());
961 if (field._type == T_VALUETYPE) {
962 // Resolve klass of flattened value type field
963 SignatureStream ss(fs.signature(), false);
964 Klass* vk = ss.as_klass(Handle(klass->class_loader()), Handle(klass->protection_domain()), SignatureStream::NCDFError, THREAD);
965 guarantee(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending");
966 assert(vk->is_value(), "must be a ValueKlass");
967 field._klass = InstanceKlass::cast(vk);
968 }
969 fields->append(field);
970 }
971 }
972 fields->sort(compare);
973 for (int i = 0; i < fields->length(); i++) {
974 intptr_t val;
975 ScopeValue* scope_field = sv->field_at(svIndex);
976 StackValue* value = StackValue::create_stack_value(fr, reg_map, scope_field);
977 int offset = base_offset + fields->at(i)._offset;
978 BasicType type = fields->at(i)._type;
979 switch (type) {
980 case T_OBJECT: case T_ARRAY:
981 assert(value->type() == T_OBJECT, "Agreement.");
982 obj->obj_field_put(offset, value->get_obj()());
983 break;
984
985 case T_VALUETYPE: {
|