mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:52:45 +00:00 
			
		
		
		
	LibJS/JIT: Support the EnterObjectEnvironment bytecode instruction
We can now use `with` statements in jitted code. :^)
This commit is contained in:
		
							parent
							
								
									cfdb8a2756
								
							
						
					
					
						commit
						cb7169d73f
					
				
					 4 changed files with 26 additions and 5 deletions
				
			
		|  | @ -444,6 +444,13 @@ void Interpreter::catch_exception() | |||
|     vm().running_execution_context().lexical_environment = context.lexical_environment; | ||||
| } | ||||
| 
 | ||||
| void Interpreter::enter_object_environment(Object& object) | ||||
| { | ||||
|     auto& old_environment = vm().running_execution_context().lexical_environment; | ||||
|     saved_lexical_environment_stack().append(old_environment); | ||||
|     vm().running_execution_context().lexical_environment = new_object_environment(object, true, old_environment); | ||||
| } | ||||
| 
 | ||||
| ThrowCompletionOr<NonnullRefPtr<Bytecode::Executable>> compile(VM& vm, ASTNode const& node, FunctionKind kind, DeprecatedFlyString const& name) | ||||
| { | ||||
|     auto executable_result = Bytecode::Generator::generate(node, kind); | ||||
|  | @ -743,11 +750,8 @@ ThrowCompletionOr<void> CreateLexicalEnvironment::execute_impl(Bytecode::Interpr | |||
| 
 | ||||
| ThrowCompletionOr<void> EnterObjectEnvironment::execute_impl(Bytecode::Interpreter& interpreter) const | ||||
| { | ||||
|     auto& vm = interpreter.vm(); | ||||
|     auto& old_environment = vm.running_execution_context().lexical_environment; | ||||
|     interpreter.saved_lexical_environment_stack().append(old_environment); | ||||
|     auto object = TRY(interpreter.accumulator().to_object(vm)); | ||||
|     vm.running_execution_context().lexical_environment = new_object_environment(object, true, old_environment); | ||||
|     auto object = TRY(interpreter.accumulator().to_object(interpreter.vm())); | ||||
|     interpreter.enter_object_environment(*object); | ||||
|     return {}; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -76,6 +76,8 @@ public: | |||
|     void leave_unwind_context(); | ||||
|     void catch_exception(); | ||||
| 
 | ||||
|     void enter_object_environment(Object&); | ||||
| 
 | ||||
|     Executable& current_executable() { return *m_current_executable; } | ||||
|     Executable const& current_executable() const { return *m_current_executable; } | ||||
|     BasicBlock const& current_block() const { return *m_current_block; } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling