From a27c4cf63c13218ddbc4a8cb6bf6e0e79933c7b8 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 12 Jul 2023 14:30:51 +0200 Subject: [PATCH] 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. --- Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp | 6 ++++++ Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp index 32f4fd8b16..91b8f7b1a6 100644 --- a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp @@ -77,6 +77,8 @@ ThrowCompletionOr DeclarativeEnvironment::create_mutable_binding(VM&, Depr .initialized = false, }); + ++m_environment_serial_number; + // 3. Return unused. return {}; } @@ -97,6 +99,8 @@ ThrowCompletionOr DeclarativeEnvironment::create_immutable_binding(VM&, De .initialized = false, }); + ++m_environment_serial_number; + // 3. Return unused. return {}; } @@ -217,6 +221,8 @@ ThrowCompletionOr 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; } diff --git a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h index f39dceaeaf..f03aabc057 100644 --- a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h +++ b/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 get_binding_value_direct(VM&, Binding&, bool strict); ThrowCompletionOr set_mutable_binding_direct(VM&, Binding&, Value, bool strict); @@ -121,6 +123,8 @@ private: Vector m_bindings; Vector m_disposable_resource_stack; + + u64 m_environment_serial_number { 0 }; }; template<>