/* * Copyright (c) 2021-2024, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include namespace JS::Bytecode { struct PropertyLookupCache { WeakPtr shape; Optional property_offset; WeakPtr prototype; WeakPtr prototype_chain_validity; }; struct GlobalVariableCache : public PropertyLookupCache { u64 environment_serial_number { 0 }; Optional environment_binding_index; }; struct SourceRecord { u32 source_start_offset {}; u32 source_end_offset {}; }; class Executable final : public Cell { GC_CELL(Executable, Cell); GC_DECLARE_ALLOCATOR(Executable); public: Executable( Vector bytecode, NonnullOwnPtr, NonnullOwnPtr, NonnullOwnPtr, Vector constants, NonnullRefPtr, size_t number_of_property_lookup_caches, size_t number_of_global_variable_caches, size_t number_of_registers, bool is_strict_mode); virtual ~Executable() override; DeprecatedFlyString name; Vector bytecode; Vector property_lookup_caches; Vector global_variable_caches; NonnullOwnPtr string_table; NonnullOwnPtr identifier_table; NonnullOwnPtr regex_table; Vector constants; NonnullRefPtr source_code; size_t number_of_registers { 0 }; bool is_strict_mode { false }; struct ExceptionHandlers { size_t start_offset; size_t end_offset; Optional handler_offset; Optional finalizer_offset; }; Vector exception_handlers; Vector basic_block_start_offsets; HashMap source_map; Vector local_variable_names; size_t local_index_base { 0 }; Optional length_identifier; ByteString const& get_string(StringTableIndex index) const { return string_table->get(index); } DeprecatedFlyString const& get_identifier(IdentifierTableIndex index) const { return identifier_table->get(index); } Optional get_identifier(Optional const& index) const { if (!index.has_value()) return {}; return get_identifier(*index); } [[nodiscard]] Optional exception_handlers_for_offset(size_t offset) const; [[nodiscard]] UnrealizedSourceRange source_range_at(size_t offset) const; void dump() const; private: virtual void visit_edges(Visitor&) override; }; }