Selaa lähdekoodia

LibJS: Add modification counter in DeclarativeEnvironment

This counter is incremented whenever a mutating operation occurs
within the environment's set of bindings.

It is going to be used by GetGlobal instruction to correctly invalidate
cache when global declarative environment is mutated.
Aliaksandr Kalenik 2 vuotta sitten
vanhempi
commit
a27c4cf63c

+ 6 - 0
Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp

@@ -77,6 +77,8 @@ ThrowCompletionOr<void> DeclarativeEnvironment::create_mutable_binding(VM&, Depr
         .initialized = false,
     });
 
+    ++m_environment_serial_number;
+
     // 3. Return unused.
     return {};
 }
@@ -97,6 +99,8 @@ ThrowCompletionOr<void> DeclarativeEnvironment::create_immutable_binding(VM&, De
         .initialized = false,
     });
 
+    ++m_environment_serial_number;
+
     // 3. Return unused.
     return {};
 }
@@ -217,6 +221,8 @@ ThrowCompletionOr<bool> DeclarativeEnvironment::delete_binding(VM&, DeprecatedFl
     // NOTE: We keep the entries in m_bindings to avoid disturbing indices.
     binding_and_index->binding() = {};
 
+    ++m_environment_serial_number;
+
     // 4. Return true.
     return true;
 }

+ 4 - 0
Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h

@@ -60,6 +60,8 @@ public:
 
     void shrink_to_fit();
 
+    [[nodiscard]] u64 environment_serial_number() const { return m_environment_serial_number; }
+
 private:
     ThrowCompletionOr<Value> get_binding_value_direct(VM&, Binding&, bool strict);
     ThrowCompletionOr<void> set_mutable_binding_direct(VM&, Binding&, Value, bool strict);
@@ -121,6 +123,8 @@ private:
 
     Vector<Binding> m_bindings;
     Vector<DisposableResource> m_disposable_resource_stack;
+
+    u64 m_environment_serial_number { 0 };
 };
 
 template<>