mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 05:07:34 +00:00
LibJS: Convert FunctionObject::internal_construct() to NonnullGCPtr
This commit is contained in:
parent
1c24b82dd7
commit
03acbf0beb
10 changed files with 17 additions and 17 deletions
|
@ -82,7 +82,7 @@ ThrowCompletionOr<Object*> construct_impl(VM& vm, FunctionObject& function, Opti
|
||||||
arguments_list = MarkedVector<Value> { vm.heap() };
|
arguments_list = MarkedVector<Value> { vm.heap() };
|
||||||
|
|
||||||
// 3. Return ? F.[[Construct]](argumentsList, newTarget).
|
// 3. Return ? F.[[Construct]](argumentsList, newTarget).
|
||||||
return function.internal_construct(move(*arguments_list), *new_target);
|
return TRY(function.internal_construct(move(*arguments_list), *new_target)).ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7.3.19 LengthOfArrayLike ( obj ), https://tc39.es/ecma262/#sec-lengthofarraylike
|
// 7.3.19 LengthOfArrayLike ( obj ), https://tc39.es/ecma262/#sec-lengthofarraylike
|
||||||
|
|
|
@ -66,7 +66,7 @@ ThrowCompletionOr<Value> BoundFunction::internal_call([[maybe_unused]] Value thi
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10.4.1.2 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-bound-function-exotic-objects-construct-argumentslist-newtarget
|
// 10.4.1.2 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-bound-function-exotic-objects-construct-argumentslist-newtarget
|
||||||
ThrowCompletionOr<Object*> BoundFunction::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
ThrowCompletionOr<NonnullGCPtr<Object>> BoundFunction::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ ThrowCompletionOr<Object*> BoundFunction::internal_construct(MarkedVector<Value>
|
||||||
final_new_target = ⌖
|
final_new_target = ⌖
|
||||||
|
|
||||||
// 6. Return ? Construct(target, args, newTarget).
|
// 6. Return ? Construct(target, args, newTarget).
|
||||||
return construct(vm, target, move(args), final_new_target);
|
return *TRY(construct(vm, target, move(args), final_new_target));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BoundFunction::visit_edges(Visitor& visitor)
|
void BoundFunction::visit_edges(Visitor& visitor)
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
virtual ~BoundFunction() override = default;
|
virtual ~BoundFunction() override = default;
|
||||||
|
|
||||||
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
||||||
virtual ThrowCompletionOr<Object*> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
virtual ThrowCompletionOr<NonnullGCPtr<Object>> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
||||||
|
|
||||||
virtual FlyString const& name() const override { return m_name; }
|
virtual FlyString const& name() const override { return m_name; }
|
||||||
virtual bool is_strict_mode() const override { return m_bound_target_function->is_strict_mode(); }
|
virtual bool is_strict_mode() const override { return m_bound_target_function->is_strict_mode(); }
|
||||||
|
|
|
@ -193,7 +193,7 @@ ThrowCompletionOr<Value> ECMAScriptFunctionObject::internal_call(Value this_argu
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10.2.2 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-ecmascript-function-objects-construct-argumentslist-newtarget
|
// 10.2.2 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-ecmascript-function-objects-construct-argumentslist-newtarget
|
||||||
ThrowCompletionOr<Object*> ECMAScriptFunctionObject::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
ThrowCompletionOr<NonnullGCPtr<Object>> ECMAScriptFunctionObject::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
|
|
||||||
|
@ -265,11 +265,11 @@ ThrowCompletionOr<Object*> ECMAScriptFunctionObject::internal_construct(MarkedVe
|
||||||
|
|
||||||
// a. If Type(result.[[Value]]) is Object, return result.[[Value]].
|
// a. If Type(result.[[Value]]) is Object, return result.[[Value]].
|
||||||
if (result.value()->is_object())
|
if (result.value()->is_object())
|
||||||
return &result.value()->as_object();
|
return result.value()->as_object();
|
||||||
|
|
||||||
// b. If kind is base, return thisArgument.
|
// b. If kind is base, return thisArgument.
|
||||||
if (kind == ConstructorKind::Base)
|
if (kind == ConstructorKind::Base)
|
||||||
return this_argument.ptr();
|
return *this_argument;
|
||||||
|
|
||||||
// c. If result.[[Value]] is not undefined, throw a TypeError exception.
|
// c. If result.[[Value]] is not undefined, throw a TypeError exception.
|
||||||
if (!result.value()->is_undefined())
|
if (!result.value()->is_undefined())
|
||||||
|
@ -288,7 +288,7 @@ ThrowCompletionOr<Object*> ECMAScriptFunctionObject::internal_construct(MarkedVe
|
||||||
VERIFY(this_binding.is_object());
|
VERIFY(this_binding.is_object());
|
||||||
|
|
||||||
// 14. Return thisBinding.
|
// 14. Return thisBinding.
|
||||||
return &this_binding.as_object();
|
return this_binding.as_object();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ECMAScriptFunctionObject::visit_edges(Visitor& visitor)
|
void ECMAScriptFunctionObject::visit_edges(Visitor& visitor)
|
||||||
|
|
|
@ -39,7 +39,7 @@ public:
|
||||||
virtual ~ECMAScriptFunctionObject() override = default;
|
virtual ~ECMAScriptFunctionObject() override = default;
|
||||||
|
|
||||||
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
||||||
virtual ThrowCompletionOr<Object*> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
virtual ThrowCompletionOr<NonnullGCPtr<Object>> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
||||||
|
|
||||||
void make_method(Object& home_object);
|
void make_method(Object& home_object);
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ public:
|
||||||
// Table 7: Additional Essential Internal Methods of Function Objects, https://tc39.es/ecma262/#table-additional-essential-internal-methods-of-function-objects
|
// Table 7: Additional Essential Internal Methods of Function Objects, https://tc39.es/ecma262/#table-additional-essential-internal-methods-of-function-objects
|
||||||
|
|
||||||
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) = 0;
|
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) = 0;
|
||||||
virtual ThrowCompletionOr<Object*> internal_construct([[maybe_unused]] MarkedVector<Value> arguments_list, [[maybe_unused]] FunctionObject& new_target) { VERIFY_NOT_REACHED(); }
|
virtual ThrowCompletionOr<NonnullGCPtr<Object>> internal_construct([[maybe_unused]] MarkedVector<Value> arguments_list, [[maybe_unused]] FunctionObject& new_target) { VERIFY_NOT_REACHED(); }
|
||||||
|
|
||||||
virtual FlyString const& name() const = 0;
|
virtual FlyString const& name() const = 0;
|
||||||
|
|
||||||
|
|
|
@ -160,7 +160,7 @@ ThrowCompletionOr<Value> NativeFunction::internal_call(Value this_argument, Mark
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10.3.2 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-built-in-function-objects-construct-argumentslist-newtarget
|
// 10.3.2 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-built-in-function-objects-construct-argumentslist-newtarget
|
||||||
ThrowCompletionOr<Object*> NativeFunction::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
ThrowCompletionOr<NonnullGCPtr<Object>> NativeFunction::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ ThrowCompletionOr<Object*> NativeFunction::internal_construct(MarkedVector<Value
|
||||||
vm.pop_execution_context();
|
vm.pop_execution_context();
|
||||||
|
|
||||||
// 12. Return ? result.
|
// 12. Return ? result.
|
||||||
return result;
|
return *TRY(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
ThrowCompletionOr<Value> NativeFunction::call()
|
ThrowCompletionOr<Value> NativeFunction::call()
|
||||||
|
|
|
@ -27,7 +27,7 @@ public:
|
||||||
virtual ~NativeFunction() override = default;
|
virtual ~NativeFunction() override = default;
|
||||||
|
|
||||||
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
||||||
virtual ThrowCompletionOr<Object*> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
virtual ThrowCompletionOr<NonnullGCPtr<Object>> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
||||||
|
|
||||||
// Used for [[Call]] / [[Construct]]'s "...result of evaluating F in a manner that conforms to the specification of F".
|
// Used for [[Call]] / [[Construct]]'s "...result of evaluating F in a manner that conforms to the specification of F".
|
||||||
// Needs to be overridden by all NativeFunctions without an m_native_function.
|
// Needs to be overridden by all NativeFunctions without an m_native_function.
|
||||||
|
|
|
@ -784,7 +784,7 @@ bool ProxyObject::has_constructor() const
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10.5.13 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
|
// 10.5.13 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
|
||||||
ThrowCompletionOr<Object*> ProxyObject::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
ThrowCompletionOr<NonnullGCPtr<Object>> ProxyObject::internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
auto& realm = *vm.current_realm();
|
auto& realm = *vm.current_realm();
|
||||||
|
@ -808,7 +808,7 @@ ThrowCompletionOr<Object*> ProxyObject::internal_construct(MarkedVector<Value> a
|
||||||
// 7. If trap is undefined, then
|
// 7. If trap is undefined, then
|
||||||
if (!trap) {
|
if (!trap) {
|
||||||
// a. Return ? Construct(target, argumentsList, newTarget).
|
// a. Return ? Construct(target, argumentsList, newTarget).
|
||||||
return construct(vm, static_cast<FunctionObject&>(m_target), move(arguments_list), &new_target);
|
return *TRY(construct(vm, static_cast<FunctionObject&>(m_target), move(arguments_list), &new_target));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 8. Let argArray be CreateArrayFromList(argumentsList).
|
// 8. Let argArray be CreateArrayFromList(argumentsList).
|
||||||
|
@ -822,7 +822,7 @@ ThrowCompletionOr<Object*> ProxyObject::internal_construct(MarkedVector<Value> a
|
||||||
return vm.throw_completion<TypeError>(ErrorType::ProxyConstructBadReturnType);
|
return vm.throw_completion<TypeError>(ErrorType::ProxyConstructBadReturnType);
|
||||||
|
|
||||||
// 11. Return newObj.
|
// 11. Return newObj.
|
||||||
return &new_object.as_object();
|
return new_object.as_object();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProxyObject::visit_edges(Cell::Visitor& visitor)
|
void ProxyObject::visit_edges(Cell::Visitor& visitor)
|
||||||
|
|
|
@ -43,7 +43,7 @@ public:
|
||||||
virtual ThrowCompletionOr<bool> internal_delete(PropertyKey const&) override;
|
virtual ThrowCompletionOr<bool> internal_delete(PropertyKey const&) override;
|
||||||
virtual ThrowCompletionOr<MarkedVector<Value>> internal_own_property_keys() const override;
|
virtual ThrowCompletionOr<MarkedVector<Value>> internal_own_property_keys() const override;
|
||||||
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedVector<Value> arguments_list) override;
|
||||||
virtual ThrowCompletionOr<Object*> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
virtual ThrowCompletionOr<NonnullGCPtr<Object>> internal_construct(MarkedVector<Value> arguments_list, FunctionObject& new_target) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ProxyObject(Object& target, Object& handler, Object& prototype);
|
ProxyObject(Object& target, Object& handler, Object& prototype);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue