1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:27:35 +00:00

LibJS: Propagate the OOM error from setting the String length property

This commit is contained in:
Timothy Flynn 2023-01-28 13:40:56 -05:00 committed by Linus Groh
parent b75b7f0c0d
commit 8414734a2d
4 changed files with 6 additions and 7 deletions

View file

@ -63,7 +63,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> StringConstructor::construct(FunctionObj
else else
primitive_string = TRY(vm.argument(0).to_primitive_string(vm)); primitive_string = TRY(vm.argument(0).to_primitive_string(vm));
auto* prototype = TRY(get_prototype_from_constructor(vm, new_target, &Intrinsics::string_prototype)); auto* prototype = TRY(get_prototype_from_constructor(vm, new_target, &Intrinsics::string_prototype));
return StringObject::create(realm, *primitive_string, *prototype); return MUST_OR_THROW_OOM(StringObject::create(realm, *primitive_string, *prototype));
} }
// 22.1.2.4 String.raw ( template, ...substitutions ), https://tc39.es/ecma262/#sec-string.raw // 22.1.2.4 String.raw ( template, ...substitutions ), https://tc39.es/ecma262/#sec-string.raw

View file

@ -15,9 +15,9 @@
namespace JS { namespace JS {
// 10.4.3.4 StringCreate ( value, prototype ), https://tc39.es/ecma262/#sec-stringcreate // 10.4.3.4 StringCreate ( value, prototype ), https://tc39.es/ecma262/#sec-stringcreate
NonnullGCPtr<StringObject> StringObject::create(Realm& realm, PrimitiveString& primitive_string, Object& prototype) ThrowCompletionOr<NonnullGCPtr<StringObject>> StringObject::create(Realm& realm, PrimitiveString& primitive_string, Object& prototype)
{ {
return realm.heap().allocate<StringObject>(realm, primitive_string, prototype).release_allocated_value_but_fixme_should_propagate_errors(); return MUST_OR_THROW_OOM(realm.heap().allocate<StringObject>(realm, primitive_string, prototype));
} }
StringObject::StringObject(PrimitiveString& string, Object& prototype) StringObject::StringObject(PrimitiveString& string, Object& prototype)
@ -31,8 +31,7 @@ ThrowCompletionOr<void> StringObject::initialize(Realm& realm)
auto& vm = this->vm(); auto& vm = this->vm();
MUST_OR_THROW_OOM(Base::initialize(realm)); MUST_OR_THROW_OOM(Base::initialize(realm));
// FIXME: Propagate this error. define_direct_property(vm.names.length, Value(MUST_OR_THROW_OOM(m_string.utf16_string_view()).length_in_code_units()), 0);
define_direct_property(vm.names.length, Value(MUST(m_string.utf16_string_view()).length_in_code_units()), 0);
return {}; return {};
} }

View file

@ -14,7 +14,7 @@ class StringObject : public Object {
JS_OBJECT(StringObject, Object); JS_OBJECT(StringObject, Object);
public: public:
static NonnullGCPtr<StringObject> create(Realm&, PrimitiveString&, Object& prototype); static ThrowCompletionOr<NonnullGCPtr<StringObject>> create(Realm&, PrimitiveString&, Object& prototype);
virtual ThrowCompletionOr<void> initialize(Realm&) override; virtual ThrowCompletionOr<void> initialize(Realm&) override;
virtual ~StringObject() override = default; virtual ~StringObject() override = default;

View file

@ -566,7 +566,7 @@ ThrowCompletionOr<Object*> Value::to_object(VM& vm) const
// String // String
case STRING_TAG: case STRING_TAG:
// Return a new String object whose [[StringData]] internal slot is set to argument. See 22.1 for a description of String objects. // Return a new String object whose [[StringData]] internal slot is set to argument. See 22.1 for a description of String objects.
return StringObject::create(realm, const_cast<JS::PrimitiveString&>(as_string()), *realm.intrinsics().string_prototype()).ptr(); return MUST_OR_THROW_OOM(StringObject::create(realm, const_cast<JS::PrimitiveString&>(as_string()), *realm.intrinsics().string_prototype())).ptr();
// Symbol // Symbol
case SYMBOL_TAG: case SYMBOL_TAG:
// Return a new Symbol object whose [[SymbolData]] internal slot is set to argument. See 20.4 for a description of Symbol objects. // Return a new Symbol object whose [[SymbolData]] internal slot is set to argument. See 20.4 for a description of Symbol objects.