< prev index next >

src/share/vm/runtime/deoptimization.cpp

Print this page




 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: {


< prev index next >