mirror of
https://github.com/SerenityOS/serenity
synced 2026-05-14 10:56:35 +02:00
The use of extract_parameter_arguments_and_body() here is to make things a little less awkward. If we were to exactly follow spec there would be an awkward handling of the case that no arguments were provided and we needed to provide an empty string. To do this, we would need to either: - Provide an Optional<Value> for bodyString to CreateDynamicFunction - Create a new empty PrimitiveString wrapped in a JS Value. Either case is somewhat awkward. Instead, just refactor this logic outside of CreateDynamicFunction and make the caller do it. Otherwise, this commit prepares for the new definition of HostEnsureCanCompileStrings. (cherry picked from commit 6da0ac3aa71c991e18e96d721b1843c417cdab78)
41 lines
1.2 KiB
C++
41 lines
1.2 KiB
C++
/*
|
|
* Copyright (c) 2020-2022, Linus Groh <linusg@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/Runtime/FunctionKind.h>
|
|
#include <LibJS/Runtime/NativeFunction.h>
|
|
|
|
namespace JS {
|
|
|
|
struct ParameterArgumentsAndBody {
|
|
Vector<String> parameters;
|
|
String body;
|
|
};
|
|
|
|
ThrowCompletionOr<ParameterArgumentsAndBody> extract_parameter_arguments_and_body(VM&, Span<Value> arguments);
|
|
|
|
class FunctionConstructor final : public NativeFunction {
|
|
JS_OBJECT(FunctionConstructor, NativeFunction);
|
|
JS_DECLARE_ALLOCATOR(FunctionConstructor);
|
|
|
|
public:
|
|
static ThrowCompletionOr<NonnullGCPtr<ECMAScriptFunctionObject>> create_dynamic_function(VM&, FunctionObject& constructor, FunctionObject* new_target, FunctionKind kind, ReadonlySpan<String> parameter_args, String const& body_string);
|
|
|
|
virtual void initialize(Realm&) override;
|
|
virtual ~FunctionConstructor() override = default;
|
|
|
|
virtual ThrowCompletionOr<Value> call() override;
|
|
virtual ThrowCompletionOr<NonnullGCPtr<Object>> construct(FunctionObject& new_target) override;
|
|
|
|
private:
|
|
explicit FunctionConstructor(Realm&);
|
|
|
|
virtual bool has_constructor() const override { return true; }
|
|
};
|
|
|
|
}
|