hotspot/src/share/vm/runtime/deoptimization.cpp
changeset 46329 53ccc37bda19
parent 46327 91576389a517
child 46407 32baebe49efe
equal deleted inserted replaced
46328:6061df52d610 46329:53ccc37bda19
   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");