mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 09:17:35 +00:00
LibJS: Don't assume non-empty [[Value]] in Completion TRY() helpers
This commit is contained in:
parent
032e6a2d28
commit
95acb1ce88
8 changed files with 10 additions and 9 deletions
|
@ -888,7 +888,7 @@ Value ForOfStatement::execute(Interpreter& interpreter, GlobalObject& global_obj
|
||||||
interpreter.vm().running_execution_context().lexical_environment = old_environment;
|
interpreter.vm().running_execution_context().lexical_environment = old_environment;
|
||||||
});
|
});
|
||||||
|
|
||||||
TRY_OR_DISCARD(get_iterator_values(global_object, rhs_result, [&](Value value) -> Optional<Completion> {
|
(void)TRY_OR_DISCARD(get_iterator_values(global_object, rhs_result, [&](Value value) -> Optional<Completion> {
|
||||||
TRY(for_of_head_state.execute_head(interpreter, global_object, value));
|
TRY(for_of_head_state.execute_head(interpreter, global_object, value));
|
||||||
last_value = m_body->execute(interpreter, global_object).value_or(last_value);
|
last_value = m_body->execute(interpreter, global_object).value_or(last_value);
|
||||||
interpreter.vm().running_execution_context().lexical_environment = old_environment;
|
interpreter.vm().running_execution_context().lexical_environment = old_environment;
|
||||||
|
@ -2973,7 +2973,7 @@ Value ArrayExpression::execute(Interpreter& interpreter, GlobalObject& global_ob
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
if (is<SpreadExpression>(*element)) {
|
if (is<SpreadExpression>(*element)) {
|
||||||
TRY_OR_DISCARD(get_iterator_values(global_object, value, [&](Value iterator_value) -> Optional<Completion> {
|
(void)TRY_OR_DISCARD(get_iterator_values(global_object, value, [&](Value iterator_value) -> Optional<Completion> {
|
||||||
array->indexed_properties().put(index++, iterator_value, default_attributes);
|
array->indexed_properties().put(index++, iterator_value, default_attributes);
|
||||||
return {};
|
return {};
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -70,10 +70,11 @@ public:
|
||||||
|
|
||||||
// These are for compatibility with the TRY() macro in AK.
|
// These are for compatibility with the TRY() macro in AK.
|
||||||
[[nodiscard]] bool is_error() const { return m_type == Type::Throw; }
|
[[nodiscard]] bool is_error() const { return m_type == Type::Throw; }
|
||||||
[[nodiscard]] Value release_value() { return m_value.release_value(); }
|
[[nodiscard]] Optional<Value> release_value() { return move(m_value); }
|
||||||
Completion release_error()
|
Completion release_error()
|
||||||
{
|
{
|
||||||
VERIFY(is_error());
|
VERIFY(is_error());
|
||||||
|
VERIFY(m_value.has_value());
|
||||||
return { m_type, release_value(), move(m_target) };
|
return { m_type, release_value(), move(m_target) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,7 @@ ThrowCompletionOr<MarkedValueList> iterable_to_list(GlobalObject& global_object,
|
||||||
auto& vm = global_object.vm();
|
auto& vm = global_object.vm();
|
||||||
MarkedValueList values(vm.heap());
|
MarkedValueList values(vm.heap());
|
||||||
|
|
||||||
TRY(get_iterator_values(
|
(void)TRY(get_iterator_values(
|
||||||
global_object, iterable, [&](auto value) -> Optional<Completion> {
|
global_object, iterable, [&](auto value) -> Optional<Completion> {
|
||||||
values.append(value);
|
values.append(value);
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -57,7 +57,7 @@ ThrowCompletionOr<Object*> MapConstructor::construct(FunctionObject& new_target)
|
||||||
if (!adder.is_function())
|
if (!adder.is_function())
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'set' property of Map");
|
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'set' property of Map");
|
||||||
|
|
||||||
TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
(void)TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
||||||
if (!iterator_value.is_object())
|
if (!iterator_value.is_object())
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObject, String::formatted("Iterator value {}", iterator_value.to_string_without_side_effects()));
|
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObject, String::formatted("Iterator value {}", iterator_value.to_string_without_side_effects()));
|
||||||
|
|
||||||
|
|
|
@ -226,7 +226,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::from_entries)
|
||||||
|
|
||||||
auto* object = Object::create(global_object, global_object.object_prototype());
|
auto* object = Object::create(global_object, global_object.object_prototype());
|
||||||
|
|
||||||
TRY(get_iterator_values(global_object, iterable, [&](Value iterator_value) -> Optional<Completion> {
|
(void)TRY(get_iterator_values(global_object, iterable, [&](Value iterator_value) -> Optional<Completion> {
|
||||||
if (!iterator_value.is_object())
|
if (!iterator_value.is_object())
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObject, String::formatted("Iterator value {}", iterator_value.to_string_without_side_effects()));
|
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObject, String::formatted("Iterator value {}", iterator_value.to_string_without_side_effects()));
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ ThrowCompletionOr<Object*> SetConstructor::construct(FunctionObject& new_target)
|
||||||
if (!adder.is_function())
|
if (!adder.is_function())
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'add' property of Set");
|
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'add' property of Set");
|
||||||
|
|
||||||
TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
(void)TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
||||||
TRY(vm.call(adder.as_function(), Value(set), iterator_value));
|
TRY(vm.call(adder.as_function(), Value(set), iterator_value));
|
||||||
return {};
|
return {};
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -55,7 +55,7 @@ ThrowCompletionOr<Object*> WeakMapConstructor::construct(FunctionObject& new_tar
|
||||||
if (!adder.is_function())
|
if (!adder.is_function())
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'set' property of WeakMap");
|
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'set' property of WeakMap");
|
||||||
|
|
||||||
TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
(void)TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
||||||
if (!iterator_value.is_object())
|
if (!iterator_value.is_object())
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObject, String::formatted("Iterator value {}", iterator_value.to_string_without_side_effects()));
|
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObject, String::formatted("Iterator value {}", iterator_value.to_string_without_side_effects()));
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ ThrowCompletionOr<Object*> WeakSetConstructor::construct(FunctionObject& new_tar
|
||||||
if (!adder.is_function())
|
if (!adder.is_function())
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'add' property of WeakSet");
|
return vm.throw_completion<TypeError>(global_object, ErrorType::NotAFunction, "'add' property of WeakSet");
|
||||||
|
|
||||||
TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
(void)TRY(get_iterator_values(global_object, vm.argument(0), [&](Value iterator_value) -> Optional<Completion> {
|
||||||
TRY(vm.call(adder.as_function(), Value(weak_set), iterator_value));
|
TRY(vm.call(adder.as_function(), Value(weak_set), iterator_value));
|
||||||
return {};
|
return {};
|
||||||
}));
|
}));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue