/* * Copyright (c) 2020-2022, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace JS { struct ParameterArgumentsAndBody { Vector parameters; String body; }; ThrowCompletionOr extract_parameter_arguments_and_body(VM&, Span arguments); class FunctionConstructor final : public NativeFunction { JS_OBJECT(FunctionConstructor, NativeFunction); GC_DECLARE_ALLOCATOR(FunctionConstructor); public: static ThrowCompletionOr> create_dynamic_function(VM&, FunctionObject& constructor, FunctionObject* new_target, FunctionKind kind, ReadonlySpan parameter_args, String const& body_string); virtual void initialize(Realm&) override; virtual ~FunctionConstructor() override = default; virtual ThrowCompletionOr call() override; virtual ThrowCompletionOr> construct(FunctionObject& new_target) override; private: explicit FunctionConstructor(Realm&); virtual bool has_constructor() const override { return true; } }; }