// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_OBJECTS_MAP_UPDATER_H_ #define V8_OBJECTS_MAP_UPDATER_H_ #include <optional> #include "src/common/globals.h" #include "src/handles/handles.h" #include "src/objects/elements-kind.h" #include "src/objects/field-type.h" #include "src/objects/map.h" #include "src/objects/property-details.h" namespace v8::internal { // The |MapUpdater| class implements all sorts of map reconfigurations // including changes of elements kind, property attributes, property kind, // property location and field representations/type changes. It ensures that // the reconfigured map and all the intermediate maps are properly integrated // into the existing transition tree. // // To avoid high degrees over polymorphism, and to stabilize quickly, on every // rewrite the new type is deduced by merging the current type with any // potential new (partial) version of the type in the transition tree. // To do this, on each rewrite: // - Search the root of the transition tree using FindRootMap, remember // the integrity level (preventExtensions/seal/freeze) of transitions. // - Find/create a |root_map| with the requested |new_elements_kind|. // - Find |target_map|, the newest matching version of this map using the // "updated" |old_map|'s descriptor array (i.e. whose entry at |modify_index| // is considered to be of |new_kind| and having |new_attributes|) to walk // the transition tree. If there was an integrity level transition on the path // to the old map, use the descriptor array of the map preceding the first // integrity level transition (|integrity_source_map|), and try to replay // the integrity level transition afterwards. // - Merge/generalize the "updated" descriptor array of the |old_map| and // descriptor array of the |target_map|. // - Generalize the |modify_index| descriptor using |new_representation| and // |new_field_type|. // - Walk the tree again starting from the root towards |target_map|. Stop at // |split_map|, the first map whose descriptor array does not match the merged // descriptor array. // - If |target_map| == |split_map|, and there are no integrity level // transitions, |target_map| is in the expected state. Return it. // - Otherwise, invalidate the outdated transition target from |target_map|, and // replace its transition tree with a new branch for the updated descriptors. // - If the |old_map| had integrity level transition, create the new map for it. class V8_EXPORT_PRIVATE MapUpdater { … }; } // namespace v8::internal #endif // V8_OBJECTS_MAP_UPDATER_H_