/* * Copyright (c) 2025, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace JS { class NativeJavaScriptBackedFunction final : public NativeFunction { JS_OBJECT(NativeJavaScriptBackedFunction, NativeFunction); GC_DECLARE_ALLOCATOR(NativeJavaScriptBackedFunction); public: static GC::Ref create(Realm&, FunctionNode const& function_node, PropertyKey const& name, i32 length); virtual ~NativeJavaScriptBackedFunction() override = default; virtual void visit_edges(Visitor&) override; virtual ThrowCompletionOr get_stack_frame_size(size_t& registers_and_constants_and_locals_count, size_t& argument_count) override; virtual ThrowCompletionOr call() override; Bytecode::Executable& bytecode_executable(); FunctionKind kind() const; ThisMode this_mode() const; virtual bool function_environment_needed() const override; virtual size_t function_environment_bindings_count() const override; virtual bool is_strict_mode() const override; private: explicit NativeJavaScriptBackedFunction(GC::Ref shared_function_instance_data, Object& prototype); GC::Ref m_shared_function_instance_data; }; }