< prev index next >

src/hotspot/share/runtime/deoptimization.cpp

Print this page




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;


< prev index next >