diff --git a/Libraries/LibJS/Runtime/Error.cpp b/Libraries/LibJS/Runtime/Error.cpp index e27b32bae1c..fbfd2d630dc 100644 --- a/Libraries/LibJS/Runtime/Error.cpp +++ b/Libraries/LibJS/Runtime/Error.cpp @@ -41,10 +41,8 @@ GC::Ref Error::create(Realm& realm) GC::Ref Error::create(Realm& realm, String message) { - auto& vm = realm.vm(); auto error = Error::create(realm); - u8 attr = Attribute::Writable | Attribute::Configurable; - error->define_direct_property(vm.names.message, PrimitiveString::create(vm, move(message)), attr); + error->set_message(move(message)); return error; } @@ -77,6 +75,14 @@ ThrowCompletionOr Error::install_error_cause(Value options) return {}; } +void Error::set_message(String message) +{ + auto& vm = this->vm(); + + u8 attr = Attribute::Writable | Attribute::Configurable; + define_direct_property(vm.names.message, PrimitiveString::create(vm, move(message)), attr); +} + void Error::populate_stack() { auto stack_trace = vm().stack_trace(); @@ -156,30 +162,28 @@ String Error::stack_string(CompactTraceback compact) const return MUST(stack_string_builder.to_string()); } -#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, ArrayType) \ - GC_DEFINE_ALLOCATOR(ClassName); \ - GC::Ref ClassName::create(Realm& realm) \ - { \ - return realm.create(realm.intrinsics().snake_name##_prototype()); \ - } \ - \ - GC::Ref ClassName::create(Realm& realm, String message) \ - { \ - auto& vm = realm.vm(); \ - auto error = ClassName::create(realm); \ - u8 attr = Attribute::Writable | Attribute::Configurable; \ - error->define_direct_property(vm.names.message, PrimitiveString::create(vm, move(message)), attr); \ - return error; \ - } \ - \ - GC::Ref ClassName::create(Realm& realm, StringView message) \ - { \ - return create(realm, MUST(String::from_utf8(message))); \ - } \ - \ - ClassName::ClassName(Object& prototype) \ - : Error(prototype) \ - { \ +#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, ArrayType) \ + GC_DEFINE_ALLOCATOR(ClassName); \ + GC::Ref ClassName::create(Realm& realm) \ + { \ + return realm.create(realm.intrinsics().snake_name##_prototype()); \ + } \ + \ + GC::Ref ClassName::create(Realm& realm, String message) \ + { \ + auto error = ClassName::create(realm); \ + error->set_message(move(message)); \ + return error; \ + } \ + \ + GC::Ref ClassName::create(Realm& realm, StringView message) \ + { \ + return create(realm, MUST(String::from_utf8(message))); \ + } \ + \ + ClassName::ClassName(Object& prototype) \ + : Error(prototype) \ + { \ } JS_ENUMERATE_NATIVE_ERRORS diff --git a/Libraries/LibJS/Runtime/Error.h b/Libraries/LibJS/Runtime/Error.h index dabac29548a..8f43e9208f2 100644 --- a/Libraries/LibJS/Runtime/Error.h +++ b/Libraries/LibJS/Runtime/Error.h @@ -41,6 +41,8 @@ public: ThrowCompletionOr install_error_cause(Value options); + void set_message(String); + Vector const& traceback() const { return m_traceback; } protected: