@@ -192,9 +192,6 @@ void CallSiteResetter::ResetCaches(const ObjectPool& pool) {
192
192
193
193
void Class::CopyStaticFieldValues (ProgramReloadContext* reload_context,
194
194
const Class& old_cls) const {
195
- // We only update values for non-enum classes.
196
- const bool update_values = !is_enum_class ();
197
-
198
195
const Array& old_field_list = Array::Handle (old_cls.fields ());
199
196
Field& old_field = Field::Handle ();
200
197
String& old_name = String::Handle ();
@@ -215,7 +212,7 @@ void Class::CopyStaticFieldValues(ProgramReloadContext* reload_context,
215
212
if (field.is_static ()) {
216
213
// We only copy values if requested and if the field is not a const
217
214
// field. We let const fields be updated with a reload.
218
- if (update_values && !field.is_const ()) {
215
+ if (!field.is_const ()) {
219
216
// Make new field point to the old field value so that both
220
217
// old and new code see and update same value.
221
218
reload_context->isolate_group ()->FreeStaticField (field);
@@ -307,15 +304,15 @@ void Class::ReplaceEnum(ProgramReloadContext* reload_context,
307
304
308
305
Zone* zone = Thread::Current ()->zone ();
309
306
310
- Array& enum_fields = Array::Handle (zone);
311
307
Field& field = Field::Handle (zone);
308
+ Class& cls = Class::Handle (zone);
312
309
String& enum_ident = String::Handle ();
313
310
Instance& old_enum_value = Instance::Handle (zone);
314
311
Instance& enum_value = Instance::Handle (zone);
315
312
// The E.values array.
316
- Instance & old_enum_values = Instance ::Handle (zone);
313
+ Array & old_enum_values = Array ::Handle (zone);
317
314
// The E.values array.
318
- Instance & enum_values = Instance ::Handle (zone);
315
+ Array & enum_values = Array ::Handle (zone);
319
316
// The E._deleted_enum_sentinel instance.
320
317
Instance& old_deleted_enum_sentinel = Instance::Handle (zone);
321
318
// The E._deleted_enum_sentinel instance.
@@ -327,31 +324,26 @@ void Class::ReplaceEnum(ProgramReloadContext* reload_context,
327
324
TIR_Print (" Replacing enum `%s`\n " , String::Handle (Name ()).ToCString ());
328
325
329
326
{
327
+ field = old_enum.LookupStaticField (Symbols::Values ());
328
+ ASSERT (!field.IsNull () && field.is_static () && field.is_const ());
329
+ old_enum_values ^= field.StaticConstFieldValue ();
330
+ ASSERT (!old_enum_values.IsNull ());
331
+
332
+ field = old_enum.LookupStaticField (Symbols::_DeletedEnumSentinel ());
333
+ ASSERT (!field.IsNull () && field.is_static () && field.is_const ());
334
+ old_deleted_enum_sentinel ^= field.StaticConstFieldValue ();
335
+ ASSERT (!old_deleted_enum_sentinel.IsNull ());
336
+
337
+ cls = old_enum.SuperClass ();
338
+ field = cls.LookupInstanceFieldAllowPrivate (Symbols::_name ());
339
+ ASSERT (!field.IsNull ());
340
+
330
341
UnorderedHashMap<EnumMapTraits> enum_map (enum_map_storage.ptr ());
331
342
// Build a map of all enum name -> old enum instance.
332
- enum_fields = old_enum.fields ();
333
- for (intptr_t i = 0 ; i < enum_fields.Length (); i++) {
334
- field = Field::RawCast (enum_fields.At (i));
335
- enum_ident = field.name ();
336
- if (!field.is_static ()) {
337
- // Enum instances are only held in static fields.
338
- continue ;
339
- }
340
- ASSERT (field.is_const ());
341
- if (enum_ident.Equals (Symbols::Values ())) {
342
- old_enum_values = Instance::RawCast (field.StaticConstFieldValue ());
343
- // Non-enum instance.
344
- continue ;
345
- }
346
- if (enum_ident.Equals (Symbols::_DeletedEnumSentinel ())) {
347
- old_deleted_enum_sentinel =
348
- Instance::RawCast (field.StaticConstFieldValue ());
349
- // Non-enum instance.
350
- continue ;
351
- }
352
- old_enum_value = Instance::RawCast (field.StaticConstFieldValue ());
353
-
343
+ for (intptr_t i = 0 , n = old_enum_values.Length (); i < n; ++i) {
344
+ old_enum_value ^= old_enum_values.At (i);
354
345
ASSERT (!old_enum_value.IsNull ());
346
+ enum_ident ^= old_enum_value.GetField (field);
355
347
VTIR_Print (" Element %s being added to mapping\n " , enum_ident.ToCString ());
356
348
bool update = enum_map.UpdateOrInsert (enum_ident, old_enum_value);
357
349
VTIR_Print (" Element %s added to mapping\n " , enum_ident.ToCString ());
@@ -364,31 +356,27 @@ void Class::ReplaceEnum(ProgramReloadContext* reload_context,
364
356
365
357
bool enums_deleted = false ;
366
358
{
359
+ field = LookupStaticField (Symbols::Values ());
360
+ ASSERT (!field.IsNull () && field.is_static () && field.is_const ());
361
+ enum_values ^= field.StaticConstFieldValue ();
362
+ ASSERT (!enum_values.IsNull ());
363
+
364
+ field = LookupStaticField (Symbols::_DeletedEnumSentinel ());
365
+ ASSERT (!field.IsNull () && field.is_static () && field.is_const ());
366
+ deleted_enum_sentinel ^= field.StaticConstFieldValue ();
367
+ ASSERT (!deleted_enum_sentinel.IsNull ());
368
+
369
+ cls = SuperClass ();
370
+ field = cls.LookupInstanceFieldAllowPrivate (Symbols::_name ());
371
+ ASSERT (!field.IsNull ());
372
+
367
373
UnorderedHashMap<EnumMapTraits> enum_map (enum_map_storage.ptr ());
368
374
// Add a become mapping from the old instances to the new instances.
369
- enum_fields = fields ();
370
- for (intptr_t i = 0 ; i < enum_fields.Length (); i++) {
371
- field = Field::RawCast (enum_fields.At (i));
372
- enum_ident = field.name ();
373
- if (!field.is_static ()) {
374
- // Enum instances are only held in static fields.
375
- continue ;
376
- }
377
- ASSERT (field.is_const ());
378
- if (enum_ident.Equals (Symbols::Values ())) {
379
- enum_values = Instance::RawCast (field.StaticConstFieldValue ());
380
- // Non-enum instance.
381
- continue ;
382
- }
383
- if (enum_ident.Equals (Symbols::_DeletedEnumSentinel ())) {
384
- deleted_enum_sentinel =
385
- Instance::RawCast (field.StaticConstFieldValue ());
386
- // Non-enum instance.
387
- continue ;
388
- }
389
- enum_value = Instance::RawCast (field.StaticConstFieldValue ());
390
-
375
+ for (intptr_t i = 0 , n = enum_values.Length (); i < n; ++i) {
376
+ enum_value ^= enum_values.At (i);
391
377
ASSERT (!enum_value.IsNull ());
378
+ enum_ident ^= enum_value.GetField (field);
379
+
392
380
old_enum_value ^= enum_map.GetOrNull (enum_ident);
393
381
if (old_enum_value.IsNull ()) {
394
382
VTIR_Print (" New element %s was not found in mapping\n " ,
@@ -408,13 +396,9 @@ void Class::ReplaceEnum(ProgramReloadContext* reload_context,
408
396
}
409
397
410
398
// Map the old E.values array to the new E.values array.
411
- ASSERT (!old_enum_values.IsNull ());
412
- ASSERT (!enum_values.IsNull ());
413
399
reload_context->AddBecomeMapping (old_enum_values, enum_values);
414
400
415
401
// Map the old E._deleted_enum_sentinel to the new E._deleted_enum_sentinel.
416
- ASSERT (!old_deleted_enum_sentinel.IsNull ());
417
- ASSERT (!deleted_enum_sentinel.IsNull ());
418
402
reload_context->AddBecomeMapping (old_deleted_enum_sentinel,
419
403
deleted_enum_sentinel);
420
404
0 commit comments