< prev index next >

src/hotspot/share/runtime/deoptimization.cpp

Print this page




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;


< prev index next >