mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 22:02:44 +00:00 
			
		
		
		
	LibJS/Bytecode: Add support for new.target
This commit is contained in:
		
							parent
							
								
									fd235d8a06
								
							
						
					
					
						commit
						eac5534ce4
					
				
					 5 changed files with 46 additions and 0 deletions
				
			
		|  | @ -1866,6 +1866,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual Completion execute(Interpreter&, GlobalObject&) const override; |     virtual Completion execute(Interpreter&, GlobalObject&) const override; | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|  |     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     Type m_type; |     Type m_type; | ||||||
|  |  | ||||||
|  | @ -2031,4 +2031,25 @@ Bytecode::CodeGenerationErrorOr<void> ForOfStatement::generate_bytecode(Bytecode | ||||||
|     return for_in_of_body_evaluation(generator, *this, m_lhs, body(), head_result, loop_end, loop_update); |     return for_in_of_body_evaluation(generator, *this, m_lhs, body(), head_result, loop_end, loop_update); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // 13.3.12.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-meta-properties-runtime-semantics-evaluation
 | ||||||
|  | Bytecode::CodeGenerationErrorOr<void> MetaProperty::generate_bytecode(Bytecode::Generator& generator) const | ||||||
|  | { | ||||||
|  |     // NewTarget : new . target
 | ||||||
|  |     if (m_type == MetaProperty::Type::NewTarget) { | ||||||
|  |         // 1. Return GetNewTarget().
 | ||||||
|  |         generator.emit<Bytecode::Op::GetNewTarget>(); | ||||||
|  |         return {}; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // ImportMeta : import . meta
 | ||||||
|  |     if (m_type == MetaProperty::Type::ImportMeta) { | ||||||
|  |         return Bytecode::CodeGenerationError { | ||||||
|  |             this, | ||||||
|  |             "Unimplemented meta property: import.meta"sv, | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     VERIFY_NOT_REACHED(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ | ||||||
|     O(GetById)                       \ |     O(GetById)                       \ | ||||||
|     O(GetByValue)                    \ |     O(GetByValue)                    \ | ||||||
|     O(GetIterator)                   \ |     O(GetIterator)                   \ | ||||||
|  |     O(GetNewTarget)                  \ | ||||||
|     O(GetObjectPropertyIterator)     \ |     O(GetObjectPropertyIterator)     \ | ||||||
|     O(GetVariable)                   \ |     O(GetVariable)                   \ | ||||||
|     O(GreaterThan)                   \ |     O(GreaterThan)                   \ | ||||||
|  |  | ||||||
|  | @ -358,6 +358,12 @@ ThrowCompletionOr<void> ResolveThisBinding::execute_impl(Bytecode::Interpreter& | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | ThrowCompletionOr<void> GetNewTarget::execute_impl(Bytecode::Interpreter& interpreter) const | ||||||
|  | { | ||||||
|  |     interpreter.accumulator() = interpreter.vm().get_new_target(); | ||||||
|  |     return {}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Jump::replace_references_impl(BasicBlock const& from, BasicBlock const& to) | void Jump::replace_references_impl(BasicBlock const& from, BasicBlock const& to) | ||||||
| { | { | ||||||
|     if (m_true_target.has_value() && &m_true_target->block() == &from) |     if (m_true_target.has_value() && &m_true_target->block() == &from) | ||||||
|  | @ -976,4 +982,9 @@ String ResolveThisBinding::to_string_impl(Bytecode::Executable const&) const | ||||||
|     return "ResolveThisBinding"sv; |     return "ResolveThisBinding"sv; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | String GetNewTarget::to_string_impl(Bytecode::Executable const&) const | ||||||
|  | { | ||||||
|  |     return "GetNewTarget"sv; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -838,6 +838,18 @@ public: | ||||||
|     void replace_references_impl(BasicBlock const&, BasicBlock const&) { } |     void replace_references_impl(BasicBlock const&, BasicBlock const&) { } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | class GetNewTarget final : public Instruction { | ||||||
|  | public: | ||||||
|  |     explicit GetNewTarget() | ||||||
|  |         : Instruction(Type::GetNewTarget) | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ThrowCompletionOr<void> execute_impl(Bytecode::Interpreter&) const; | ||||||
|  |     String to_string_impl(Bytecode::Executable const&) const; | ||||||
|  |     void replace_references_impl(BasicBlock const&, BasicBlock const&) { } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| namespace JS::Bytecode { | namespace JS::Bytecode { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Luke Wilde
						Luke Wilde