diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 501c1b28d14..83acef7b1f2 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -194,7 +194,7 @@ ThrowCompletionOr ClassMethod::class_element_evaluatio VERIFY_NOT_REACHED(); } - return ClassValue { normal_completion({}) }; + return ClassValue { normal_completion(js_undefined()) }; } else { auto& private_name = property_key_or_private_name.get(); switch (kind()) { @@ -417,8 +417,7 @@ ThrowCompletionOr ClassExpression::create_class_const instance_fields.append(move(*class_field_definition_ptr)); } else if (element->class_element_kind() == ClassElement::ElementKind::StaticInitializer) { // We use Completion to hold the ClassStaticBlockDefinition Record. - VERIFY(element_value.has() && element_value.get().value().has_value()); - auto& element_object = element_value.get().value()->as_object(); + auto& element_object = element_value.get().value().as_object(); VERIFY(is(element_object)); static_elements.append(GC::Ref { static_cast(element_object) }); } diff --git a/Libraries/LibJS/Bytecode/Interpreter.cpp b/Libraries/LibJS/Bytecode/Interpreter.cpp index 340d166cb13..2f40c702270 100644 --- a/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -244,7 +244,7 @@ ThrowCompletionOr Interpreter::run(Script& script_record, GC::Ptr Interpreter::run(Script& script_record, GC::Ptr Interpreter::run(Script& script_record, GC::Ptr Interpreter::run(SourceTextModule& module) @@ -359,7 +360,7 @@ Interpreter::HandleExceptionResponse Interpreter::handle_exception(size_t& progr FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point) { if (vm().did_reach_stack_space_limit()) { - reg(Register::exception()) = vm().throw_completion(ErrorType::CallStackSizeExceeded).release_value().value(); + reg(Register::exception()) = vm().throw_completion(ErrorType::CallStackSizeExceeded).value(); return; } @@ -2940,7 +2941,7 @@ ThrowCompletionOr IteratorClose::execute_impl(Bytecode::Interpreter& inter auto& iterator = static_cast(interpreter.get(m_iterator_record).as_cell()); // FIXME: Return the value of the resulting completion. (Note that m_completion_value can be empty!) - TRY(iterator_close(vm, iterator, Completion { m_completion_type, m_completion_value })); + TRY(iterator_close(vm, iterator, Completion { m_completion_type, m_completion_value.value_or(js_undefined()) })); return {}; } @@ -2950,7 +2951,7 @@ ThrowCompletionOr AsyncIteratorClose::execute_impl(Bytecode::Interpreter& auto& iterator = static_cast(interpreter.get(m_iterator_record).as_cell()); // FIXME: Return the value of the resulting completion. (Note that m_completion_value can be empty!) - TRY(async_iterator_close(vm, iterator, Completion { m_completion_type, m_completion_value })); + TRY(async_iterator_close(vm, iterator, Completion { m_completion_type, m_completion_value.value_or(js_undefined()) })); return {}; } diff --git a/Libraries/LibJS/CyclicModule.cpp b/Libraries/LibJS/CyclicModule.cpp index 5ed335efab2..8c6eb24a3fe 100644 --- a/Libraries/LibJS/CyclicModule.cpp +++ b/Libraries/LibJS/CyclicModule.cpp @@ -161,7 +161,7 @@ void continue_module_loading(GraphLoadingState& state, ThrowCompletionOrreject(), js_undefined(), *value)); + MUST(call(state.vm(), *state.promise_capability->reject(), js_undefined(), value)); } // 4. Return UNUSED. @@ -389,10 +389,10 @@ ThrowCompletionOr CyclicModule::evaluate(VM& vm) // c. Assert: module.[[EvaluationError]] is result. VERIFY(m_evaluation_error.is_error()); - VERIFY(same_value(*m_evaluation_error.throw_completion().value(), *result.throw_completion().value())); + VERIFY(same_value(m_evaluation_error.throw_completion().value(), result.throw_completion().value())); // d. Perform ! Call(capability.[[Reject]], undefined, « result.[[Value]] »). - MUST(call(vm, *m_top_level_capability->reject(), js_undefined(), *result.throw_completion().value())); + MUST(call(vm, *m_top_level_capability->reject(), js_undefined(), result.throw_completion().value())); } // 10. Else, else { @@ -741,7 +741,7 @@ void CyclicModule::async_module_execution_fulfilled(VM& vm) // ii. If result is an abrupt completion, then if (result.is_throw_completion()) { // 1. Perform AsyncModuleExecutionRejected(m, result.[[Value]]). - module->async_module_execution_rejected(vm, *result.throw_completion().value()); + module->async_module_execution_rejected(vm, result.throw_completion().value()); } // iii. Else, else { @@ -838,7 +838,7 @@ void continue_dynamic_import(GC::Ref promise_capability, Thro // 1. If moduleCompletion is an abrupt completion, then if (module_completion.is_throw_completion()) { // a. Perform ! Call(promiseCapability.[[Reject]], undefined, « moduleCompletion.[[Value]] »). - MUST(call(vm, *promise_capability->reject(), js_undefined(), *module_completion.throw_completion().value())); + MUST(call(vm, *promise_capability->reject(), js_undefined(), module_completion.throw_completion().value())); // b. Return unused. return; @@ -874,7 +874,7 @@ void continue_dynamic_import(GC::Ref promise_capability, Thro // b. If link is an abrupt completion, then if (link.is_throw_completion()) { // i. Perform ! Call(promiseCapability.[[Reject]], undefined, « link.[[Value]] »). - MUST(call(vm, *promise_capability->reject(), js_undefined(), *link.throw_completion().value())); + MUST(call(vm, *promise_capability->reject(), js_undefined(), link.throw_completion().value())); // ii. Return unused. return js_undefined(); diff --git a/Libraries/LibJS/Print.cpp b/Libraries/LibJS/Print.cpp index dd6c09b556f..42feeb9cc05 100644 --- a/Libraries/LibJS/Print.cpp +++ b/Libraries/LibJS/Print.cpp @@ -690,7 +690,7 @@ ErrorOr print_intl_date_time_format(JS::PrintContext& print_context, JS::I return {}; }); - if (result.is_throw_completion() && result.throw_completion().value()->is_null()) + if (result.is_throw_completion() && result.throw_completion().value().is_null()) return Error::from_errno(ENOMEM); // probably return {}; diff --git a/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Libraries/LibJS/Runtime/AbstractOperations.cpp index 0a5d3ce8d9b..e74d3460806 100644 --- a/Libraries/LibJS/Runtime/AbstractOperations.cpp +++ b/Libraries/LibJS/Runtime/AbstractOperations.cpp @@ -1631,10 +1631,10 @@ Completion dispose_resources(VM& vm, DisposeCapability& dispose_capability, Comp // 1. If completion is a throw completion, then if (completion.type() == Completion::Type::Throw) { // a. Set result to result.[[Value]]. - auto result_value = result.error().value().value(); + auto result_value = result.error().value(); // b. Let suppressed be completion.[[Value]]. - auto suppressed = completion.value().value(); + auto suppressed = completion.value(); // c. Let error be a newly created SuppressedError object. auto error = SuppressedError::create(*vm.current_realm()); diff --git a/Libraries/LibJS/Runtime/AbstractOperations.h b/Libraries/LibJS/Runtime/AbstractOperations.h index 06ca28c0ded..401f010d3a9 100644 --- a/Libraries/LibJS/Runtime/AbstractOperations.h +++ b/Libraries/LibJS/Runtime/AbstractOperations.h @@ -241,7 +241,7 @@ ThrowCompletionOr group_by(VM& vm, Value items, Value callback_funct // f. IfAbruptCloseIterator(key, iteratorRecord). if (key.is_error()) - return Completion { *TRY(iterator_close(vm, iterator_record, key.release_error())) }; + return Completion { TRY(iterator_close(vm, iterator_record, key.release_error())) }; // g. If keyCoercion is property, then if constexpr (IsSame) { @@ -250,7 +250,7 @@ ThrowCompletionOr group_by(VM& vm, Value items, Value callback_funct // ii. IfAbruptCloseIterator(key, iteratorRecord). if (property_key.is_error()) - return Completion { *TRY(iterator_close(vm, iterator_record, property_key.release_error())) }; + return Completion { TRY(iterator_close(vm, iterator_record, property_key.release_error())) }; add_value_to_keyed_group(vm, groups, property_key.release_value(), value); } diff --git a/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp b/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp index 3e9a2077b60..6d4e577ba74 100644 --- a/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp +++ b/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp @@ -60,7 +60,7 @@ ThrowCompletionOr> ArrayBufferConstructor::construct(FunctionObj if (byte_length_or_error.is_error()) { auto error = byte_length_or_error.release_error(); - if (error.value()->is_object() && is(error.value()->as_object())) { + if (error.value().is_object() && is(error.value().as_object())) { // Re-throw more specific RangeError return vm.throw_completion(ErrorType::InvalidLength, "array buffer"); } diff --git a/Libraries/LibJS/Runtime/ArrayConstructor.cpp b/Libraries/LibJS/Runtime/ArrayConstructor.cpp index 735a8f1b76a..fad1ae76190 100644 --- a/Libraries/LibJS/Runtime/ArrayConstructor.cpp +++ b/Libraries/LibJS/Runtime/ArrayConstructor.cpp @@ -191,7 +191,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from) auto error = vm.throw_completion(ErrorType::ArrayMaxSize); // 2. Return ? IteratorClose(iteratorRecord, error). - return *TRY(iterator_close(vm, iterator, move(error))); + return TRY(iterator_close(vm, iterator, move(error))); } // ii. Let Pk be ! ToString(𝔽(k)). @@ -218,7 +218,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from) // 2. IfAbruptCloseIterator(mappedValue, iteratorRecord). if (mapped_value_or_error.is_error()) - return *TRY(iterator_close(vm, iterator, mapped_value_or_error.release_error())); + return TRY(iterator_close(vm, iterator, mapped_value_or_error.release_error())); mapped_value = mapped_value_or_error.release_value(); } // vi. Else, let mappedValue be nextValue. @@ -231,7 +231,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from) // viii. IfAbruptCloseIterator(defineStatus, iteratorRecord). if (result_or_error.is_error()) - return *TRY(iterator_close(vm, iterator, result_or_error.release_error())); + return TRY(iterator_close(vm, iterator, result_or_error.release_error())); // ix. Set k to k + 1. } @@ -374,7 +374,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from_async) auto error = vm.throw_completion(ErrorType::ArrayMaxSize); // b. Return ? AsyncIteratorClose(iteratorRecord, error). - return *TRY(async_iterator_close(vm, *iterator_record, move(error))); + return TRY(async_iterator_close(vm, *iterator_record, move(error))); } // 2. Let Pk be ! ToString(𝔽(k)). @@ -443,7 +443,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from_async) // 12. If defineStatus is an abrupt completion, return ? AsyncIteratorClose(iteratorRecord, defineStatus). if (define_status.is_error()) - return *TRY(iterator_close(vm, *iterator_record, define_status.release_error())); + return TRY(iterator_close(vm, *iterator_record, define_status.release_error())); // 13. Set k to k + 1. } diff --git a/Libraries/LibJS/Runtime/AsyncDisposableStackPrototype.cpp b/Libraries/LibJS/Runtime/AsyncDisposableStackPrototype.cpp index fc7d3386b8f..f860fa4a521 100644 --- a/Libraries/LibJS/Runtime/AsyncDisposableStackPrototype.cpp +++ b/Libraries/LibJS/Runtime/AsyncDisposableStackPrototype.cpp @@ -141,7 +141,7 @@ JS_DEFINE_NATIVE_FUNCTION(AsyncDisposableStackPrototype::dispose_async) auto result = TRY_OR_REJECT(vm, promise_capability, dispose_resources(vm, async_disposable_stack.dispose_capability(), normal_completion(js_undefined()))); // 8. Perform ! Call(promiseCapability.[[Resolve]], undefined, « result »). - MUST(call(vm, *promise_capability->resolve(), js_undefined(), *result)); + MUST(call(vm, *promise_capability->resolve(), js_undefined(), result)); // 9. Return promiseCapability.[[Promise]]. return promise_capability->promise(); diff --git a/Libraries/LibJS/Runtime/AsyncGenerator.cpp b/Libraries/LibJS/Runtime/AsyncGenerator.cpp index 49c88660a90..f2b52248e22 100644 --- a/Libraries/LibJS/Runtime/AsyncGenerator.cpp +++ b/Libraries/LibJS/Runtime/AsyncGenerator.cpp @@ -42,8 +42,7 @@ void AsyncGenerator::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); for (auto const& request : m_async_generator_queue) { - if (request.completion.value().has_value()) - visitor.visit(*request.completion.value()); + visitor.visit(request.completion.value()); visitor.visit(request.capability); } visitor.visit(m_generating_function); @@ -155,8 +154,6 @@ void AsyncGenerator::execute(VM& vm, Completion completion) { while (true) { // Loosely based on step 4 of https://tc39.es/ecma262/#sec-asyncgeneratorstart - VERIFY(completion.value().has_value()); - auto generated_value = [](Value value) -> Value { if (value.is_cell()) return static_cast(value.as_cell()).result(); @@ -349,7 +346,7 @@ void AsyncGenerator::await_return() VERIFY(completion.type() == Completion::Type::Return); // 6. Let promiseCompletion be Completion(PromiseResolve(%Promise%, _completion_.[[Value]])). - auto promise_completion = promise_resolve(vm, realm.intrinsics().promise_constructor(), completion.value().value()); + auto promise_completion = promise_resolve(vm, realm.intrinsics().promise_constructor(), completion.value()); // 7. If promiseCompletion is an abrupt completion, then if (promise_completion.is_throw_completion()) { @@ -442,7 +439,7 @@ void AsyncGenerator::complete_step(Completion completion, bool done, Realm* real auto promise_capability = next.capability; // 5. Let value be completion.[[Value]]. - auto value = completion.value().value(); + auto value = completion.value(); // 6. If completion.[[Type]] is throw, then if (completion.type() == Completion::Type::Throw) { diff --git a/Libraries/LibJS/Runtime/Completion.h b/Libraries/LibJS/Runtime/Completion.h index e26f59e0d58..ac5d993991c 100644 --- a/Libraries/LibJS/Runtime/Completion.h +++ b/Libraries/LibJS/Runtime/Completion.h @@ -38,9 +38,8 @@ namespace JS { if (_temporary_result.is_error()) { \ auto _completion = _temporary_result.release_error(); \ \ - VERIFY(_completion.value().has_value()); \ - VERIFY(_completion.value()->is_object()); \ - VERIFY(::AK::is(_completion.value()->as_object())); \ + VERIFY(_completion.value().is_object()); \ + VERIFY(::AK::is(_completion.value().as_object())); \ \ return _completion; \ } \ @@ -61,13 +60,12 @@ public: Throw, }; - ALWAYS_INLINE Completion(Type type, Optional value) + ALWAYS_INLINE Completion(Type type, Value value) : m_type(type) - , m_value(move(value)) + , m_value(value) { VERIFY(type != Type::Empty); - if (m_value.has_value()) - VERIFY(!m_value->is_empty()); + VERIFY(!value.is_empty()); } Completion(ThrowCompletionOr const&); @@ -79,11 +77,6 @@ public: { } - ALWAYS_INLINE Completion(Optional value) - : Completion(Type::Normal, move(value)) - { - } - ALWAYS_INLINE Completion() : Completion(js_undefined()) { @@ -99,19 +92,18 @@ public: VERIFY(m_type != Type::Empty); return m_type; } - [[nodiscard]] Optional& value() { return m_value; } - [[nodiscard]] Optional const& value() const { return m_value; } + [[nodiscard]] Value& value() { return m_value; } + [[nodiscard]] Value const& value() const { return m_value; } // "abrupt completion refers to any completion with a [[Type]] value other than normal" [[nodiscard]] bool is_abrupt() const { return m_type != Type::Normal; } // These are for compatibility with the TRY() macro in AK. [[nodiscard]] bool is_error() const { return m_type == Type::Throw; } - [[nodiscard]] Optional release_value() { return move(m_value); } + [[nodiscard]] Value release_value() { return m_value; } Completion release_error() { VERIFY(is_error()); - VERIFY(m_value.has_value()); return { m_type, release_value() }; } @@ -131,7 +123,7 @@ private: } Type m_type { Type::Normal }; // [[Type]] - Optional m_value; // [[Value]] + Value m_value; // [[Value]] // NOTE: We don't need the [[Target]] slot since control flow is handled in bytecode. }; @@ -244,7 +236,7 @@ public: // Not `explicit` on purpose so that `return vm.throw_completion(...);` is possible. ALWAYS_INLINE ThrowCompletionOr(Completion throw_completion) - : m_value_or_error(ErrorValue { throw_completion.release_error().value().value() }) + : m_value_or_error(ErrorValue { throw_completion.release_error().value() }) { } @@ -314,7 +306,7 @@ public: ThrowCompletionOr await(VM&, Value); // 6.2.4.1 NormalCompletion ( value ), https://tc39.es/ecma262/#sec-normalcompletion -inline Completion normal_completion(Optional value) +inline Completion normal_completion(Value value) { // 1. Return Completion Record { [[Type]]: normal, [[Value]]: value, [[Target]]: empty }. return { Completion::Type::Normal, move(value) }; diff --git a/Libraries/LibJS/Runtime/CompletionCell.cpp b/Libraries/LibJS/Runtime/CompletionCell.cpp index 5b734ab4de4..5cb61e3bdb1 100644 --- a/Libraries/LibJS/Runtime/CompletionCell.cpp +++ b/Libraries/LibJS/Runtime/CompletionCell.cpp @@ -15,8 +15,7 @@ CompletionCell::~CompletionCell() = default; void CompletionCell::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); - if (m_completion.value().has_value()) - visitor.visit(m_completion.value().value()); + visitor.visit(m_completion.value()); } } diff --git a/Libraries/LibJS/Runtime/DisposableStackPrototype.cpp b/Libraries/LibJS/Runtime/DisposableStackPrototype.cpp index 5d3eb434957..6ca26e26b79 100644 --- a/Libraries/LibJS/Runtime/DisposableStackPrototype.cpp +++ b/Libraries/LibJS/Runtime/DisposableStackPrototype.cpp @@ -115,7 +115,7 @@ JS_DEFINE_NATIVE_FUNCTION(DisposableStackPrototype::dispose) disposable_stack->set_disposed(); // 5. Return DisposeResources(disposableStack.[[DisposeCapability]], NormalCompletion(undefined)). - return *TRY(dispose_resources(vm, disposable_stack->dispose_capability(), normal_completion(js_undefined()))); + return TRY(dispose_resources(vm, disposable_stack->dispose_capability(), normal_completion(js_undefined()))); } // 12.3.3.4 get DisposableStack.prototype.disposed, https://tc39.es/proposal-explicit-resource-management/#sec-get-disposablestack.prototype.disposed diff --git a/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp b/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp index 3cdb3c247a8..d5dbe9515e2 100644 --- a/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp +++ b/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp @@ -436,7 +436,7 @@ ThrowCompletionOr ECMAScriptFunctionObject::internal_call(Value this_argu // 8. If result.[[Type]] is return, return result.[[Value]]. if (result.type() == Completion::Type::Return) - return *result.value(); + return result.value(); // 9. Assert: result is a throw completion. VERIFY(result.type() == Completion::Type::Throw); @@ -520,15 +520,15 @@ ThrowCompletionOr> ECMAScriptFunctionObject::internal_construct( VERIFY(result.type() == Completion::Type::Return); // 12. If Type(result.[[Value]]) is Object, return result.[[Value]]. - if (result.value()->is_object()) - return result.value()->as_object(); + if (result.value().is_object()) + return result.value().as_object(); // 13. If kind is base, return thisArgument. if (kind == ConstructorKind::Base) return *this_argument; // 14. If result.[[Value]] is not undefined, throw a TypeError exception. - if (!result.value()->is_undefined()) + if (!result.value().is_undefined()) return vm.throw_completion(ErrorType::DerivedConstructorReturningInvalidValue); // 15. Let thisBinding be ? constructorEnv.GetThisBinding(). @@ -771,7 +771,7 @@ void async_block_start(VM& vm, T const& async_body, PromiseCapability const& pro // g. Else if result is a return completion, then else if (result.type() == Completion::Type::Return) { // i. Perform ! Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] »). - MUST(call(vm, *promise_capability.resolve(), js_undefined(), *result.value())); + MUST(call(vm, *promise_capability.resolve(), js_undefined(), result.value())); } // h. Else, else { @@ -779,7 +779,7 @@ void async_block_start(VM& vm, T const& async_body, PromiseCapability const& pro VERIFY(result.type() == Completion::Type::Throw); // ii. Perform ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] »). - MUST(call(vm, *promise_capability.reject(), js_undefined(), *result.value())); + MUST(call(vm, *promise_capability.reject(), js_undefined(), result.value())); } // i. Return unused. // NOTE: We don't support returning an empty/optional/unused value here. diff --git a/Libraries/LibJS/Runtime/GeneratorObject.cpp b/Libraries/LibJS/Runtime/GeneratorObject.cpp index 1873ba378bd..63165411a27 100644 --- a/Libraries/LibJS/Runtime/GeneratorObject.cpp +++ b/Libraries/LibJS/Runtime/GeneratorObject.cpp @@ -82,8 +82,6 @@ ThrowCompletionOr GeneratorObject::execute(VM& vm, Completion const& comp { // Loosely based on step 4 of https://tc39.es/ecma262/#sec-generatorstart mixed with https://tc39.es/ecma262/#sec-generatoryield at the end. - VERIFY(completion.value().has_value()); - auto generated_value = [](Value value) -> Value { if (value.is_cell()) return static_cast(value.as_cell()).result(); @@ -167,9 +165,6 @@ ThrowCompletionOr GeneratorObject::resume(VM& vm, Value value, Optional GeneratorObject::resume_abrupt(JS::VM& vm, JS::Completion abrupt_completion, Optional const& generator_brand) { - // Not part of the spec, but the spec assumes abruptCompletion.[[Value]] is not empty. - VERIFY(abrupt_completion.value().has_value()); - // 1. Let state be ? GeneratorValidate(generator, generatorBrand). auto state = TRY(validate(vm, generator_brand)); @@ -190,7 +185,7 @@ ThrowCompletionOr GeneratorObject::resume_abrupt(JS::VM& vm, JS::Completi // a. If abruptCompletion.[[Type]] is return, then if (abrupt_completion.type() == Completion::Type::Return) { // i. Return CreateIterResultObject(abruptCompletion.[[Value]], true). - return create_iterator_result_object(vm, abrupt_completion.value().value(), true); + return create_iterator_result_object(vm, abrupt_completion.value(), true); } // b. Return ? abruptCompletion. diff --git a/Libraries/LibJS/Runtime/IteratorHelper.cpp b/Libraries/LibJS/Runtime/IteratorHelper.cpp index 0e325fb9fd7..ea14a4a2958 100644 --- a/Libraries/LibJS/Runtime/IteratorHelper.cpp +++ b/Libraries/LibJS/Runtime/IteratorHelper.cpp @@ -43,7 +43,7 @@ Value IteratorHelper::result(Value value) ThrowCompletionOr IteratorHelper::close_result(VM& vm, Completion completion) { set_generator_state(GeneratorState::Completed); - return *TRY(iterator_close(vm, underlying_iterator(), move(completion))); + return TRY(iterator_close(vm, underlying_iterator(), move(completion))); } ThrowCompletionOr IteratorHelper::execute(VM& vm, JS::Completion const& completion) diff --git a/Libraries/LibJS/Runtime/IteratorHelperPrototype.cpp b/Libraries/LibJS/Runtime/IteratorHelperPrototype.cpp index 22506ada634..e09b404b818 100644 --- a/Libraries/LibJS/Runtime/IteratorHelperPrototype.cpp +++ b/Libraries/LibJS/Runtime/IteratorHelperPrototype.cpp @@ -56,7 +56,7 @@ JS_DEFINE_NATIVE_FUNCTION(IteratorHelperPrototype::return_) // b. NOTE: Once a generator enters the completed state it never leaves it and its associated execution context is never resumed. Any execution state associated with O can be discarded at this point. // c. Perform ? IteratorClose(O.[[UnderlyingIterator]], NormalCompletion(unused)). - TRY(iterator_close(vm, iterator->underlying_iterator(), normal_completion({}))); + TRY(iterator_close(vm, iterator->underlying_iterator(), normal_completion(js_undefined()))); // d. Return CreateIterResultObject(undefined, true). return create_iterator_result_object(vm, js_undefined(), true); diff --git a/Libraries/LibJS/Runtime/IteratorPrototype.cpp b/Libraries/LibJS/Runtime/IteratorPrototype.cpp index 75865592e54..fb6a518eeb0 100644 --- a/Libraries/LibJS/Runtime/IteratorPrototype.cpp +++ b/Libraries/LibJS/Runtime/IteratorPrototype.cpp @@ -175,11 +175,11 @@ JS_DEFINE_NATIVE_FUNCTION(IteratorPrototype::every) // d. IfAbruptCloseIterator(result, iterated). if (result.is_error()) - return *TRY(iterator_close(vm, iterated, result.release_error())); + return TRY(iterator_close(vm, iterated, result.release_error())); // e. If ToBoolean(result) is false, return ? IteratorClose(iterated, NormalCompletion(false)). if (!result.value().to_boolean()) - return *TRY(iterator_close(vm, iterated, normal_completion(Value { false }))); + return TRY(iterator_close(vm, iterated, normal_completion(Value { false }))); // f. Set counter to counter + 1. ++counter; @@ -280,11 +280,11 @@ JS_DEFINE_NATIVE_FUNCTION(IteratorPrototype::find) // d. IfAbruptCloseIterator(result, iterated). if (result.is_error()) - return *TRY(iterator_close(vm, iterated, result.release_error())); + return TRY(iterator_close(vm, iterated, result.release_error())); // e. If ToBoolean(result) is true, return ? IteratorClose(iterated, NormalCompletion(value)). if (result.value().to_boolean()) - return *TRY(iterator_close(vm, iterated, normal_completion(value))); + return TRY(iterator_close(vm, iterated, normal_completion(*value))); // f. Set counter to counter + 1. ++counter; @@ -466,7 +466,7 @@ JS_DEFINE_NATIVE_FUNCTION(IteratorPrototype::for_each) // d. IfAbruptCloseIterator(result, iterated). if (result.is_error()) - return *TRY(iterator_close(vm, iterated, result.release_error())); + return TRY(iterator_close(vm, iterated, result.release_error())); // e. Set counter to counter + 1. ++counter; @@ -585,7 +585,7 @@ JS_DEFINE_NATIVE_FUNCTION(IteratorPrototype::reduce) // d. IfAbruptCloseIterator(result, iterated). if (result.is_error()) - return *TRY(iterator_close(vm, iterated, result.release_error())); + return TRY(iterator_close(vm, iterated, result.release_error())); // e. Set accumulator to result.[[Value]]. accumulator = result.release_value(); @@ -628,11 +628,11 @@ JS_DEFINE_NATIVE_FUNCTION(IteratorPrototype::some) // d. IfAbruptCloseIterator(result, iterated). if (result.is_error()) - return *TRY(iterator_close(vm, iterated, result.release_error())); + return TRY(iterator_close(vm, iterated, result.release_error())); // e. If ToBoolean(result) is true, return ? IteratorClose(iterated, NormalCompletion(true)). if (result.value().to_boolean()) - return *TRY(iterator_close(vm, iterated, normal_completion(Value { true }))); + return TRY(iterator_close(vm, iterated, normal_completion(Value { true }))); // f. Set counter to counter + 1. ++counter; diff --git a/Libraries/LibJS/Runtime/Promise.cpp b/Libraries/LibJS/Runtime/Promise.cpp index 1a1fc08836b..9770df5d0a2 100644 --- a/Libraries/LibJS/Runtime/Promise.cpp +++ b/Libraries/LibJS/Runtime/Promise.cpp @@ -125,7 +125,7 @@ Promise::ResolvingFunctions Promise::create_resolving_functions() if (then.is_throw_completion()) { // a. Perform RejectPromise(promise, then.[[Value]]). dbgln_if(PROMISE_DEBUG, "[Promise @ {} / PromiseResolvingFunction]: Exception while getting 'then' property, rejecting with error", &promise); - promise.reject(*then.throw_completion().value()); + promise.reject(then.throw_completion().value()); // b. Return undefined. return js_undefined(); diff --git a/Libraries/LibJS/Runtime/PromiseCapability.h b/Libraries/LibJS/Runtime/PromiseCapability.h index 04151a04fc4..5b77efcceec 100644 --- a/Libraries/LibJS/Runtime/PromiseCapability.h +++ b/Libraries/LibJS/Runtime/PromiseCapability.h @@ -39,23 +39,23 @@ private: }; // 27.2.1.1.1 IfAbruptRejectPromise ( value, capability ), https://tc39.es/ecma262/#sec-ifabruptrejectpromise -#define __TRY_OR_REJECT(vm, capability, expression, CALL_CHECK) \ - ({ \ - auto&& _temporary_try_or_reject_result = (expression); \ - /* 1. If value is an abrupt completion, then */ \ - if (_temporary_try_or_reject_result.is_error()) { \ - /* a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). */ \ - CALL_CHECK(JS::call(vm, *(capability)->reject(), js_undefined(), *_temporary_try_or_reject_result.release_error().value())); \ - \ - /* b. Return capability.[[Promise]]. */ \ - return (capability)->promise(); \ - } \ - \ - static_assert(!::AK::Detail::IsLvalueReference, \ - "Do not return a reference from a fallible expression"); \ - \ - /* 2. Else if value is a Completion Record, set value to value.[[Value]]. */ \ - _temporary_try_or_reject_result.release_value(); \ +#define __TRY_OR_REJECT(vm, capability, expression, CALL_CHECK) \ + ({ \ + auto&& _temporary_try_or_reject_result = (expression); \ + /* 1. If value is an abrupt completion, then */ \ + if (_temporary_try_or_reject_result.is_error()) { \ + /* a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). */ \ + CALL_CHECK(JS::call(vm, *(capability)->reject(), js_undefined(), _temporary_try_or_reject_result.release_error().value())); \ + \ + /* b. Return capability.[[Promise]]. */ \ + return (capability)->promise(); \ + } \ + \ + static_assert(!::AK::Detail::IsLvalueReference, \ + "Do not return a reference from a fallible expression"); \ + \ + /* 2. Else if value is a Completion Record, set value to value.[[Value]]. */ \ + _temporary_try_or_reject_result.release_value(); \ }) #define TRY_OR_REJECT(vm, capability, expression) \ @@ -65,23 +65,23 @@ private: __TRY_OR_REJECT(vm, capability, expression, MUST) // 27.2.1.1.1 IfAbruptRejectPromise ( value, capability ), https://tc39.es/ecma262/#sec-ifabruptrejectpromise -#define TRY_OR_REJECT_WITH_VALUE(vm, capability, expression) \ - ({ \ - auto&& _temporary_try_or_reject_result = (expression); \ - /* 1. If value is an abrupt completion, then */ \ - if (_temporary_try_or_reject_result.is_error()) { \ - /* a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). */ \ - TRY(JS::call(vm, *(capability)->reject(), js_undefined(), *_temporary_try_or_reject_result.release_error().value())); \ - \ - /* b. Return capability.[[Promise]]. */ \ - return Value { (capability)->promise() }; \ - } \ - \ - static_assert(!::AK::Detail::IsLvalueReference, \ - "Do not return a reference from a fallible expression"); \ - \ - /* 2. Else if value is a Completion Record, set value to value.[[Value]]. */ \ - _temporary_try_or_reject_result.release_value(); \ +#define TRY_OR_REJECT_WITH_VALUE(vm, capability, expression) \ + ({ \ + auto&& _temporary_try_or_reject_result = (expression); \ + /* 1. If value is an abrupt completion, then */ \ + if (_temporary_try_or_reject_result.is_error()) { \ + /* a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). */ \ + TRY(JS::call(vm, *(capability)->reject(), js_undefined(), _temporary_try_or_reject_result.release_error().value())); \ + \ + /* b. Return capability.[[Promise]]. */ \ + return Value { (capability)->promise() }; \ + } \ + \ + static_assert(!::AK::Detail::IsLvalueReference, \ + "Do not return a reference from a fallible expression"); \ + \ + /* 2. Else if value is a Completion Record, set value to value.[[Value]]. */ \ + _temporary_try_or_reject_result.release_value(); \ }) // 27.2.1.5 NewPromiseCapability ( C ), https://tc39.es/ecma262/#sec-newpromisecapability diff --git a/Libraries/LibJS/Runtime/PromiseConstructor.cpp b/Libraries/LibJS/Runtime/PromiseConstructor.cpp index f537a938121..5dd6939838a 100644 --- a/Libraries/LibJS/Runtime/PromiseConstructor.cpp +++ b/Libraries/LibJS/Runtime/PromiseConstructor.cpp @@ -282,7 +282,7 @@ ThrowCompletionOr> PromiseConstructor::construct(FunctionObject& // 10. If completion is an abrupt completion, then if (completion.is_error()) { // a. Perform ? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] »). - TRY(JS::call(vm, *reject_function, js_undefined(), *completion.release_error().value())); + TRY(JS::call(vm, *reject_function, js_undefined(), completion.release_error().value())); } // 11. Return promise. @@ -484,7 +484,7 @@ JS_DEFINE_NATIVE_FUNCTION(PromiseConstructor::try_) // 5. If status is an abrupt completion, then if (status.is_throw_completion()) { // a. Perform ? Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] »). - TRY(JS::call(vm, *promise_capability->reject(), js_undefined(), *status.throw_completion().value())); + TRY(JS::call(vm, *promise_capability->reject(), js_undefined(), status.throw_completion().value())); } // 6. Else, else { diff --git a/Libraries/LibJS/Runtime/PromiseJobs.cpp b/Libraries/LibJS/Runtime/PromiseJobs.cpp index f2d1317fc20..b6a216f1bbd 100644 --- a/Libraries/LibJS/Runtime/PromiseJobs.cpp +++ b/Libraries/LibJS/Runtime/PromiseJobs.cpp @@ -62,8 +62,6 @@ static ThrowCompletionOr run_reaction_job(VM& vm, PromiseReaction& reacti // ii. Return empty. dbgln_if(PROMISE_DEBUG, "run_reaction_job: Reaction has no PromiseCapability, returning empty value"); - // TODO: This can't return an empty value at the moment, because the implicit conversion to Completion would fail. - // Change it back when this is using completions (`return normal_completion({})`) return js_undefined(); } @@ -74,14 +72,14 @@ static ThrowCompletionOr run_reaction_job(VM& vm, PromiseReaction& reacti // i. Return ? Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] »). auto reject_function = promise_capability->reject(); dbgln_if(PROMISE_DEBUG, "run_reaction_job: Calling PromiseCapability's reject function @ {}", reject_function.ptr()); - return call(vm, *reject_function, js_undefined(), *handler_result.value()); + return call(vm, *reject_function, js_undefined(), handler_result.value()); } // i. Else, else { // i. Return ? Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] »). auto resolve_function = promise_capability->resolve(); dbgln_if(PROMISE_DEBUG, "[PromiseReactionJob]: Calling PromiseCapability's resolve function @ {}", resolve_function.ptr()); - return call(vm, *resolve_function, js_undefined(), *handler_result.value()); + return call(vm, *resolve_function, js_undefined(), handler_result.value()); } } @@ -134,8 +132,8 @@ static ThrowCompletionOr run_resolve_thenable_job(VM& vm, Promise& promis // c. If thenCallResult is an abrupt completion, then if (then_call_result.is_error()) { // i. Return ? Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] »). - dbgln_if(PROMISE_DEBUG, "run_resolve_thenable_job: then_call_result is an abrupt completion, calling reject function with value {}", *then_call_result.throw_completion().value()); - return call(vm, *reject_function, js_undefined(), *then_call_result.throw_completion().value()); + dbgln_if(PROMISE_DEBUG, "run_resolve_thenable_job: then_call_result is an abrupt completion, calling reject function with value {}", then_call_result.throw_completion().value()); + return call(vm, *reject_function, js_undefined(), then_call_result.throw_completion().value()); } // d. Return ? thenCallResult. diff --git a/Libraries/LibJS/Runtime/SetPrototype.cpp b/Libraries/LibJS/Runtime/SetPrototype.cpp index 6d78c618349..8d866775ba6 100644 --- a/Libraries/LibJS/Runtime/SetPrototype.cpp +++ b/Libraries/LibJS/Runtime/SetPrototype.cpp @@ -376,7 +376,7 @@ JS_DEFINE_NATIVE_FUNCTION(SetPrototype::is_disjoint_from) // 1. If SetDataHas(O.[[SetData]], next) is true, then if (set_data_has(set, *next)) { // a. Perform ? IteratorClose(keysIter, NormalCompletion(UNUSED)). - TRY(iterator_close(vm, keys_iterator, normal_completion({}))); + TRY(iterator_close(vm, keys_iterator, normal_completion(js_undefined()))); // b. Return false. return false; @@ -455,7 +455,7 @@ JS_DEFINE_NATIVE_FUNCTION(SetPrototype::is_superset_of) // i. If SetDataHas(O.[[SetData]], next) is false, then if (!set_data_has(set, *next)) { // 1. Perform ? IteratorClose(keysIter, NormalCompletion(UNUSED)). - TRY(iterator_close(vm, keys_iterator, normal_completion({}))); + TRY(iterator_close(vm, keys_iterator, normal_completion(js_undefined()))); // 2. Return false. return false; diff --git a/Libraries/LibJS/Runtime/ShadowRealm.cpp b/Libraries/LibJS/Runtime/ShadowRealm.cpp index 76c6651818c..37d9a8addc9 100644 --- a/Libraries/LibJS/Runtime/ShadowRealm.cpp +++ b/Libraries/LibJS/Runtime/ShadowRealm.cpp @@ -164,7 +164,7 @@ ThrowCompletionOr perform_shadow_realm_eval(VM& vm, StringView source_tex } // 12. If result.[[Type]] is normal and result.[[Value]] is empty, then - if (result.type() == Completion::Type::Normal && !result.value().has_value()) { + if (result.type() == Completion::Type::Normal && result.value().is_empty()) { // a. Set result to NormalCompletion(undefined). result = normal_completion(js_undefined()); } @@ -184,7 +184,7 @@ ThrowCompletionOr perform_shadow_realm_eval(VM& vm, StringView source_tex } // 16. Return ? GetWrappedValue(callerRealm, result.[[Value]]). - return get_wrapped_value(vm, caller_realm, *result.value()); + return get_wrapped_value(vm, caller_realm, result.value()); // NOTE: Also see "Editor's Note" in the spec regarding the TypeError above. } diff --git a/Libraries/LibJS/Runtime/SharedArrayBufferConstructor.cpp b/Libraries/LibJS/Runtime/SharedArrayBufferConstructor.cpp index fe62231a703..15a29c73e0d 100644 --- a/Libraries/LibJS/Runtime/SharedArrayBufferConstructor.cpp +++ b/Libraries/LibJS/Runtime/SharedArrayBufferConstructor.cpp @@ -54,7 +54,7 @@ ThrowCompletionOr> SharedArrayBufferConstructor::construct(Funct if (byte_length_or_error.is_error()) { auto error = byte_length_or_error.release_error(); - if (error.value()->is_object() && is(error.value()->as_object())) { + if (error.value().is_object() && is(error.value().as_object())) { // Re-throw more specific RangeError return vm.throw_completion(ErrorType::InvalidLength, "shared array buffer"); } diff --git a/Libraries/LibJS/Runtime/TypedArray.cpp b/Libraries/LibJS/Runtime/TypedArray.cpp index b55ff62eb25..b0efdd37161 100644 --- a/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Libraries/LibJS/Runtime/TypedArray.cpp @@ -573,7 +573,7 @@ void TypedArrayBase::visit_edges(Visitor& visitor) auto array_length_or_error = first_argument.to_index(vm); \ if (array_length_or_error.is_error()) { \ auto error = array_length_or_error.release_error(); \ - if (error.value()->is_object() && is(error.value()->as_object())) { \ + if (error.value().is_object() && is(error.value().as_object())) { \ /* Re-throw more specific RangeError */ \ return vm.throw_completion(ErrorType::InvalidLength, "typed array"); \ } \ diff --git a/Libraries/LibJS/SourceTextModule.cpp b/Libraries/LibJS/SourceTextModule.cpp index 2a2fbd62687..229bdbb6b71 100644 --- a/Libraries/LibJS/SourceTextModule.cpp +++ b/Libraries/LibJS/SourceTextModule.cpp @@ -779,7 +779,7 @@ ThrowCompletionOr SourceTextModule::execute_module(VM& vm, GC::Ptrreject(), js_undefined(), result.throw_completion().value().value())); + MUST(call(vm, *capability->reject(), js_undefined(), result.throw_completion().value())); } else { MUST(call(vm, *capability->resolve(), js_undefined(), result.value())); } diff --git a/Libraries/LibJS/SyntheticModule.cpp b/Libraries/LibJS/SyntheticModule.cpp index e3fccebfbea..7584bd10c76 100644 --- a/Libraries/LibJS/SyntheticModule.cpp +++ b/Libraries/LibJS/SyntheticModule.cpp @@ -113,8 +113,7 @@ ThrowCompletionOr SyntheticModule::evaluate(VM& vm) // Note: Because we expect it to return a promise we convert this here. auto promise = Promise::create(realm()); if (result.is_error()) { - VERIFY(result.throw_completion().value().has_value()); - promise->reject(*result.throw_completion().value()); + promise->reject(result.throw_completion().value()); } else { // Note: This value probably isn't visible to JS code? But undefined is fine anyway. promise->fulfill(js_undefined()); diff --git a/Libraries/LibTest/JavaScriptTestRunner.h b/Libraries/LibTest/JavaScriptTestRunner.h index 7d979c31102..d856ef7eaa3 100644 --- a/Libraries/LibTest/JavaScriptTestRunner.h +++ b/Libraries/LibTest/JavaScriptTestRunner.h @@ -431,7 +431,7 @@ inline JSFileResult TestRunner::run_file_test(ByteString const& test_path) suite.most_severe_test_result = Result::Crashed; Test::Case test_case { ""_string, Test::Result::Fail, {}, 0 }; - auto error = top_level_result.release_error().release_value().release_value(); + auto error = top_level_result.release_error().release_value(); if (error.is_object()) { StringBuilder detail_builder; diff --git a/Libraries/LibWasm/AbstractMachine/BytecodeInterpreter.h b/Libraries/LibWasm/AbstractMachine/BytecodeInterpreter.h index 459807ac1e7..319ec4408a0 100644 --- a/Libraries/LibWasm/AbstractMachine/BytecodeInterpreter.h +++ b/Libraries/LibWasm/AbstractMachine/BytecodeInterpreter.h @@ -27,7 +27,7 @@ struct BytecodeInterpreter : public Interpreter { return m_trap.visit( [](Empty) -> ByteString { VERIFY_NOT_REACHED(); }, [](Trap const& trap) { return trap.reason; }, - [](JS::Completion const& completion) { return completion.value()->to_string_without_side_effects().to_byte_string(); }); + [](JS::Completion const& completion) { return completion.value().to_string_without_side_effects().to_byte_string(); }); } virtual void clear_trap() final { m_trap = Empty {}; } diff --git a/Libraries/LibWeb/CSS/FontFace.cpp b/Libraries/LibWeb/CSS/FontFace.cpp index bc3bcf74a15..01d3c4b5f06 100644 --- a/Libraries/LibWeb/CSS/FontFace.cpp +++ b/Libraries/LibWeb/CSS/FontFace.cpp @@ -91,7 +91,7 @@ GC::Ref FontFace::construct_impl(JS::Realm& realm, String family, Font if (maybe_buffer.is_error()) { VERIFY(maybe_buffer.error().code() == ENOMEM); auto throw_completion = vm.throw_completion(vm.error_message(JS::VM::ErrorMessage::OutOfMemory)); - WebIDL::reject_promise(realm, promise, *throw_completion.value()); + WebIDL::reject_promise(realm, promise, throw_completion.value()); } else { buffer = maybe_buffer.release_value(); } diff --git a/Libraries/LibWeb/CSS/FontFaceSet.cpp b/Libraries/LibWeb/CSS/FontFaceSet.cpp index f8f7c5be254..b2d9bd81c54 100644 --- a/Libraries/LibWeb/CSS/FontFaceSet.cpp +++ b/Libraries/LibWeb/CSS/FontFaceSet.cpp @@ -242,7 +242,7 @@ JS::ThrowCompletionOr> FontFaceSet::load(String const& auto result = find_matching_font_faces(realm, font_face_set, font, text); if (result.is_error()) { HTML::TemporaryExecutionContext execution_context { realm, HTML::TemporaryExecutionContext::CallbacksEnabled::Yes }; - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value()); return; } diff --git a/Libraries/LibWeb/Compression/CompressionStream.cpp b/Libraries/LibWeb/Compression/CompressionStream.cpp index d2679dd56cd..9e75361e2b6 100644 --- a/Libraries/LibWeb/Compression/CompressionStream.cpp +++ b/Libraries/LibWeb/Compression/CompressionStream.cpp @@ -57,7 +57,7 @@ WebIDL::ExceptionOr> CompressionStream::construct_imp if (auto result = stream->compress_and_enqueue_chunk(chunk); result.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, result.exception()); - return WebIDL::create_rejected_promise(realm, *throw_completion.release_value()); + return WebIDL::create_rejected_promise(realm, throw_completion.release_value()); } return WebIDL::create_resolved_promise(realm, JS::js_undefined()); @@ -70,7 +70,7 @@ WebIDL::ExceptionOr> CompressionStream::construct_imp if (auto result = stream->compress_flush_and_enqueue(); result.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, result.exception()); - return WebIDL::create_rejected_promise(realm, *throw_completion.release_value()); + return WebIDL::create_rejected_promise(realm, throw_completion.release_value()); } return WebIDL::create_resolved_promise(realm, JS::js_undefined()); diff --git a/Libraries/LibWeb/Compression/DecompressionStream.cpp b/Libraries/LibWeb/Compression/DecompressionStream.cpp index 4de816e114e..a9f32a457ed 100644 --- a/Libraries/LibWeb/Compression/DecompressionStream.cpp +++ b/Libraries/LibWeb/Compression/DecompressionStream.cpp @@ -58,7 +58,7 @@ WebIDL::ExceptionOr> DecompressionStream::construct if (auto result = stream->decompress_and_enqueue_chunk(chunk); result.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, result.exception()); - return WebIDL::create_rejected_promise(realm, *throw_completion.release_value()); + return WebIDL::create_rejected_promise(realm, throw_completion.release_value()); } return WebIDL::create_resolved_promise(realm, JS::js_undefined()); @@ -71,7 +71,7 @@ WebIDL::ExceptionOr> DecompressionStream::construct if (auto result = stream->decompress_flush_and_enqueue(); result.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, result.exception()); - return WebIDL::create_rejected_promise(realm, *throw_completion.release_value()); + return WebIDL::create_rejected_promise(realm, throw_completion.release_value()); } return WebIDL::create_resolved_promise(realm, JS::js_undefined()); diff --git a/Libraries/LibWeb/Crypto/SubtleCrypto.cpp b/Libraries/LibWeb/Crypto/SubtleCrypto.cpp index b1cb265020d..a5ac5afb87f 100644 --- a/Libraries/LibWeb/Crypto/SubtleCrypto.cpp +++ b/Libraries/LibWeb/Crypto/SubtleCrypto.cpp @@ -178,7 +178,7 @@ GC::Ref SubtleCrypto::encrypt(AlgorithmIdentifier const& algori // 10. Let ciphertext be the result of performing the encrypt operation specified by normalizedAlgorithm using algorithm and key and with data as plaintext. auto cipher_text = normalized_algorithm.methods->encrypt(*normalized_algorithm.parameter, key, data); if (cipher_text.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), cipher_text.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), cipher_text.release_error()).release_value()); return; } @@ -235,7 +235,7 @@ GC::Ref SubtleCrypto::decrypt(AlgorithmIdentifier const& algori // 10. Let plaintext be the result of performing the decrypt operation specified by normalizedAlgorithm using algorithm and key and with data as ciphertext. auto plain_text = normalized_algorithm.methods->decrypt(*normalized_algorithm.parameter, key, data); if (plain_text.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), plain_text.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), plain_text.release_error()).release_value()); return; } @@ -283,7 +283,7 @@ GC::Ref SubtleCrypto::digest(AlgorithmIdentifier const& algorit auto result = algorithm_object.methods->digest(*algorithm_object.parameter, data_buffer); if (result.is_exception()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value()); return; } @@ -324,7 +324,7 @@ GC::Ref SubtleCrypto::generate_key(AlgorithmIdentifier algorith auto result_or_error = normalized_algorithm.methods->generate_key(*normalized_algorithm.parameter, extractable, key_usages); if (result_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value()); return; } auto result = result_or_error.release_value(); @@ -405,7 +405,7 @@ JS::ThrowCompletionOr> SubtleCrypto::import_key(Binding // specified by normalizedAlgorithm using keyData, algorithm, format, extractable and usages. auto maybe_result = normalized_algorithm.methods->import_key(*normalized_algorithm.parameter, format, real_key_data.downcast(), extractable, key_usages); if (maybe_result.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), maybe_result.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), maybe_result.release_error()).release_value()); return; } auto result = maybe_result.release_value(); @@ -451,7 +451,7 @@ GC::Ref SubtleCrypto::export_key(Bindings::KeyFormat format, GC // FIXME: Stash the AlgorithmMethods on the KeyAlgorithm auto normalized_algorithm_or_error = normalize_an_algorithm(realm, algorithm.name(), "exportKey"_string); if (normalized_algorithm_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), normalized_algorithm_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), normalized_algorithm_or_error.release_error()).release_value()); return; } auto normalized_algorithm = normalized_algorithm_or_error.release_value(); @@ -465,7 +465,7 @@ GC::Ref SubtleCrypto::export_key(Bindings::KeyFormat format, GC // 7. Let result be the result of performing the export key operation specified by the [[algorithm]] internal slot of key using key and format. auto result_or_error = normalized_algorithm.methods->export_key(format, key); if (result_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value()); return; } @@ -522,7 +522,7 @@ GC::Ref SubtleCrypto::sign(AlgorithmIdentifier const& algorithm // 10. Let result be the result of performing the sign operation specified by normalizedAlgorithm using key and algorithm and with data as message. auto result = normalized_algorithm.methods->sign(*normalized_algorithm.parameter, key, data); if (result.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value()); return; } @@ -586,7 +586,7 @@ GC::Ref SubtleCrypto::verify(AlgorithmIdentifier const& algorit // 11. Let result be the result of performing the verify operation specified by normalizedAlgorithm using key, algorithm and signature and with data as message. auto result = normalized_algorithm.methods->verify(*normalized_algorithm.parameter, key, signature, data); if (result.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value()); return; } @@ -633,7 +633,7 @@ GC::Ref SubtleCrypto::derive_bits(AlgorithmIdentifier algorithm // 9. Let result be the result of creating an ArrayBuffer containing the result of performing the derive bits operation specified by normalizedAlgorithm using baseKey, algorithm and length. auto result = normalized_algorithm.methods->derive_bits(*normalized_algorithm.parameter, base_key, length_optional); if (result.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result.release_error()).release_value()); return; } @@ -695,7 +695,7 @@ GC::Ref SubtleCrypto::derive_key(AlgorithmIdentifier algorithm, // 13. Let length be the result of performing the get key length algorithm specified by normalizedDerivedKeyAlgorithmLength using derivedKeyType. auto length_result = normalized_derived_key_algorithm_length.methods->get_key_length(*normalized_derived_key_algorithm_length.parameter); if (length_result.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), length_result.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), length_result.release_error()).release_value()); return; } @@ -704,7 +704,7 @@ GC::Ref SubtleCrypto::derive_key(AlgorithmIdentifier algorithm, if (length_raw_value.is_number()) { auto maybe_length = length_raw_value.to_u32(vm); if (!maybe_length.has_value()) { - WebIDL::reject_promise(realm, promise, maybe_length.release_error().release_value().value()); + WebIDL::reject_promise(realm, promise, maybe_length.release_error().release_value()); return; } @@ -714,14 +714,14 @@ GC::Ref SubtleCrypto::derive_key(AlgorithmIdentifier algorithm, // 14. Let secret be the result of performing the derive bits operation specified by normalizedAlgorithm using key, algorithm and length. auto secret = normalized_algorithm.methods->derive_bits(*normalized_algorithm.parameter, base_key, length); if (secret.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), secret.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), secret.release_error()).release_value()); return; } // 15. Let result be the result of performing the import key operation specified by normalizedDerivedKeyAlgorithmImport using "raw" as format, secret as keyData, derivedKeyType as algorithm and using extractable and usages. auto result_or_error = normalized_derived_key_algorithm_import.methods->import_key(*normalized_derived_key_algorithm_import.parameter, Bindings::KeyFormat::Raw, secret.release_value()->buffer(), extractable, key_usages); if (result_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value()); return; } auto result = result_or_error.release_value(); @@ -811,13 +811,13 @@ GC::Ref SubtleCrypto::wrap_key(Bindings::KeyFormat format, GC:: auto& key_algorithm = as(*key->algorithm()); auto normalized_key_algorithm = normalize_an_algorithm(realm, key_algorithm.name(), "exportKey"_string); if (normalized_key_algorithm.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), normalized_key_algorithm.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), normalized_key_algorithm.release_error()).release_value()); return; } auto key_data_or_error = normalized_key_algorithm.release_value().methods->export_key(format, key); if (key_data_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), key_data_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), key_data_or_error.release_error()).release_value()); return; } @@ -838,7 +838,7 @@ GC::Ref SubtleCrypto::wrap_key(Bindings::KeyFormat format, GC:: // for example, by executing the JSON.stringify algorithm specified in [ECMA-262] in the context of a new global object. auto maybe_json = JS::JSONObject::stringify_impl(realm.vm(), key_data, JS::Value {}, JS::Value {}); if (maybe_json.is_error()) { - WebIDL::reject_promise(realm, promise, maybe_json.release_error().release_value().value()); + WebIDL::reject_promise(realm, promise, maybe_json.release_error().release_value()); return; } @@ -855,7 +855,7 @@ GC::Ref SubtleCrypto::wrap_key(Bindings::KeyFormat format, GC:: // using algorithm, wrappingKey as key and bytes as plaintext. auto result_or_error = normalized_algorithm.methods->wrap_key(*normalized_algorithm.parameter, wrapping_key, bytes); if (result_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value()); return; } @@ -868,7 +868,7 @@ GC::Ref SubtleCrypto::wrap_key(Bindings::KeyFormat format, GC:: // using algorithm, wrappingKey as key and bytes as plaintext. auto result_or_error = normalized_algorithm.methods->encrypt(*normalized_algorithm.parameter, wrapping_key, bytes); if (result_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value()); return; } @@ -975,7 +975,7 @@ GC::Ref SubtleCrypto::unwrap_key(Bindings::KeyFormat format, Ke } }(); if (key_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), key_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), key_or_error.release_error()).release_value()); return; } @@ -994,7 +994,7 @@ GC::Ref SubtleCrypto::unwrap_key(Bindings::KeyFormat format, Ke // Let bytes be the result of executing the parse a JWK algorithm, with key as the data to be parsed. auto maybe_parsed = Bindings::JsonWebKey::parse(realm, key->buffer()); if (maybe_parsed.is_error()) { - WebIDL::reject_promise(realm, promise, maybe_parsed.release_error().release_value().value()); + WebIDL::reject_promise(realm, promise, maybe_parsed.release_error().release_value()); return; } @@ -1007,7 +1007,7 @@ GC::Ref SubtleCrypto::unwrap_key(Bindings::KeyFormat format, Ke // using unwrappedKeyAlgorithm as algorithm, format, usages and extractable and with bytes as keyData. auto result_or_error = normalized_key_algorithm.methods->import_key(*normalized_key_algorithm.parameter, format, bytes.downcast(), extractable, key_usages); if (result_or_error.is_error()) { - WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value().value()); + WebIDL::reject_promise(realm, promise, Bindings::exception_to_throw_completion(realm.vm(), result_or_error.release_error()).release_value()); return; } diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index 028e123f545..6d17000b2fd 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -2516,9 +2516,7 @@ JS::ThrowCompletionOr Element::upgrade_element(GC::Ref> create_element(Document& document, FlyStri auto result = TRY(WebIDL::construct(constructor)); // NOTE: IDL does not currently convert the object for us, so we will have to do it here. - if (!result.has_value() || !result->is_object() || !is(result->as_object())) + if (!result.is_object() || !is(result.as_object())) return JS::throw_completion(JS::TypeError::create(realm, "Custom element constructor must return an object that implements HTMLElement"_string)); - GC::Ref element = as(result->as_object()); + GC::Ref element = as(result.as_object()); // FIXME: 3. Assert: result’s custom element state and custom element definition are initialized. diff --git a/Libraries/LibWeb/DOM/EventDispatcher.cpp b/Libraries/LibWeb/DOM/EventDispatcher.cpp index aea05f89359..57c3d38eefe 100644 --- a/Libraries/LibWeb/DOM/EventDispatcher.cpp +++ b/Libraries/LibWeb/DOM/EventDispatcher.cpp @@ -97,7 +97,7 @@ bool EventDispatcher::inner_invoke(Event& event, Vector(global); - window_or_worker.report_an_exception(*result.release_error().value()); + window_or_worker.report_an_exception(result.release_error().value()); // 2. Set legacyOutputDidListenersThrowFlag if given. (Only used by IndexedDB currently) legacy_output_did_listeners_throw = true; diff --git a/Libraries/LibWeb/DOM/EventTarget.cpp b/Libraries/LibWeb/DOM/EventTarget.cpp index 6960ed42853..25ae41e08b6 100644 --- a/Libraries/LibWeb/DOM/EventTarget.cpp +++ b/Libraries/LibWeb/DOM/EventTarget.cpp @@ -715,7 +715,7 @@ JS::ThrowCompletionOr EventTarget::process_event_handler_for_event(FlyStri return return_value_or_error.release_error(); // FIXME: Ideally, invoke_callback would convert JS::Value to the appropriate return type for us as per the spec, but it doesn't currently. - auto return_value = *return_value_or_error.value(); + auto return_value = return_value_or_error.value(); auto is_beforeunload = event.type() == HTML::EventNames::beforeunload; diff --git a/Libraries/LibWeb/DOM/NodeIterator.cpp b/Libraries/LibWeb/DOM/NodeIterator.cpp index 529e3c2064e..61f32451afd 100644 --- a/Libraries/LibWeb/DOM/NodeIterator.cpp +++ b/Libraries/LibWeb/DOM/NodeIterator.cpp @@ -178,7 +178,7 @@ JS::ThrowCompletionOr NodeIterator::filter(Node& node) m_active = false; // 8. Return result. - auto result_value = TRY(result.value()->to_i32(vm())); + auto result_value = TRY(result.value().to_i32(vm())); return static_cast(result_value); } diff --git a/Libraries/LibWeb/DOM/TreeWalker.cpp b/Libraries/LibWeb/DOM/TreeWalker.cpp index bb04b5e4881..e2c6961a447 100644 --- a/Libraries/LibWeb/DOM/TreeWalker.cpp +++ b/Libraries/LibWeb/DOM/TreeWalker.cpp @@ -283,7 +283,7 @@ JS::ThrowCompletionOr TreeWalker::filter(Node& node) m_active = false; // 8. Return result. - auto result_value = TRY(result.value()->to_i32(vm())); + auto result_value = TRY(result.value().to_i32(vm())); return static_cast(result_value); } diff --git a/Libraries/LibWeb/Encoding/TextEncoderStream.cpp b/Libraries/LibWeb/Encoding/TextEncoderStream.cpp index 4283e6219af..6670abb4b6a 100644 --- a/Libraries/LibWeb/Encoding/TextEncoderStream.cpp +++ b/Libraries/LibWeb/Encoding/TextEncoderStream.cpp @@ -41,7 +41,7 @@ WebIDL::ExceptionOr> TextEncoderStream::construct_imp if (auto result = stream->encode_and_enqueue_chunk(chunk); result.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, result.exception()); - return WebIDL::create_rejected_promise(realm, *throw_completion.release_value()); + return WebIDL::create_rejected_promise(realm, throw_completion.release_value()); } return WebIDL::create_resolved_promise(realm, JS::js_undefined()); @@ -54,7 +54,7 @@ WebIDL::ExceptionOr> TextEncoderStream::construct_imp if (auto result = stream->encode_and_flush(); result.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, result.exception()); - return WebIDL::create_rejected_promise(realm, *throw_completion.release_value()); + return WebIDL::create_rejected_promise(realm, throw_completion.release_value()); } return WebIDL::create_resolved_promise(realm, JS::js_undefined()); diff --git a/Libraries/LibWeb/Fetch/Body.cpp b/Libraries/LibWeb/Fetch/Body.cpp index f93ce426fb0..63bca1ed314 100644 --- a/Libraries/LibWeb/Fetch/Body.cpp +++ b/Libraries/LibWeb/Fetch/Body.cpp @@ -212,7 +212,7 @@ WebIDL::ExceptionOr> consume_body(JS::Realm& realm, Bod if (value_or_error.is_error()) { // We can't call error_steps here without moving it into success_steps, causing a double move when we pause error_steps // to fully_read, so just reject the promise like error_steps does. - WebIDL::reject_promise(realm, promise, value_or_error.release_error().value().value()); + WebIDL::reject_promise(realm, promise, value_or_error.release_error().value()); return; } diff --git a/Libraries/LibWeb/Fetch/FetchMethod.cpp b/Libraries/LibWeb/Fetch/FetchMethod.cpp index c0124482eab..64531614ee3 100644 --- a/Libraries/LibWeb/Fetch/FetchMethod.cpp +++ b/Libraries/LibWeb/Fetch/FetchMethod.cpp @@ -38,7 +38,7 @@ GC::Ref fetch(JS::VM& vm, RequestInfo const& input, RequestInit auto exception_or_request_object = Request::construct_impl(realm, input, init); if (exception_or_request_object.is_exception()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, exception_or_request_object.exception()); - WebIDL::reject_promise(realm, promise_capability, *throw_completion.value()); + WebIDL::reject_promise(realm, promise_capability, throw_completion.value()); return promise_capability; } auto request_object = exception_or_request_object.release_value(); diff --git a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp index a88a825681a..eea57fe4eac 100644 --- a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp +++ b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp @@ -94,7 +94,7 @@ void Body::fully_read(JS::Realm& realm, Web::Fetch::Infrastructure::Body::Proces if (reader.is_exception()) { auto throw_completion = Bindings::exception_to_throw_completion(realm.vm(), reader.release_error()); - error_steps(throw_completion.release_value().value()); + error_steps(throw_completion.release_value()); return; } diff --git a/Libraries/LibWeb/FileAPI/Blob.cpp b/Libraries/LibWeb/FileAPI/Blob.cpp index bba0f83ecdf..460c8c5a765 100644 --- a/Libraries/LibWeb/FileAPI/Blob.cpp +++ b/Libraries/LibWeb/FileAPI/Blob.cpp @@ -350,7 +350,7 @@ GC::Ref Blob::get_stream() }); if (maybe_error.is_error()) { - readable_stream_error(*stream, maybe_error.release_error().value().value()); + readable_stream_error(*stream, maybe_error.release_error().value()); return; } diff --git a/Libraries/LibWeb/HTML/Navigable.cpp b/Libraries/LibWeb/HTML/Navigable.cpp index 40db75751c8..5523b7210d5 100644 --- a/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Libraries/LibWeb/HTML/Navigable.cpp @@ -1850,8 +1850,8 @@ GC::Ptr Navigable::evaluate_javascript_url(URL::URL const& url, U String result; // 9. If evaluationStatus is a normal completion, and evaluationStatus.[[Value]] is a String, then set result to evaluationStatus.[[Value]]. - if (evaluation_status.type() == JS::Completion::Type::Normal && evaluation_status.value().has_value() && evaluation_status.value()->is_string()) { - result = evaluation_status.value()->as_string().utf8_string(); + if (evaluation_status.type() == JS::Completion::Type::Normal && evaluation_status.value().is_string()) { + result = evaluation_status.value().as_string().utf8_string(); } else { // 10. Otherwise, return null. return nullptr; diff --git a/Libraries/LibWeb/HTML/Navigation.cpp b/Libraries/LibWeb/HTML/Navigation.cpp index 74d9983201e..6b3b50e8549 100644 --- a/Libraries/LibWeb/HTML/Navigation.cpp +++ b/Libraries/LibWeb/HTML/Navigation.cpp @@ -1143,7 +1143,7 @@ bool Navigation::inner_navigate_event_firing_algorithm( // 1. Append the result of invoking handler with an empty arguments list to promisesList. auto result = WebIDL::invoke_callback(handler, {}); // This *should* be equivalent to converting a promise to a promise capability - promises_list.append(WebIDL::create_resolved_promise(realm, result.value().value())); + promises_list.append(WebIDL::create_resolved_promise(realm, result.value())); } // 3. If promisesList's size is 0, then set promisesList to « a promise resolved with undefined ». diff --git a/Libraries/LibWeb/HTML/Scripting/ClassicScript.cpp b/Libraries/LibWeb/HTML/Scripting/ClassicScript.cpp index 82197ff86ca..e800404996b 100644 --- a/Libraries/LibWeb/HTML/Scripting/ClassicScript.cpp +++ b/Libraries/LibWeb/HTML/Scripting/ClassicScript.cpp @@ -82,7 +82,7 @@ JS::Completion ClassicScript::run(RethrowErrors rethrow_errors, GC::Ptr(realm.global_object()); - window_or_worker.report_an_exception(*evaluation_status.value()); + window_or_worker.report_an_exception(evaluation_status.value()); // 2. Clean up after running script with realm. clean_up_after_running_script(realm); diff --git a/Libraries/LibWeb/HTML/Scripting/ExceptionReporter.cpp b/Libraries/LibWeb/HTML/Scripting/ExceptionReporter.cpp index 34fdb49a4d1..f0660becf52 100644 --- a/Libraries/LibWeb/HTML/Scripting/ExceptionReporter.cpp +++ b/Libraries/LibWeb/HTML/Scripting/ExceptionReporter.cpp @@ -56,8 +56,7 @@ void report_exception_to_console(JS::Value value, JS::Realm& realm, ErrorInPromi void report_exception(JS::Completion const& throw_completion, JS::Realm& realm) { VERIFY(throw_completion.type() == JS::Completion::Type::Throw); - VERIFY(throw_completion.value().has_value()); - report_exception_to_console(*throw_completion.value(), realm, ErrorInPromise::No); + report_exception_to_console(throw_completion.value(), realm, ErrorInPromise::No); } } diff --git a/Libraries/LibWeb/HTML/Scripting/Fetching.cpp b/Libraries/LibWeb/HTML/Scripting/Fetching.cpp index 64c66b336be..24c29999f1d 100644 --- a/Libraries/LibWeb/HTML/Scripting/Fetching.cpp +++ b/Libraries/LibWeb/HTML/Scripting/Fetching.cpp @@ -843,7 +843,7 @@ void fetch_descendants_of_and_link_a_module_script(JS::Realm& realm, // If this throws an exception, set result's error to rethrow to that exception. if (linking_result.is_throw_completion()) - module_script.set_error_to_rethrow(linking_result.release_error().value().value()); + module_script.set_error_to_rethrow(linking_result.release_error().value()); // 2. Run onComplete given moduleScript. on_complete->function()(module_script); diff --git a/Libraries/LibWeb/HTML/Scripting/ImportMapParseResult.cpp b/Libraries/LibWeb/HTML/Scripting/ImportMapParseResult.cpp index f64a7c96d32..ef04f8e0dd2 100644 --- a/Libraries/LibWeb/HTML/Scripting/ImportMapParseResult.cpp +++ b/Libraries/LibWeb/HTML/Scripting/ImportMapParseResult.cpp @@ -57,8 +57,7 @@ void ImportMapParseResult::visit_edges(Visitor& visitor) visitor.visit(exception); }, [&](JS::Completion const& completion) { - if (completion.value().has_value()) - visitor.visit(completion.value().value()); + visitor.visit(completion.value()); }); } } diff --git a/Libraries/LibWeb/ServiceWorker/Job.cpp b/Libraries/LibWeb/ServiceWorker/Job.cpp index 68c9399e178..2812a2578ec 100644 --- a/Libraries/LibWeb/ServiceWorker/Job.cpp +++ b/Libraries/LibWeb/ServiceWorker/Job.cpp @@ -403,7 +403,7 @@ static void update(JS::VM& vm, GC::Ref job) if (job->client) { auto& realm = job->client->realm(); auto context = HTML::TemporaryExecutionContext(realm, HTML::TemporaryExecutionContext::CallbacksEnabled::Yes); - WebIDL::reject_promise(realm, *job->job_promise, *vm.throw_completion(JS::ErrorType::NotImplemented, "Run Service Worker"sv).value()); + WebIDL::reject_promise(realm, *job->job_promise, vm.throw_completion(JS::ErrorType::NotImplemented, "Run Service Worker"sv).value()); finish_job(vm, job); } }); @@ -430,7 +430,7 @@ static void unregister(JS::VM& vm, GC::Ref job) if (job->client) { auto& realm = job->client->realm(); auto context = HTML::TemporaryExecutionContext(realm, HTML::TemporaryExecutionContext::CallbacksEnabled::Yes); - WebIDL::reject_promise(realm, *job->job_promise, *vm.throw_completion(JS::ErrorType::NotImplemented, "Service Worker unregistration"sv).value()); + WebIDL::reject_promise(realm, *job->job_promise, vm.throw_completion(JS::ErrorType::NotImplemented, "Service Worker unregistration"sv).value()); finish_job(vm, job); } } diff --git a/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Libraries/LibWeb/Streams/AbstractOperations.cpp index 819812eab58..c39e5cc810d 100644 --- a/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -469,13 +469,13 @@ public: auto completion = Bindings::exception_to_throw_completion(m_realm->vm(), clone_result.release_error()); // 1. Perform ! ReadableStreamDefaultControllerError(branch1.[[controller]], cloneResult.[[Value]]). - readable_stream_default_controller_error(controller1, completion.value().value()); + readable_stream_default_controller_error(controller1, completion.value()); // 2. Perform ! ReadableStreamDefaultControllerError(branch2.[[controller]], cloneResult.[[Value]]). - readable_stream_default_controller_error(controller2, completion.value().value()); + readable_stream_default_controller_error(controller2, completion.value()); // 3. Resolve cancelPromise with ! ReadableStreamCancel(stream, cloneResult.[[Value]]). - auto cancel_result = readable_stream_cancel(m_stream, completion.value().value()); + auto cancel_result = readable_stream_cancel(m_stream, completion.value()); // Note: We need to manually convert the result to an ECMAScript value here, by extracting its [[Promise]] slot. WebIDL::resolve_promise(m_realm, m_cancel_promise, cancel_result->promise()); @@ -780,13 +780,13 @@ public: auto completion = Bindings::exception_to_throw_completion(m_realm->vm(), clone_result.release_error()); // 1. Perform ! ReadableByteStreamControllerError(branch1.[[controller]], cloneResult.[[Value]]). - readable_byte_stream_controller_error(controller1, completion.value().value()); + readable_byte_stream_controller_error(controller1, completion.value()); // 2. Perform ! ReadableByteStreamControllerError(branch2.[[controller]], cloneResult.[[Value]]). - readable_byte_stream_controller_error(controller2, completion.value().value()); + readable_byte_stream_controller_error(controller2, completion.value()); // 3. Resolve cancelPromise with ! ReadableStreamCancel(stream, cloneResult.[[Value]]). - auto cancel_result = readable_stream_cancel(m_stream, completion.value().value()); + auto cancel_result = readable_stream_cancel(m_stream, completion.value()); WebIDL::resolve_promise(m_realm, m_cancel_promise, cancel_result->promise()); @@ -944,13 +944,13 @@ public: auto completion = Bindings::exception_to_throw_completion(m_realm->vm(), clone_result.release_error()); // 1. Perform ! ReadableByteStreamControllerError(byobBranch.[[controller]], cloneResult.[[Value]]). - readable_byte_stream_controller_error(byob_controller, completion.value().value()); + readable_byte_stream_controller_error(byob_controller, completion.value()); // 2. Perform ! ReadableByteStreamControllerError(otherBranch.[[controller]], cloneResult.[[Value]]). - readable_byte_stream_controller_error(other_controller, completion.value().value()); + readable_byte_stream_controller_error(other_controller, completion.value()); // 3. Resolve cancelPromise with ! ReadableStreamCancel(stream, cloneResult.[[Value]]). - auto cancel_result = readable_stream_cancel(m_stream, completion.value().value()); + auto cancel_result = readable_stream_cancel(m_stream, completion.value()); WebIDL::resolve_promise(m_realm, m_cancel_promise, cancel_result->promise()); @@ -1448,7 +1448,7 @@ WebIDL::ExceptionOr> readable_stream_from_iterable(JS::V // 2. If nextResult is an abrupt completion, return a promise rejected with nextResult.[[Value]]. if (next_result.is_error()) - return WebIDL::create_rejected_promise(realm, *next_result.throw_completion().release_value()); + return WebIDL::create_rejected_promise(realm, next_result.throw_completion().release_value()); // 3. Let nextPromise be a promise resolved with nextResult.[[Value]]. auto next_promise = WebIDL::create_resolved_promise(realm, next_result.release_value()); @@ -1494,7 +1494,7 @@ WebIDL::ExceptionOr> readable_stream_from_iterable(JS::V // 3. If returnMethod is an abrupt completion, return a promise rejected with returnMethod.[[Value]]. if (return_method.is_error()) - return WebIDL::create_rejected_promise(realm, *return_method.throw_completion().release_value()); + return WebIDL::create_rejected_promise(realm, return_method.throw_completion().release_value()); // 4. If returnMethod.[[Value]] is undefined, return a promise resolved with undefined. if (return_method.value().is_undefined()) @@ -1505,7 +1505,7 @@ WebIDL::ExceptionOr> readable_stream_from_iterable(JS::V // 6. If returnResult is an abrupt completion, return a promise rejected with returnResult.[[Value]]. if (return_result.is_error()) - return WebIDL::create_rejected_promise(realm, *return_result.throw_completion().release_value()); + return WebIDL::create_rejected_promise(realm, return_result.throw_completion().release_value()); // 7. Let returnPromise be a promise resolved with returnResult.[[Value]]. auto return_promise = WebIDL::create_resolved_promise(realm, return_result.release_value()); @@ -1910,7 +1910,7 @@ void readable_byte_stream_controller_pull_into(ReadableByteStreamController& con if (buffer_result.is_exception()) { // 1. Perform readIntoRequest’s error steps, given bufferResult.[[Value]]. auto throw_completion = Bindings::exception_to_throw_completion(vm, buffer_result.exception()); - read_into_request.on_error(*throw_completion.release_value()); + read_into_request.on_error(throw_completion.release_value()); // 2. Return. return; @@ -2143,14 +2143,14 @@ WebIDL::ExceptionOr readable_stream_default_controller_enqueue(ReadableStr // 2. If result is an abrupt completion, if (result.is_abrupt()) { // 1. Perform ! ReadableStreamDefaultControllerError(controller, result.[[Value]]). - readable_stream_default_controller_error(controller, result.value().value()); + readable_stream_default_controller_error(controller, result.value()); // 2. Return result. return result; } // 3. Let chunkSize be result.[[Value]]. - auto chunk_size = result.release_value().release_value(); + auto chunk_size = result.release_value(); // 4. Let enqueueResult be EnqueueValueWithSize(controller, chunk, chunkSize). auto enqueue_result = enqueue_value_with_size(controller, chunk, chunk_size); @@ -2160,7 +2160,7 @@ WebIDL::ExceptionOr readable_stream_default_controller_enqueue(ReadableStr auto throw_completion = Bindings::throw_dom_exception_if_needed(vm, [&] { return enqueue_result; }).throw_completion(); // 1. Perform ! ReadableStreamDefaultControllerError(controller, enqueueResult.[[Value]]). - readable_stream_default_controller_error(controller, throw_completion.value().value()); + readable_stream_default_controller_error(controller, throw_completion.value()); // 2. Return enqueueResult. // Note: We need to return the throw_completion object here, as enqueue needs to throw the same object that the controller is errored with @@ -2683,7 +2683,7 @@ WebIDL::ExceptionOr set_up_readable_stream_default_controller_from_underly if (underlying_source.start) { start_algorithm = GC::create_function(realm.heap(), [controller, underlying_source_value, callback = underlying_source.start]() -> WebIDL::ExceptionOr { // Note: callback does not return a promise, so invoke_callback may return an abrupt completion - return TRY(WebIDL::invoke_callback(*callback, underlying_source_value, controller)).release_value(); + return TRY(WebIDL::invoke_callback(*callback, underlying_source_value, controller)); }); } @@ -2691,7 +2691,7 @@ WebIDL::ExceptionOr set_up_readable_stream_default_controller_from_underly if (underlying_source.pull) { pull_algorithm = GC::create_function(realm.heap(), [&realm, controller, underlying_source_value, callback = underlying_source.pull]() { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source_value, controller)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source_value, controller)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -2700,7 +2700,7 @@ WebIDL::ExceptionOr set_up_readable_stream_default_controller_from_underly if (underlying_source.cancel) { cancel_algorithm = GC::create_function(realm.heap(), [&realm, underlying_source_value, callback = underlying_source.cancel](JS::Value reason) { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source_value, reason)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source_value, reason)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -3552,7 +3552,7 @@ WebIDL::ExceptionOr readable_byte_stream_controller_enqueue_cloned_chunk_t auto throw_completion = Bindings::throw_dom_exception_if_needed(vm, [&] { return clone_result; }).throw_completion(); // 1. Perform ! ReadableByteStreamControllerError(controller, cloneResult.[[Value]]). - readable_byte_stream_controller_error(controller, throw_completion.value().value()); + readable_byte_stream_controller_error(controller, throw_completion.value()); // 2. Return cloneResult. // Note: We need to return the throw_completion object here, as enqueue needs to throw the same object that the controller is errored with @@ -4349,7 +4349,7 @@ WebIDL::ExceptionOr set_up_writable_stream_default_controller_from_underly if (underlying_sink.start) { start_algorithm = GC::create_function(realm.heap(), [controller, underlying_sink_value, callback = underlying_sink.start]() -> WebIDL::ExceptionOr { // Note: callback does not return a promise, so invoke_callback may return an abrupt completion - return TRY(WebIDL::invoke_callback(*callback, underlying_sink_value, controller)).release_value(); + return TRY(WebIDL::invoke_callback(*callback, underlying_sink_value, controller)); }); } @@ -4357,7 +4357,7 @@ WebIDL::ExceptionOr set_up_writable_stream_default_controller_from_underly if (underlying_sink.write) { write_algorithm = GC::create_function(realm.heap(), [&realm, controller, underlying_sink_value, callback = underlying_sink.write](JS::Value chunk) { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, underlying_sink_value, chunk, controller)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, underlying_sink_value, chunk, controller)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -4366,7 +4366,7 @@ WebIDL::ExceptionOr set_up_writable_stream_default_controller_from_underly if (underlying_sink.close) { close_algorithm = GC::create_function(realm.heap(), [&realm, underlying_sink_value, callback = underlying_sink.close]() { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, underlying_sink_value)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, underlying_sink_value)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -4375,7 +4375,7 @@ WebIDL::ExceptionOr set_up_writable_stream_default_controller_from_underly if (underlying_sink.abort) { abort_algorithm = GC::create_function(realm.heap(), [&realm, underlying_sink_value, callback = underlying_sink.abort](JS::Value reason) { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, underlying_sink_value, reason)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, underlying_sink_value, reason)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -4510,14 +4510,14 @@ JS::Value writable_stream_default_controller_get_chunk_size(WritableStreamDefaul // 3. If returnValue is an abrupt completion, if (return_value.is_abrupt()) { // 1. Perform ! WritableStreamDefaultControllerErrorIfNeeded(controller, returnValue.[[Value]]). - writable_stream_default_controller_error_if_needed(controller, *return_value.release_value()); + writable_stream_default_controller_error_if_needed(controller, return_value.release_value()); // 2. Return 1. return JS::Value { 1.0 }; } // 4. Return returnValue.[[Value]]. - return *return_value.release_value(); + return return_value.release_value(); } // https://streams.spec.whatwg.org/#writable-stream-default-controller-get-desired-size @@ -4632,7 +4632,7 @@ void writable_stream_default_controller_write(WritableStreamDefaultController& c auto throw_completion = Bindings::throw_dom_exception_if_needed(vm, [&] { return enqueue_result; }).throw_completion(); // 1. Perform ! WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueResult.[[Value]]). - writable_stream_default_controller_error_if_needed(controller, *throw_completion.release_value()); + writable_stream_default_controller_error_if_needed(controller, throw_completion.release_value()); // 2. Return. return; @@ -4755,7 +4755,7 @@ void set_up_transform_stream_default_controller_from_transformer(TransformStream // 2. If result is an abrupt completion, return a promise rejected with result.[[Value]]. if (result.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(vm, result.exception()); - return WebIDL::create_rejected_promise(realm, *throw_completion.release_value()); + return WebIDL::create_rejected_promise(realm, throw_completion.release_value()); } // 3. Otherwise, return a promise resolved with undefined. @@ -4778,7 +4778,7 @@ void set_up_transform_stream_default_controller_from_transformer(TransformStream if (transformer_dict.transform) { transform_algorithm = GC::create_function(realm.heap(), [controller, &realm, transformer, callback = transformer_dict.transform](JS::Value chunk) { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, transformer, chunk, controller)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, transformer, chunk, controller)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -4788,7 +4788,7 @@ void set_up_transform_stream_default_controller_from_transformer(TransformStream if (transformer_dict.flush) { flush_algorithm = GC::create_function(realm.heap(), [&realm, transformer, callback = transformer_dict.flush, controller]() { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, transformer, controller)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, transformer, controller)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -4798,7 +4798,7 @@ void set_up_transform_stream_default_controller_from_transformer(TransformStream if (transformer_dict.cancel) { cancel_algorithm = GC::create_function(realm.heap(), [&realm, transformer, callback = transformer_dict.cancel](JS::Value reason) { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, transformer, reason)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, transformer, reason)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -4845,7 +4845,7 @@ WebIDL::ExceptionOr transform_stream_default_controller_enqueue(TransformS auto throw_completion = Bindings::exception_to_throw_completion(vm, enqueue_result.exception()); // 1. Perform ! TransformStreamErrorWritableAndUnblockWrite(stream, enqueueResult.[[Value]]). - transform_stream_error_writable_and_unblock_write(*stream, throw_completion.value().value()); + transform_stream_error_writable_and_unblock_write(*stream, throw_completion.value()); // 2. Throw stream.[[readable]].[[storedError]]. return JS::throw_completion(stream->readable()->stored_error()); @@ -5324,7 +5324,7 @@ WebIDL::ExceptionOr set_up_readable_byte_stream_controller_from_underlying if (underlying_source_dict.start) { start_algorithm = GC::create_function(realm.heap(), [controller, underlying_source, callback = underlying_source_dict.start]() -> WebIDL::ExceptionOr { // Note: callback does not return a promise, so invoke_callback may return an abrupt completion - return TRY(WebIDL::invoke_callback(*callback, underlying_source, controller)).release_value(); + return TRY(WebIDL::invoke_callback(*callback, underlying_source, controller)); }); } @@ -5332,7 +5332,7 @@ WebIDL::ExceptionOr set_up_readable_byte_stream_controller_from_underlying if (underlying_source_dict.pull) { pull_algorithm = GC::create_function(realm.heap(), [&realm, controller, underlying_source, callback = underlying_source_dict.pull]() { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source, controller)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source, controller)); return WebIDL::create_resolved_promise(realm, result); }); } @@ -5341,7 +5341,7 @@ WebIDL::ExceptionOr set_up_readable_byte_stream_controller_from_underlying if (underlying_source_dict.cancel) { cancel_algorithm = GC::create_function(realm.heap(), [&realm, underlying_source, callback = underlying_source_dict.cancel](JS::Value reason) { // Note: callback returns a promise, so invoke_callback will never return an abrupt completion - auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source, reason)).release_value(); + auto result = MUST(WebIDL::invoke_callback(*callback, underlying_source, reason)); return WebIDL::create_resolved_promise(realm, result); }); } diff --git a/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp b/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp index 7c8ab3c29cd..56742be5b64 100644 --- a/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp +++ b/Libraries/LibWeb/Streams/ReadableByteStreamController.cpp @@ -149,7 +149,7 @@ void ReadableByteStreamController::pull_steps(GC::Ref read_request) // 2. If buffer is an abrupt completion, if (buffer.is_throw_completion()) { // 1. Perform readRequest’s error steps, given buffer.[[Value]]. - read_request->on_error(*buffer.throw_completion().value()); + read_request->on_error(buffer.throw_completion().value()); // 2. Return. return; diff --git a/Libraries/LibWeb/Streams/TransformStream.cpp b/Libraries/LibWeb/Streams/TransformStream.cpp index a770136a1ac..53b5cca71d0 100644 --- a/Libraries/LibWeb/Streams/TransformStream.cpp +++ b/Libraries/LibWeb/Streams/TransformStream.cpp @@ -63,7 +63,7 @@ WebIDL::ExceptionOr> TransformStream::construct_impl(JS // 12. If transformerDict["start"] exists, then resolve startPromise with the result of invoking // transformerDict["start"] with argument list « this.[[controller]] » and callback this value transformer. if (transformer_dict.start) { - auto result = TRY(WebIDL::invoke_callback(*transformer_dict.start, transformer, stream->controller())).release_value(); + auto result = TRY(WebIDL::invoke_callback(*transformer_dict.start, transformer, stream->controller())); WebIDL::resolve_promise(realm, start_promise, result); } // 13. Otherwise, resolve startPromise with undefined. diff --git a/Libraries/LibWeb/WebAssembly/WebAssembly.cpp b/Libraries/LibWeb/WebAssembly/WebAssembly.cpp index 68ff1f99d36..89613052c6b 100644 --- a/Libraries/LibWeb/WebAssembly/WebAssembly.cpp +++ b/Libraries/LibWeb/WebAssembly/WebAssembly.cpp @@ -734,7 +734,7 @@ GC::Ref compile_potential_webassembly_response(JS::VM& vm, GC:: // 1. Let response be unwrappedSource’s response. if (!unwrapped_source.is_object() || !is(unwrapped_source.as_object())) { - WebIDL::reject_promise(realm, return_value, *vm.throw_completion(JS::ErrorType::NotAnObjectOfType, "Response").value()); + WebIDL::reject_promise(realm, return_value, vm.throw_completion(JS::ErrorType::NotAnObjectOfType, "Response").value()); return JS::js_undefined(); } auto& response_object = static_cast(unwrapped_source.as_object()); @@ -747,19 +747,19 @@ GC::Ref compile_potential_webassembly_response(JS::VM& vm, GC:: // Note: extra parameters are not allowed, including the empty `application/wasm;`. // FIXME: Validate these extra constraints that are not checked by extract_mime_type() if (auto mime = response->header_list()->extract_mime_type(); !mime.has_value() || mime.value().essence() != "application/wasm"sv) { - WebIDL::reject_promise(realm, return_value, *vm.throw_completion("Response does not match the application/wasm MIME type"sv).value()); + WebIDL::reject_promise(realm, return_value, vm.throw_completion("Response does not match the application/wasm MIME type"sv).value()); return JS::js_undefined(); } // 6. If response is not CORS-same-origin, reject returnValue with a TypeError and abort these substeps. if (!response->is_cors_same_origin()) { - WebIDL::reject_promise(realm, return_value, *vm.throw_completion("Response is not CORS-same-origin"sv).value()); + WebIDL::reject_promise(realm, return_value, vm.throw_completion("Response is not CORS-same-origin"sv).value()); return JS::js_undefined(); } // 7. If response’s status is not an ok status, reject returnValue with a TypeError and abort these substeps. if (!response_object.ok()) { - WebIDL::reject_promise(realm, return_value, *vm.throw_completion("Response does not represent an ok status"sv).value()); + WebIDL::reject_promise(realm, return_value, vm.throw_completion("Response does not represent an ok status"sv).value()); return JS::js_undefined(); } @@ -767,7 +767,7 @@ GC::Ref compile_potential_webassembly_response(JS::VM& vm, GC:: auto body_promise_or_error = response_object.array_buffer(); if (body_promise_or_error.is_error()) { auto throw_completion = Bindings::exception_to_throw_completion(realm.vm(), body_promise_or_error.release_error()); - WebIDL::reject_promise(realm, return_value, *throw_completion.value()); + WebIDL::reject_promise(realm, return_value, throw_completion.value()); return JS::js_undefined(); } auto body_promise = body_promise_or_error.release_value(); @@ -779,7 +779,7 @@ GC::Ref compile_potential_webassembly_response(JS::VM& vm, GC:: auto stable_bytes = WebIDL::get_buffer_source_copy(body_array_buffer.as_object()); if (stable_bytes.is_error()) { VERIFY(stable_bytes.error().code() == ENOMEM); - WebIDL::reject_promise(HTML::relevant_realm(*return_value->promise()), return_value, *vm.throw_completion(vm.error_message(JS::VM::ErrorMessage::OutOfMemory)).value()); + WebIDL::reject_promise(HTML::relevant_realm(*return_value->promise()), return_value, vm.throw_completion(vm.error_message(JS::VM::ErrorMessage::OutOfMemory)).value()); return JS::js_undefined(); } diff --git a/Libraries/LibWeb/WebDriver/ExecuteScript.cpp b/Libraries/LibWeb/WebDriver/ExecuteScript.cpp index 45c0c6652ff..ef202fef8d4 100644 --- a/Libraries/LibWeb/WebDriver/ExecuteScript.cpp +++ b/Libraries/LibWeb/WebDriver/ExecuteScript.cpp @@ -122,7 +122,7 @@ void execute_script(HTML::BrowsingContext const& browsing_context, String body, // 3. Upon rejection of scriptPromise with value r, reject promise with value r. if (script_result.is_throw_completion()) { - WebIDL::reject_promise(realm, promise, *script_result.throw_completion().value()); + WebIDL::reject_promise(realm, promise, script_result.throw_completion().value()); } })); @@ -184,7 +184,7 @@ void execute_async_script(HTML::BrowsingContext const& browsing_context, String // In order to preserve legacy behavior, the return value only influences the command if it is a // "thenable" object or if determining this produces an exception. if (script_result.is_throw_completion()) { - promise->reject(*script_result.throw_completion().value()); + promise->reject(script_result.throw_completion().value()); return; } @@ -197,7 +197,7 @@ void execute_async_script(HTML::BrowsingContext const& browsing_context, String // 7. If then.[[Type]] is not normal, then reject promise with value then.[[Value]], and abort these steps. if (then.is_throw_completion()) { - promise->reject(*then.throw_completion().value()); + promise->reject(then.throw_completion().value()); return; } diff --git a/Libraries/LibWeb/WebDriver/JSON.cpp b/Libraries/LibWeb/WebDriver/JSON.cpp index c21f9d13555..f614f9f26b5 100644 --- a/Libraries/LibWeb/WebDriver/JSON.cpp +++ b/Libraries/LibWeb/WebDriver/JSON.cpp @@ -121,7 +121,7 @@ static ErrorOr clone_an_object(HTML::BrowsingConte auto source_property_value = value.get(name); if (source_property_value.is_error()) { error = WebDriver::Error::from_code(ErrorCode::JavascriptError, "Script returned an error"sv); - return JS::normal_completion({}); + return JS::normal_completion(JS::js_undefined()); } // 3. Let cloned property result be the result of calling the clone algorithm with session, source property @@ -143,7 +143,7 @@ static ErrorOr clone_an_object(HTML::BrowsingConte // 5. Otherwise, return cloned property result. else { error = cloned_property_result.release_error(); - return JS::normal_completion({}); + return JS::normal_completion(JS::js_undefined()); } return {}; diff --git a/Libraries/LibWeb/WebIDL/AbstractOperations.cpp b/Libraries/LibWeb/WebIDL/AbstractOperations.cpp index 6e59e0d9edd..1f57f9c3069 100644 --- a/Libraries/LibWeb/WebIDL/AbstractOperations.cpp +++ b/Libraries/LibWeb/WebIDL/AbstractOperations.cpp @@ -132,7 +132,7 @@ inline JS::Completion clean_up_on_return(JS::Realm& stored_realm, JS::Realm& rel return completion; // 5. Let rejectedPromise be ! Call(%Promise.reject%, %Promise%, «completion.[[Value]]»). - auto rejected_promise = create_rejected_promise(relevant_realm, *completion.release_value()); + auto rejected_promise = create_rejected_promise(relevant_realm, completion.release_value()); // 6. Return the result of converting rejectedPromise to the operation’s return type. // Note: The operation must return a promise, so no conversion is necessary @@ -308,7 +308,7 @@ JS::Completion invoke_callback(WebIDL::CallbackType& callback, Optional(relevant_realm.global_object()); - window_or_worker.report_an_exception(*completion.release_value()); + window_or_worker.report_an_exception(completion.release_value()); // 3. Return the unique undefined IDL value. return JS::js_undefined(); @@ -326,7 +326,7 @@ JS::Completion invoke_callback(WebIDL::CallbackType& callback, Optionalpromise() }; diff --git a/Libraries/LibWeb/WebIDL/ExceptionOr.h b/Libraries/LibWeb/WebIDL/ExceptionOr.h index c7a39e8992d..a6444f7a44d 100644 --- a/Libraries/LibWeb/WebIDL/ExceptionOr.h +++ b/Libraries/LibWeb/WebIDL/ExceptionOr.h @@ -166,7 +166,7 @@ struct Formatter : Formatter { }, [&](JS::Completion const& completion) -> ErrorOr { VERIFY(completion.is_error()); - auto value = *completion.value(); + auto value = completion.value(); if (value.is_object()) { auto& object = value.as_object(); diff --git a/Libraries/LibWeb/WebIDL/Promise.cpp b/Libraries/LibWeb/WebIDL/Promise.cpp index 0b35bff261f..cf1180e5d0c 100644 --- a/Libraries/LibWeb/WebIDL/Promise.cpp +++ b/Libraries/LibWeb/WebIDL/Promise.cpp @@ -293,7 +293,7 @@ void wait_for_all(JS::Realm& realm, Vector> const& promises, Fu GC::Ref create_rejected_promise_from_exception(JS::Realm& realm, Exception exception) { auto throw_completion = Bindings::exception_to_throw_completion(realm.vm(), move(exception)); - return WebIDL::create_rejected_promise(realm, *throw_completion.value()); + return WebIDL::create_rejected_promise(realm, throw_completion.value()); } } diff --git a/Services/WebContent/WebContentConsoleClient.cpp b/Services/WebContent/WebContentConsoleClient.cpp index 046d33b9fa4..f42cd65383c 100644 --- a/Services/WebContent/WebContentConsoleClient.cpp +++ b/Services/WebContent/WebContentConsoleClient.cpp @@ -48,9 +48,9 @@ void WebContentConsoleClient::handle_input(StringView js_source) // FIXME: Add parse error printouts back once ClassicScript can report parse errors. auto result = script->run(Web::HTML::ClassicScript::RethrowErrors::No, with_scope); - if (result.value().has_value()) { - m_console_global_environment_extensions->set_most_recent_result(*result.value()); - handle_result(*result.value()); + if (!result.is_error()) { + m_console_global_environment_extensions->set_most_recent_result(result.value()); + handle_result(result.value()); } } diff --git a/Tests/LibJS/test262-runner.cpp b/Tests/LibJS/test262-runner.cpp index 185a01964a7..b15b6ee69e9 100644 --- a/Tests/LibJS/test262-runner.cpp +++ b/Tests/LibJS/test262-runner.cpp @@ -84,7 +84,7 @@ static ErrorOr run_program(InterpreterT& interpreter, ScriptOrM }); if (result.is_error()) { - auto error_value = *result.throw_completion().value(); + auto error_value = result.throw_completion().value(); TestError error; error.phase = NegativePhase::Runtime; if (error_value.is_object()) { diff --git a/Utilities/js.cpp b/Utilities/js.cpp index a9dbe998702..9419207039c 100644 --- a/Utilities/js.cpp +++ b/Utilities/js.cpp @@ -266,8 +266,7 @@ static ErrorOr parse_and_run(JS::Realm& realm, StringView source, StringVi g_last_value = GC::make_root(result.value()); if (result.is_error()) { - VERIFY(result.throw_completion().value().has_value()); - TRY(handle_exception(*result.release_error().value())); + TRY(handle_exception(result.release_error().value())); return false; }