/* * Copyright (c) 2021-2023, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace JS::JIT { class NativeExecutable; } namespace JS::Bytecode { struct PropertyLookupCache { static FlatPtr shape_offset() { return OFFSET_OF(PropertyLookupCache, shape); } static FlatPtr property_offset_offset() { return OFFSET_OF(PropertyLookupCache, property_offset); } static FlatPtr unique_shape_serial_number_offset() { return OFFSET_OF(PropertyLookupCache, unique_shape_serial_number); } WeakPtr shape; Optional property_offset; u64 unique_shape_serial_number { 0 }; }; struct GlobalVariableCache : public PropertyLookupCache { u64 environment_serial_number { 0 }; }; using EnvironmentVariableCache = Optional; struct SourceRecord { u32 source_start_offset {}; u32 source_end_offset {}; }; class Executable final : public RefCounted { public: Executable( NonnullOwnPtr, NonnullOwnPtr, NonnullOwnPtr, NonnullRefPtr, size_t number_of_property_lookup_caches, size_t number_of_global_variable_caches, size_t number_of_environment_variable_caches, size_t number_of_registers, Vector>, bool is_strict_mode); ~Executable(); DeprecatedFlyString name; Vector property_lookup_caches; Vector global_variable_caches; Vector environment_variable_caches; Vector> basic_blocks; NonnullOwnPtr string_table; NonnullOwnPtr identifier_table; NonnullOwnPtr regex_table; NonnullRefPtr source_code; size_t number_of_registers { 0 }; bool is_strict_mode { false }; DeprecatedString const& get_string(StringTableIndex index) const { return string_table->get(index); } DeprecatedFlyString const& get_identifier(IdentifierTableIndex index) const { return identifier_table->get(index); } void dump() const; JIT::NativeExecutable const* get_or_create_native_executable(); JIT::NativeExecutable const* native_executable() const { return m_native_executable; } private: OwnPtr m_native_executable; bool m_did_try_jitting { false }; }; }