mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:52:45 +00:00 
			
		
		
		
	LibJS/JIT: Don't keep trying to JIT unsupported bytecode executables
We now only try jitting each Bytecode::Executable once, and then cache the resulting NativeExecutable.
This commit is contained in:
		
							parent
							
								
									6a6ef6670c
								
							
						
					
					
						commit
						310bcd4717
					
				
					 5 changed files with 21 additions and 3 deletions
				
			
		|  | @ -7,6 +7,7 @@ | ||||||
| #include <LibJS/Bytecode/BasicBlock.h> | #include <LibJS/Bytecode/BasicBlock.h> | ||||||
| #include <LibJS/Bytecode/Executable.h> | #include <LibJS/Bytecode/Executable.h> | ||||||
| #include <LibJS/Bytecode/RegexTable.h> | #include <LibJS/Bytecode/RegexTable.h> | ||||||
|  | #include <LibJS/JIT/Compiler.h> | ||||||
| #include <LibJS/SourceCode.h> | #include <LibJS/SourceCode.h> | ||||||
| 
 | 
 | ||||||
| namespace JS::Bytecode { | namespace JS::Bytecode { | ||||||
|  | @ -52,4 +53,13 @@ void Executable::dump() const | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | JIT::NativeExecutable const* Executable::get_or_create_native_executable() | ||||||
|  | { | ||||||
|  |     if (!m_did_try_jitting) { | ||||||
|  |         m_did_try_jitting = true; | ||||||
|  |         m_native_executable = JIT::Compiler::compile(*this); | ||||||
|  |     } | ||||||
|  |     return m_native_executable; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -8,10 +8,12 @@ | ||||||
| 
 | 
 | ||||||
| #include <AK/DeprecatedFlyString.h> | #include <AK/DeprecatedFlyString.h> | ||||||
| #include <AK/NonnullOwnPtr.h> | #include <AK/NonnullOwnPtr.h> | ||||||
|  | #include <AK/OwnPtr.h> | ||||||
| #include <AK/WeakPtr.h> | #include <AK/WeakPtr.h> | ||||||
| #include <LibJS/Bytecode/IdentifierTable.h> | #include <LibJS/Bytecode/IdentifierTable.h> | ||||||
| #include <LibJS/Bytecode/StringTable.h> | #include <LibJS/Bytecode/StringTable.h> | ||||||
| #include <LibJS/Forward.h> | #include <LibJS/Forward.h> | ||||||
|  | #include <LibJS/JIT/NativeExecutable.h> | ||||||
| #include <LibJS/Runtime/EnvironmentCoordinate.h> | #include <LibJS/Runtime/EnvironmentCoordinate.h> | ||||||
| 
 | 
 | ||||||
| namespace JS::Bytecode { | namespace JS::Bytecode { | ||||||
|  | @ -63,6 +65,12 @@ public: | ||||||
|     DeprecatedFlyString const& get_identifier(IdentifierTableIndex index) const { return identifier_table->get(index); } |     DeprecatedFlyString const& get_identifier(IdentifierTableIndex index) const { return identifier_table->get(index); } | ||||||
| 
 | 
 | ||||||
|     void dump() const; |     void dump() const; | ||||||
|  | 
 | ||||||
|  |     JIT::NativeExecutable const* get_or_create_native_executable(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     OwnPtr<JIT::NativeExecutable> m_native_executable; | ||||||
|  |     bool m_did_try_jitting { false }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -351,7 +351,7 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Executable& executa | ||||||
|     else |     else | ||||||
|         push_call_frame(make<CallFrame>(), executable.number_of_registers); |         push_call_frame(make<CallFrame>(), executable.number_of_registers); | ||||||
| 
 | 
 | ||||||
|     if (auto native_executable = JIT::Compiler::compile(executable)) { |     if (auto native_executable = executable.get_or_create_native_executable()) { | ||||||
|         native_executable->run(vm()); |         native_executable->run(vm()); | ||||||
| 
 | 
 | ||||||
|         for (size_t i = 0; i < vm().running_execution_context().local_variables.size(); ++i) { |         for (size_t i = 0; i < vm().running_execution_context().local_variables.size(); ++i) { | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ NativeExecutable::~NativeExecutable() | ||||||
|     munmap(m_code, m_size); |     munmap(m_code, m_size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void NativeExecutable::run(VM& vm) | void NativeExecutable::run(VM& vm) const | ||||||
| { | { | ||||||
|     typedef void (*JITCode)(VM&, Value* registers, Value* locals); |     typedef void (*JITCode)(VM&, Value* registers, Value* locals); | ||||||
|     ((JITCode)m_code)(vm, |     ((JITCode)m_code)(vm, | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ public: | ||||||
|     NativeExecutable(void* code, size_t size); |     NativeExecutable(void* code, size_t size); | ||||||
|     ~NativeExecutable(); |     ~NativeExecutable(); | ||||||
| 
 | 
 | ||||||
|     void run(VM&); |     void run(VM&) const; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     void* m_code { nullptr }; |     void* m_code { nullptr }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling