mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2026-04-18 18:00:31 +00:00
Remove CodeGenerationError and make all bytecode generation functions return their results directly instead of wrapping them in CodeGenerationErrorOr. For the few remaining sites where codegen encounters an unimplemented or unexpected AST node, we now use a new emit_todo() helper that emits a NewTypeError + Throw sequence at compile time (preserving the runtime behavior) and then switches to a dead basic block so subsequent codegen for the same function can continue without issue. This allows us to remove error handling from all callers of the bytecode compiler, simplifying the code significantly.
47 lines
1.7 KiB
C++
47 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/Runtime/FunctionObject.h>
|
|
#include <LibJS/Runtime/Realm.h>
|
|
|
|
namespace JS {
|
|
|
|
class WrappedFunction final : public FunctionObject {
|
|
JS_OBJECT(WrappedFunction, FunctionObject);
|
|
GC_DECLARE_ALLOCATOR(WrappedFunction);
|
|
|
|
public:
|
|
static ThrowCompletionOr<GC::Ref<WrappedFunction>> create(Realm&, Realm& caller_realm, FunctionObject& target_function);
|
|
|
|
virtual ~WrappedFunction() = default;
|
|
|
|
virtual ThrowCompletionOr<Value> internal_call(ExecutionContext&, Value this_argument) override;
|
|
|
|
virtual Realm* realm() const override { return m_realm; }
|
|
|
|
FunctionObject const& wrapped_target_function() const { return m_wrapped_target_function; }
|
|
FunctionObject& wrapped_target_function() { return m_wrapped_target_function; }
|
|
|
|
virtual void get_stack_frame_size(size_t& registers_and_locals_count, size_t& constants_count, size_t& argument_count) override;
|
|
|
|
virtual Utf16String name_for_call_stack() const override;
|
|
|
|
private:
|
|
WrappedFunction(Realm&, FunctionObject&, Object& prototype);
|
|
|
|
virtual void visit_edges(Visitor&) override;
|
|
|
|
// Internal Slots of Wrapped Function Exotic Objects, https://tc39.es/proposal-shadowrealm/#table-internal-slots-of-wrapped-function-exotic-objects
|
|
GC::Ref<FunctionObject> m_wrapped_target_function; // [[WrappedTargetFunction]]
|
|
GC::Ref<Realm> m_realm; // [[Realm]]
|
|
};
|
|
|
|
ThrowCompletionOr<Value> ordinary_wrapped_function_call(WrappedFunction&, Value this_argument, Span<Value> arguments_list);
|
|
void prepare_for_wrapped_function_call(WrappedFunction&, ExecutionContext& callee_context);
|
|
|
|
}
|