From eb5aae24f404571e750f6537cb97de95ababb686 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Fri, 17 Mar 2023 10:21:51 -0400 Subject: LibJS: Move creation of fallible VM objects to its creation factory No change of behavior in this patch, but this will allow this factory to propagate any errors from the creation of these objects. --- Userland/Libraries/LibJS/Runtime/VM.cpp | 25 ++++++++++++++++--------- Userland/Libraries/LibJS/Runtime/VM.h | 22 +++++++++++++++------- 2 files changed, 31 insertions(+), 16 deletions(-) (limited to 'Userland/Libraries/LibJS') 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 }; -- cgit v1.2.3