@@ -377,8 +377,9 @@ static bool rematerialize_objects(JavaThread* thread, int exec_mode, nmethod* co
377
377
realloc_failures = Deoptimization::realloc_objects (thread, &deoptee, &map, objects, THREAD);
378
378
JRT_END
379
379
}
380
- bool skip_internal = (compiled_method != nullptr ) && !compiled_method->is_compiled_by_jvmci ();
381
- Deoptimization::reassign_fields (&deoptee, &map, objects, realloc_failures, skip_internal);
380
+ guarantee (compiled_method != nullptr , " deopt must be associated with an nmethod" );
381
+ bool is_jvmci = compiled_method->is_compiled_by_jvmci ();
382
+ Deoptimization::reassign_fields (&deoptee, &map, objects, realloc_failures, is_jvmci);
382
383
if (TraceDeoptimization) {
383
384
print_objects (deoptee_thread, objects, realloc_failures);
384
385
}
@@ -1458,27 +1459,26 @@ class ReassignedField {
1458
1459
}
1459
1460
};
1460
1461
1461
- static int compare (ReassignedField* left, ReassignedField* right) {
1462
- return left->_offset - right->_offset ;
1463
- }
1464
-
1465
- // Restore fields of an eliminated instance object using the same field order
1466
- // returned by HotSpotResolvedObjectTypeImpl.getInstanceFields(true)
1467
- static int reassign_fields_by_klass (InstanceKlass* klass, frame* fr, RegisterMap* reg_map, ObjectValue* sv, int svIndex, oop obj, bool skip_internal) {
1468
- GrowableArray<ReassignedField>* fields = new GrowableArray<ReassignedField>();
1469
- InstanceKlass* ik = klass;
1470
- while (ik != nullptr ) {
1471
- for (AllFieldStream fs (ik); !fs.done (); fs.next ()) {
1472
- if (!fs.access_flags ().is_static () && (!skip_internal || !fs.field_flags ().is_injected ())) {
1473
- ReassignedField field;
1474
- field._offset = fs.offset ();
1475
- field._type = Signature::basic_type (fs.signature ());
1476
- fields->append (field);
1477
- }
1462
+ // Gets the fields of `klass` that are eliminated by escape analysis and need to be reassigned
1463
+ static GrowableArray<ReassignedField>* get_reassigned_fields (InstanceKlass* klass, GrowableArray<ReassignedField>* fields, bool is_jvmci) {
1464
+ InstanceKlass* super = klass->superklass ();
1465
+ if (super != nullptr ) {
1466
+ get_reassigned_fields (super, fields, is_jvmci);
1467
+ }
1468
+ for (AllFieldStream fs (klass); !fs.done (); fs.next ()) {
1469
+ if (!fs.access_flags ().is_static () && (is_jvmci || !fs.field_flags ().is_injected ())) {
1470
+ ReassignedField field;
1471
+ field._offset = fs.offset ();
1472
+ field._type = Signature::basic_type (fs.signature ());
1473
+ fields->append (field);
1478
1474
}
1479
- ik = ik->superklass ();
1480
1475
}
1481
- fields->sort (compare);
1476
+ return fields;
1477
+ }
1478
+
1479
+ // Restore fields of an eliminated instance object employing the same field order used by the compiler.
1480
+ static int reassign_fields_by_klass (InstanceKlass* klass, frame* fr, RegisterMap* reg_map, ObjectValue* sv, int svIndex, oop obj, bool is_jvmci) {
1481
+ GrowableArray<ReassignedField>* fields = get_reassigned_fields (klass, new GrowableArray<ReassignedField>(), is_jvmci);
1482
1482
for (int i = 0 ; i < fields->length (); i++) {
1483
1483
ScopeValue* scope_field = sv->field_at (svIndex);
1484
1484
StackValue* value = StackValue::create_stack_value (fr, reg_map, scope_field);
@@ -1560,7 +1560,7 @@ static int reassign_fields_by_klass(InstanceKlass* klass, frame* fr, RegisterMap
1560
1560
}
1561
1561
1562
1562
// restore fields of all eliminated objects and arrays
1563
- void Deoptimization::reassign_fields (frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool skip_internal ) {
1563
+ void Deoptimization::reassign_fields (frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool is_jvmci ) {
1564
1564
for (int i = 0 ; i < objects->length (); i++) {
1565
1565
assert (objects->at (i)->is_object (), " invalid debug information" );
1566
1566
ObjectValue* sv = (ObjectValue*) objects->at (i);
@@ -1604,7 +1604,7 @@ void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableAr
1604
1604
}
1605
1605
if (k->is_instance_klass ()) {
1606
1606
InstanceKlass* ik = InstanceKlass::cast (k);
1607
- reassign_fields_by_klass (ik, fr, reg_map, sv, 0 , obj (), skip_internal );
1607
+ reassign_fields_by_klass (ik, fr, reg_map, sv, 0 , obj (), is_jvmci );
1608
1608
} else if (k->is_typeArray_klass ()) {
1609
1609
TypeArrayKlass* ak = TypeArrayKlass::cast (k);
1610
1610
reassign_type_array_elements (fr, reg_map, sv, (typeArrayOop) obj (), ak->element_type ());
0 commit comments