OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "vm/hash_table.h" | 7 #include "vm/hash_table.h" |
8 #include "vm/isolate_reload.h" | 8 #include "vm/isolate_reload.h" |
9 #include "vm/log.h" | 9 #include "vm/log.h" |
10 #include "vm/resolver.h" | 10 #include "vm/resolver.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 // Given an old enum class, add become mappings from old values to new values. | 194 // Given an old enum class, add become mappings from old values to new values. |
195 // Some notes about how we reload enums below: | 195 // Some notes about how we reload enums below: |
196 // | 196 // |
197 // When an enum is reloaded the following three things can happen, possibly | 197 // When an enum is reloaded the following three things can happen, possibly |
198 // simultaneously. | 198 // simultaneously. |
199 // | 199 // |
200 // 1) A new enum value is added. | 200 // 1) A new enum value is added. |
201 // This case is handled automatically. | 201 // This case is handled automatically. |
202 // 2) Enum values are reordered. | 202 // 2) Enum values are reordered. |
203 // We pair old and new enums and the old enums 'become' the new ones so | 203 // We pair old and new enums and the old enums 'become' the new ones so |
204 // the ordering is always correct (i.e. enum indicies match slots in values | 204 // the ordering is always correct (i.e. enum indices match slots in values |
205 // array) | 205 // array) |
206 // 3) An existing enum value is removed. | 206 // 3) An existing enum value is removed. |
207 // Each enum class has a canonical 'deleted' enum sentinel instance. | 207 // Each enum class has a canonical 'deleted' enum sentinel instance. |
208 // When an enum value is deleted, we 'become' all references to the 'deleted' | 208 // When an enum value is deleted, we 'become' all references to the 'deleted' |
209 // sentinel value. The index value is -1. | 209 // sentinel value. The index value is -1. |
210 // | 210 // |
211 void Class::ReplaceEnum(const Class& old_enum) const { | 211 void Class::ReplaceEnum(const Class& old_enum) const { |
212 // We only do this for finalized enum classes. | 212 // We only do this for finalized enum classes. |
213 ASSERT(is_enum_class()); | 213 ASSERT(is_enum_class()); |
214 ASSERT(old_enum.is_enum_class()); | 214 ASSERT(old_enum.is_enum_class()); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 ASSERT(!enum_values.IsNull()); | 319 ASSERT(!enum_values.IsNull()); |
320 reload_context->AddEnumBecomeMapping(old_enum_values, enum_values); | 320 reload_context->AddEnumBecomeMapping(old_enum_values, enum_values); |
321 | 321 |
322 // Map the old E._deleted_enum_sentinel to the new E._deleted_enum_sentinel. | 322 // Map the old E._deleted_enum_sentinel to the new E._deleted_enum_sentinel. |
323 ASSERT(!old_deleted_enum_sentinel.IsNull()); | 323 ASSERT(!old_deleted_enum_sentinel.IsNull()); |
324 ASSERT(!deleted_enum_sentinel.IsNull()); | 324 ASSERT(!deleted_enum_sentinel.IsNull()); |
325 reload_context->AddEnumBecomeMapping(old_deleted_enum_sentinel, | 325 reload_context->AddEnumBecomeMapping(old_deleted_enum_sentinel, |
326 deleted_enum_sentinel); | 326 deleted_enum_sentinel); |
327 | 327 |
328 if (enums_deleted) { | 328 if (enums_deleted) { |
329 // Map all deleted enums to the deleted enum senintel value. | 329 // Map all deleted enums to the deleted enum sentinel value. |
330 // TODO(johnmccutchan): Add this to the reload 'notices' list. | 330 // TODO(johnmccutchan): Add this to the reload 'notices' list. |
331 VTIR_Print( | 331 VTIR_Print( |
332 "The following enum values were deleted from %s and will become the " | 332 "The following enum values were deleted from %s and will become the " |
333 "deleted enum sentinel:\n", | 333 "deleted enum sentinel:\n", |
334 old_enum.ToCString()); | 334 old_enum.ToCString()); |
335 UnorderedHashMap<EnumMapTraits> enum_map(enum_map_storage.raw()); | 335 UnorderedHashMap<EnumMapTraits> enum_map(enum_map_storage.raw()); |
336 UnorderedHashMap<EnumMapTraits>::Iterator it(&enum_map); | 336 UnorderedHashMap<EnumMapTraits>::Iterator it(&enum_map); |
337 while (it.MoveNext()) { | 337 while (it.MoveNext()) { |
338 const intptr_t entry = it.Current(); | 338 const intptr_t entry = it.Current(); |
339 enum_ident = String::RawCast(enum_map.GetKey(entry)); | 339 enum_ident = String::RawCast(enum_map.GetKey(entry)); |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 const Array& data_array = | 763 const Array& data_array = |
764 Array::Handle(zone, CachedEmptyICDataArray(num_args)); | 764 Array::Handle(zone, CachedEmptyICDataArray(num_args)); |
765 set_ic_data_array(data_array); | 765 set_ic_data_array(data_array); |
766 } | 766 } |
767 } | 767 } |
768 } | 768 } |
769 | 769 |
770 #endif // !PRODUCT | 770 #endif // !PRODUCT |
771 | 771 |
772 } // namespace dart. | 772 } // namespace dart. |
OLD | NEW |