diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp index 47ed699bf8..64c90a6d0a 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.cpp +++ b/Userland/Libraries/LibJS/Runtime/VM.cpp @@ -36,7 +36,20 @@ namespace JS { NonnullRefPtr VM::create(OwnPtr custom_data) { - return adopt_ref(*new VM(move(custom_data))); + ErrorMessages error_messages {}; + error_messages[to_underlying(ErrorMessage::OutOfMemory)] = String::from_utf8(ErrorType::OutOfMemory.message()).release_value_but_fixme_should_propagate_errors(); + + auto vm = adopt_ref(*new VM(move(custom_data), move(error_messages))); + + WellKnownSymbols well_known_symbols { +#define __JS_ENUMERATE(SymbolName, snake_name) \ + Symbol::create(*vm, "Symbol." #SymbolName##_string.release_value_but_fixme_should_propagate_errors(), false), + JS_ENUMERATE_WELL_KNOWN_SYMBOLS +#undef __JS_ENUMERATE + }; + + vm->set_well_known_symbols(move(well_known_symbols)); + return vm; } template @@ -47,8 +60,9 @@ static constexpr auto make_single_ascii_character_strings(IndexSequence()); -VM::VM(OwnPtr custom_data) +VM::VM(OwnPtr custom_data, ErrorMessages error_messages) : m_heap(*this) + , m_error_messages(move(error_messages)) , m_custom_data(move(custom_data)) { m_empty_string = m_heap.allocate_without_realm(String {}); @@ -150,13 +164,6 @@ VM::VM(OwnPtr custom_data) // NOTE: Since LibJS has no way of knowing whether the current environment is a browser we always // call HostEnsureCanAddPrivateElement when needed. }; - -#define __JS_ENUMERATE(SymbolName, snake_name) \ - m_well_known_symbol_##snake_name = Symbol::create(*this, "Symbol." #SymbolName##_string.release_value_but_fixme_should_propagate_errors(), false); - JS_ENUMERATE_WELL_KNOWN_SYMBOLS -#undef __JS_ENUMERATE - - m_error_messages[to_underlying(ErrorMessage::OutOfMemory)] = String::from_utf8(ErrorType::OutOfMemory.message()).release_value_but_fixme_should_propagate_errors(); } String const& VM::error_message(ErrorMessage type) const diff --git a/Userland/Libraries/LibJS/Runtime/VM.h b/Userland/Libraries/LibJS/Runtime/VM.h index 287b53dfad..e306ef2a51 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.h +++ b/Userland/Libraries/LibJS/Runtime/VM.h @@ -68,7 +68,7 @@ public: #define __JS_ENUMERATE(SymbolName, snake_name) \ Symbol* well_known_symbol_##snake_name() const \ { \ - return m_well_known_symbol_##snake_name; \ + return m_well_known_symbols.snake_name; \ } JS_ENUMERATE_WELL_KNOWN_SYMBOLS #undef __JS_ENUMERATE @@ -269,7 +269,16 @@ public: Function(Object&)> host_ensure_can_add_private_element; private: - explicit VM(OwnPtr); + using ErrorMessages = AK::Array; + + struct WellKnownSymbols { +#define __JS_ENUMERATE(SymbolName, snake_name) \ + GCPtr snake_name; + JS_ENUMERATE_WELL_KNOWN_SYMBOLS +#undef __JS_ENUMERATE + }; + + VM(OwnPtr, ErrorMessages); ThrowCompletionOr property_binding_initialization(BindingPattern const& binding, Value value, Environment* environment); ThrowCompletionOr iterator_binding_initialization(BindingPattern const& binding, Iterator& iterator_record, Environment* environment); @@ -280,6 +289,8 @@ private: ThrowCompletionOr import_module_dynamically(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability); void finish_dynamic_import(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability, Promise* inner_promise); + void set_well_known_symbols(WellKnownSymbols well_known_symbols) { m_well_known_symbols = move(well_known_symbols); } + HashMap> m_string_cache; HashMap> m_deprecated_string_cache; @@ -301,7 +312,7 @@ private: GCPtr m_empty_string; GCPtr m_single_ascii_character_strings[128] {}; - AK::Array m_error_messages; + ErrorMessages m_error_messages; struct StoredModule { ScriptOrModule referencing_script_or_module; @@ -315,10 +326,7 @@ private: Vector m_loaded_modules; -#define __JS_ENUMERATE(SymbolName, snake_name) \ - GCPtr m_well_known_symbol_##snake_name; - JS_ENUMERATE_WELL_KNOWN_SYMBOLS -#undef __JS_ENUMERATE + WellKnownSymbols m_well_known_symbols; u32 m_execution_generation { 0 };