| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2024-10-04 13:19:50 +02:00
										 |  |  |  * Copyright (c) 2021-2024, Andreas Kling <andreas@ladybird.org> | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-08 19:23:00 -05:00
										 |  |  | #include <AK/DeprecatedFlyString.h>
 | 
					
						
							| 
									
										
										
										
											2023-10-19 23:18:54 +02:00
										 |  |  | #include <AK/HashMap.h>
 | 
					
						
							| 
									
										
										
										
											2023-03-06 17:39:59 +01:00
										 |  |  | #include <AK/NonnullOwnPtr.h>
 | 
					
						
							| 
									
										
										
										
											2023-10-20 12:21:30 +02:00
										 |  |  | #include <AK/OwnPtr.h>
 | 
					
						
							| 
									
										
										
										
											2023-07-08 17:43:26 +02:00
										 |  |  | #include <AK/WeakPtr.h>
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | #include <LibGC/CellAllocator.h>
 | 
					
						
							| 
									
										
										
										
											2021-10-24 15:34:30 +02:00
										 |  |  | #include <LibJS/Bytecode/IdentifierTable.h>
 | 
					
						
							| 
									
										
										
										
											2023-10-19 23:18:54 +02:00
										 |  |  | #include <LibJS/Bytecode/Label.h>
 | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  | #include <LibJS/Bytecode/StringTable.h>
 | 
					
						
							| 
									
										
										
										
											2023-10-08 12:25:58 +02:00
										 |  |  | #include <LibJS/Forward.h>
 | 
					
						
							| 
									
										
										
										
											2023-11-27 13:23:59 +01:00
										 |  |  | #include <LibJS/Heap/Cell.h>
 | 
					
						
							| 
									
										
										
										
											2023-10-26 10:39:40 +02:00
										 |  |  | #include <LibJS/Runtime/EnvironmentCoordinate.h>
 | 
					
						
							| 
									
										
										
										
											2024-05-06 06:44:08 +02:00
										 |  |  | #include <LibJS/SourceRange.h>
 | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace JS::Bytecode { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-08 17:43:26 +02:00
										 |  |  | struct PropertyLookupCache { | 
					
						
							|  |  |  |     WeakPtr<Shape> shape; | 
					
						
							|  |  |  |     Optional<u32> property_offset; | 
					
						
							| 
									
										
										
										
											2024-05-04 15:48:23 +02:00
										 |  |  |     WeakPtr<Object> prototype; | 
					
						
							|  |  |  |     WeakPtr<PrototypeChainValidity> prototype_chain_validity; | 
					
						
							| 
									
										
										
										
											2023-07-08 17:43:26 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 04:06:59 +02:00
										 |  |  | struct GlobalVariableCache : public PropertyLookupCache { | 
					
						
							|  |  |  |     u64 environment_serial_number { 0 }; | 
					
						
							| 
									
										
										
										
											2024-07-07 10:04:45 +02:00
										 |  |  |     Optional<u32> environment_binding_index; | 
					
						
							| 
									
										
										
										
											2023-07-12 04:06:59 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-01 16:53:55 +02:00
										 |  |  | struct SourceRecord { | 
					
						
							|  |  |  |     u32 source_start_offset {}; | 
					
						
							|  |  |  |     u32 source_end_offset {}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-27 13:23:59 +01:00
										 |  |  | class Executable final : public Cell { | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC_CELL(Executable, Cell); | 
					
						
							|  |  |  |     GC_DECLARE_ALLOCATOR(Executable); | 
					
						
							| 
									
										
										
										
											2023-11-27 13:23:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-03 08:18:10 +02:00
										 |  |  | public: | 
					
						
							|  |  |  |     Executable( | 
					
						
							| 
									
										
										
										
											2024-05-06 06:44:08 +02:00
										 |  |  |         Vector<u8> bytecode, | 
					
						
							| 
									
										
										
										
											2023-10-03 08:18:10 +02:00
										 |  |  |         NonnullOwnPtr<IdentifierTable>, | 
					
						
							|  |  |  |         NonnullOwnPtr<StringTable>, | 
					
						
							|  |  |  |         NonnullOwnPtr<RegexTable>, | 
					
						
							| 
									
										
										
										
											2024-02-02 09:52:25 +01:00
										 |  |  |         Vector<Value> constants, | 
					
						
							| 
									
										
										
										
											2023-10-03 08:18:10 +02:00
										 |  |  |         NonnullRefPtr<SourceCode const>, | 
					
						
							|  |  |  |         size_t number_of_property_lookup_caches, | 
					
						
							|  |  |  |         size_t number_of_global_variable_caches, | 
					
						
							|  |  |  |         size_t number_of_registers, | 
					
						
							|  |  |  |         bool is_strict_mode); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-27 13:23:59 +01:00
										 |  |  |     virtual ~Executable() override; | 
					
						
							| 
									
										
										
										
											2023-10-03 08:18:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-08 19:23:00 -05:00
										 |  |  |     DeprecatedFlyString name; | 
					
						
							| 
									
										
										
										
											2024-05-06 06:44:08 +02:00
										 |  |  |     Vector<u8> bytecode; | 
					
						
							| 
									
										
										
										
											2023-07-08 17:43:26 +02:00
										 |  |  |     Vector<PropertyLookupCache> property_lookup_caches; | 
					
						
							| 
									
										
										
										
											2023-07-12 04:06:59 +02:00
										 |  |  |     Vector<GlobalVariableCache> global_variable_caches; | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  |     NonnullOwnPtr<StringTable> string_table; | 
					
						
							| 
									
										
										
										
											2021-10-24 15:34:30 +02:00
										 |  |  |     NonnullOwnPtr<IdentifierTable> identifier_table; | 
					
						
							| 
									
										
										
										
											2023-07-13 10:49:07 +02:00
										 |  |  |     NonnullOwnPtr<RegexTable> regex_table; | 
					
						
							| 
									
										
										
										
											2024-02-02 09:52:25 +01:00
										 |  |  |     Vector<Value> constants; | 
					
						
							| 
									
										
										
										
											2023-10-19 23:18:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-01 16:53:55 +02:00
										 |  |  |     NonnullRefPtr<SourceCode const> source_code; | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  |     size_t number_of_registers { 0 }; | 
					
						
							| 
									
										
										
										
											2022-07-17 18:56:36 +01:00
										 |  |  |     bool is_strict_mode { false }; | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 06:44:08 +02:00
										 |  |  |     struct ExceptionHandlers { | 
					
						
							|  |  |  |         size_t start_offset; | 
					
						
							|  |  |  |         size_t end_offset; | 
					
						
							|  |  |  |         Optional<size_t> handler_offset; | 
					
						
							|  |  |  |         Optional<size_t> finalizer_offset; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Vector<ExceptionHandlers> exception_handlers; | 
					
						
							|  |  |  |     Vector<size_t> basic_block_start_offsets; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 07:51:14 +02:00
										 |  |  |     HashMap<size_t, SourceRecord> source_map; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-13 21:19:06 +02:00
										 |  |  |     Vector<DeprecatedFlyString> local_variable_names; | 
					
						
							|  |  |  |     size_t local_index_base { 0 }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-09 11:37:06 +02:00
										 |  |  |     Optional<IdentifierTableIndex> length_identifier; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-16 17:49:34 +03:30
										 |  |  |     ByteString const& get_string(StringTableIndex index) const { return string_table->get(index); } | 
					
						
							| 
									
										
										
										
											2023-01-08 19:23:00 -05:00
										 |  |  |     DeprecatedFlyString const& get_identifier(IdentifierTableIndex index) const { return identifier_table->get(index); } | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-29 11:26:10 -04:00
										 |  |  |     Optional<DeprecatedFlyString const&> get_identifier(Optional<IdentifierTableIndex> const& index) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!index.has_value()) | 
					
						
							|  |  |  |             return {}; | 
					
						
							|  |  |  |         return get_identifier(*index); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 06:44:08 +02:00
										 |  |  |     [[nodiscard]] Optional<ExceptionHandlers const&> exception_handlers_for_offset(size_t offset) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [[nodiscard]] UnrealizedSourceRange source_range_at(size_t offset) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  |     void dump() const; | 
					
						
							| 
									
										
										
										
											2024-03-03 11:34:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     virtual void visit_edges(Visitor&) override; | 
					
						
							| 
									
										
										
										
											2021-10-24 13:30:49 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |