808 |
808 |
809 for (int i = 0; i < objects->length(); i++) { |
809 for (int i = 0; i < objects->length(); i++) { |
810 assert(objects->at(i)->is_object(), "invalid debug information"); |
810 assert(objects->at(i)->is_object(), "invalid debug information"); |
811 ObjectValue* sv = (ObjectValue*) objects->at(i); |
811 ObjectValue* sv = (ObjectValue*) objects->at(i); |
812 |
812 |
813 KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); |
813 Klass* k = java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()); |
814 oop obj = NULL; |
814 oop obj = NULL; |
815 |
815 |
816 if (k->is_instance_klass()) { |
816 if (k->is_instance_klass()) { |
817 InstanceKlass* ik = InstanceKlass::cast(k()); |
817 InstanceKlass* ik = InstanceKlass::cast(k); |
818 obj = ik->allocate_instance(THREAD); |
818 obj = ik->allocate_instance(THREAD); |
819 } else if (k->is_typeArray_klass()) { |
819 } else if (k->is_typeArray_klass()) { |
820 TypeArrayKlass* ak = TypeArrayKlass::cast(k()); |
820 TypeArrayKlass* ak = TypeArrayKlass::cast(k); |
821 assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length"); |
821 assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length"); |
822 int len = sv->field_size() / type2size[ak->element_type()]; |
822 int len = sv->field_size() / type2size[ak->element_type()]; |
823 obj = ak->allocate(len, THREAD); |
823 obj = ak->allocate(len, THREAD); |
824 } else if (k->is_objArray_klass()) { |
824 } else if (k->is_objArray_klass()) { |
825 ObjArrayKlass* ak = ObjArrayKlass::cast(k()); |
825 ObjArrayKlass* ak = ObjArrayKlass::cast(k); |
826 obj = ak->allocate(sv->field_size(), THREAD); |
826 obj = ak->allocate(sv->field_size(), THREAD); |
827 } |
827 } |
828 |
828 |
829 if (obj == NULL) { |
829 if (obj == NULL) { |
830 failures = true; |
830 failures = true; |
1077 |
1077 |
1078 // restore fields of all eliminated objects and arrays |
1078 // restore fields of all eliminated objects and arrays |
1079 void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool skip_internal) { |
1079 void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool skip_internal) { |
1080 for (int i = 0; i < objects->length(); i++) { |
1080 for (int i = 0; i < objects->length(); i++) { |
1081 ObjectValue* sv = (ObjectValue*) objects->at(i); |
1081 ObjectValue* sv = (ObjectValue*) objects->at(i); |
1082 KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); |
1082 Klass* k = java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()); |
1083 Handle obj = sv->value(); |
1083 Handle obj = sv->value(); |
1084 assert(obj.not_null() || realloc_failures, "reallocation was missed"); |
1084 assert(obj.not_null() || realloc_failures, "reallocation was missed"); |
1085 if (PrintDeoptimizationDetails) { |
1085 if (PrintDeoptimizationDetails) { |
1086 tty->print_cr("reassign fields for object of type %s!", k->name()->as_C_string()); |
1086 tty->print_cr("reassign fields for object of type %s!", k->name()->as_C_string()); |
1087 } |
1087 } |
1088 if (obj.is_null()) { |
1088 if (obj.is_null()) { |
1089 continue; |
1089 continue; |
1090 } |
1090 } |
1091 |
1091 |
1092 if (k->is_instance_klass()) { |
1092 if (k->is_instance_klass()) { |
1093 InstanceKlass* ik = InstanceKlass::cast(k()); |
1093 InstanceKlass* ik = InstanceKlass::cast(k); |
1094 reassign_fields_by_klass(ik, fr, reg_map, sv, 0, obj(), skip_internal); |
1094 reassign_fields_by_klass(ik, fr, reg_map, sv, 0, obj(), skip_internal); |
1095 } else if (k->is_typeArray_klass()) { |
1095 } else if (k->is_typeArray_klass()) { |
1096 TypeArrayKlass* ak = TypeArrayKlass::cast(k()); |
1096 TypeArrayKlass* ak = TypeArrayKlass::cast(k); |
1097 reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type()); |
1097 reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type()); |
1098 } else if (k->is_objArray_klass()) { |
1098 } else if (k->is_objArray_klass()) { |
1099 reassign_object_array_elements(fr, reg_map, sv, (objArrayOop) obj()); |
1099 reassign_object_array_elements(fr, reg_map, sv, (objArrayOop) obj()); |
1100 } |
1100 } |
1101 } |
1101 } |
1135 void Deoptimization::print_objects(GrowableArray<ScopeValue*>* objects, bool realloc_failures) { |
1135 void Deoptimization::print_objects(GrowableArray<ScopeValue*>* objects, bool realloc_failures) { |
1136 fieldDescriptor fd; |
1136 fieldDescriptor fd; |
1137 |
1137 |
1138 for (int i = 0; i < objects->length(); i++) { |
1138 for (int i = 0; i < objects->length(); i++) { |
1139 ObjectValue* sv = (ObjectValue*) objects->at(i); |
1139 ObjectValue* sv = (ObjectValue*) objects->at(i); |
1140 KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); |
1140 Klass* k = java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()); |
1141 Handle obj = sv->value(); |
1141 Handle obj = sv->value(); |
1142 |
1142 |
1143 tty->print(" object <" INTPTR_FORMAT "> of type ", p2i(sv->value()())); |
1143 tty->print(" object <" INTPTR_FORMAT "> of type ", p2i(sv->value()())); |
1144 k->print_value(); |
1144 k->print_value(); |
1145 assert(obj.not_null() || realloc_failures, "reallocation was missed"); |
1145 assert(obj.not_null() || realloc_failures, "reallocation was missed"); |