mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:22:45 +00:00 
			
		
		
		
	LibJS/Bytecode: Add Operand in/out to all the bytecode codegen helpers
This is pure prep work for refactoring the bytecode to use more operands instead of only registers. generate_bytecode() virtuals now return an Optional<Operand>, and the idea is to return an Operand referring to the value produced by this AST node. They also take an Optional<Operand> "preferred_dst" input. This is intended to communicate the caller's preference for an output operand, if any. This will be used to elide temporaries when we can store the result directly in a local, for example.
This commit is contained in:
		
							parent
							
								
									e46de4eb59
								
							
						
					
					
						commit
						7f1a62a1d3
					
				
					 4 changed files with 375 additions and 370 deletions
				
			
		|  | @ -1,5 +1,5 @@ | ||||||
| /*
 | /*
 | ||||||
|  * Copyright (c) 2020-2023, Andreas Kling <kling@serenityos.org> |  * Copyright (c) 2020-2024, Andreas Kling <kling@serenityos.org> | ||||||
|  * Copyright (c) 2020-2022, Linus Groh <linusg@serenityos.org> |  * Copyright (c) 2020-2022, Linus Groh <linusg@serenityos.org> | ||||||
|  * Copyright (c) 2021-2022, David Tuin <davidot@serenityos.org> |  * Copyright (c) 2021-2022, David Tuin <davidot@serenityos.org> | ||||||
|  * |  * | ||||||
|  | @ -18,6 +18,7 @@ | ||||||
| #include <LibJS/Bytecode/CodeGenerationError.h> | #include <LibJS/Bytecode/CodeGenerationError.h> | ||||||
| #include <LibJS/Bytecode/Executable.h> | #include <LibJS/Bytecode/Executable.h> | ||||||
| #include <LibJS/Bytecode/IdentifierTable.h> | #include <LibJS/Bytecode/IdentifierTable.h> | ||||||
|  | #include <LibJS/Bytecode/Operand.h> | ||||||
| #include <LibJS/Forward.h> | #include <LibJS/Forward.h> | ||||||
| #include <LibJS/Heap/Handle.h> | #include <LibJS/Heap/Handle.h> | ||||||
| #include <LibJS/Runtime/ClassFieldDefinition.h> | #include <LibJS/Runtime/ClassFieldDefinition.h> | ||||||
|  | @ -54,7 +55,7 @@ public: | ||||||
|     // NOTE: This is here to stop ASAN complaining about mismatch between new/delete sizes in ASTNodeWithTailArray.
 |     // NOTE: This is here to stop ASAN complaining about mismatch between new/delete sizes in ASTNodeWithTailArray.
 | ||||||
|     void operator delete(void* ptr) { ::operator delete(ptr); } |     void operator delete(void* ptr) { ::operator delete(ptr); } | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const; | ||||||
|     virtual void dump(int indent) const; |     virtual void dump(int indent) const; | ||||||
| 
 | 
 | ||||||
|     [[nodiscard]] SourceRange source_range() const; |     [[nodiscard]] SourceRange source_range() const; | ||||||
|  | @ -173,8 +174,8 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const; | ||||||
| 
 | 
 | ||||||
|     DeprecatedFlyString const& label() const { return m_label; } |     DeprecatedFlyString const& label() const { return m_label; } | ||||||
|     DeprecatedFlyString& label() { return m_label; } |     DeprecatedFlyString& label() { return m_label; } | ||||||
|  | @ -202,7 +203,7 @@ class IterationStatement : public Statement { | ||||||
| public: | public: | ||||||
|     using Statement::Statement; |     using Statement::Statement; | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual bool is_iteration_statement() const final { return true; } |     virtual bool is_iteration_statement() const final { return true; } | ||||||
|  | @ -214,7 +215,7 @@ public: | ||||||
|         : Statement(move(source_range)) |         : Statement(move(source_range)) | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class ErrorStatement final : public Statement { | class ErrorStatement final : public Statement { | ||||||
|  | @ -234,7 +235,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     Expression const& expression() const { return m_expression; } |     Expression const& expression() const { return m_expression; } | ||||||
| 
 | 
 | ||||||
|  | @ -297,7 +298,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     Vector<NonnullRefPtr<Statement const>> const& children() const { return m_children; } |     Vector<NonnullRefPtr<Statement const>> const& children() const { return m_children; } | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     void add_var_scoped_declaration(NonnullRefPtr<Declaration const> variables); |     void add_var_scoped_declaration(NonnullRefPtr<Declaration const> variables); | ||||||
|     void add_lexical_declaration(NonnullRefPtr<Declaration const> variables); |     void add_lexical_declaration(NonnullRefPtr<Declaration const> variables); | ||||||
|  | @ -385,7 +386,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     bool has_bound_name(DeprecatedFlyString const& name) const; |     bool has_bound_name(DeprecatedFlyString const& name) const; | ||||||
|     Vector<ImportEntry> const& entries() const { return m_entries; } |     Vector<ImportEntry> const& entries() const { return m_entries; } | ||||||
|  | @ -482,7 +483,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     bool has_export(DeprecatedFlyString const& export_name) const; |     bool has_export(DeprecatedFlyString const& export_name) const; | ||||||
| 
 | 
 | ||||||
|  | @ -670,7 +671,7 @@ public: | ||||||
|     void set_is_global() { m_is_global = true; } |     void set_is_global() { m_is_global = true; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual bool is_identifier() const override { return true; } |     virtual bool is_identifier() const override { return true; } | ||||||
|  | @ -752,7 +753,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     ThrowCompletionOr<void> for_each_bound_identifier(ThrowCompletionOrVoidCallback<Identifier const&>&&) const override; |     ThrowCompletionOr<void> for_each_bound_identifier(ThrowCompletionOrVoidCallback<Identifier const&>&&) const override; | ||||||
| 
 | 
 | ||||||
|  | @ -778,8 +779,8 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode_with_lhs_name(Bytecode::Generator&, Optional<Bytecode::IdentifierTableIndex> lhs_name) const; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode_with_lhs_name(Bytecode::Generator&, Optional<Bytecode::IdentifierTableIndex> lhs_name, Optional<Bytecode::Operand> preferred_dst = {}) const; | ||||||
| 
 | 
 | ||||||
|     bool has_name() const { return !name().is_empty(); } |     bool has_name() const { return !name().is_empty(); } | ||||||
| 
 | 
 | ||||||
|  | @ -810,7 +811,7 @@ public: | ||||||
|     bool is_yield_from() const { return m_is_yield_from; } |     bool is_yield_from() const { return m_is_yield_from; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     RefPtr<Expression const> m_argument; |     RefPtr<Expression const> m_argument; | ||||||
|  | @ -826,7 +827,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_argument; |     NonnullRefPtr<Expression const> m_argument; | ||||||
|  | @ -843,7 +844,7 @@ public: | ||||||
|     Expression const* argument() const { return m_argument; } |     Expression const* argument() const { return m_argument; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     RefPtr<Expression const> m_argument; |     RefPtr<Expression const> m_argument; | ||||||
|  | @ -864,7 +865,7 @@ public: | ||||||
|     Statement const* alternate() const { return m_alternate; } |     Statement const* alternate() const { return m_alternate; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_predicate; |     NonnullRefPtr<Expression const> m_predicate; | ||||||
|  | @ -885,8 +886,8 @@ public: | ||||||
|     Statement const& body() const { return *m_body; } |     Statement const& body() const { return *m_body; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_test; |     NonnullRefPtr<Expression const> m_test; | ||||||
|  | @ -906,8 +907,8 @@ public: | ||||||
|     Statement const& body() const { return *m_body; } |     Statement const& body() const { return *m_body; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_test; |     NonnullRefPtr<Expression const> m_test; | ||||||
|  | @ -927,7 +928,7 @@ public: | ||||||
|     Statement const& body() const { return *m_body; } |     Statement const& body() const { return *m_body; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_object; |     NonnullRefPtr<Expression const> m_object; | ||||||
|  | @ -951,8 +952,8 @@ public: | ||||||
|     Statement const& body() const { return *m_body; } |     Statement const& body() const { return *m_body; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     RefPtr<ASTNode const> m_init; |     RefPtr<ASTNode const> m_init; | ||||||
|  | @ -975,8 +976,8 @@ public: | ||||||
|     Expression const& rhs() const { return *m_rhs; } |     Expression const& rhs() const { return *m_rhs; } | ||||||
|     Statement const& body() const { return *m_body; } |     Statement const& body() const { return *m_body; } | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  | @ -999,8 +1000,8 @@ public: | ||||||
|     Expression const& rhs() const { return *m_rhs; } |     Expression const& rhs() const { return *m_rhs; } | ||||||
|     Statement const& body() const { return *m_body; } |     Statement const& body() const { return *m_body; } | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  | @ -1019,8 +1020,8 @@ public: | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  | @ -1065,7 +1066,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     BinaryOp m_op; |     BinaryOp m_op; | ||||||
|  | @ -1090,7 +1091,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     LogicalOp m_op; |     LogicalOp m_op; | ||||||
|  | @ -1118,7 +1119,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     UnaryOp m_op; |     UnaryOp m_op; | ||||||
|  | @ -1135,7 +1136,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     Vector<NonnullRefPtr<Expression const>> m_expressions; |     Vector<NonnullRefPtr<Expression const>> m_expressions; | ||||||
|  | @ -1161,7 +1162,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     virtual Value value() const override { return Value(m_value); } |     virtual Value value() const override { return Value(m_value); } | ||||||
| 
 | 
 | ||||||
|  | @ -1178,7 +1179,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     virtual Value value() const override { return m_value; } |     virtual Value value() const override { return m_value; } | ||||||
| 
 | 
 | ||||||
|  | @ -1195,7 +1196,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     ByteString m_value; |     ByteString m_value; | ||||||
|  | @ -1210,7 +1211,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     StringView value() const { return m_value; } |     StringView value() const { return m_value; } | ||||||
| 
 | 
 | ||||||
|  | @ -1228,7 +1229,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     virtual Value value() const override { return js_null(); } |     virtual Value value() const override { return js_null(); } | ||||||
| }; | }; | ||||||
|  | @ -1246,7 +1247,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     regex::Parser::Result const& parsed_regex() const { return m_parsed_regex; } |     regex::Parser::Result const& parsed_regex() const { return m_parsed_regex; } | ||||||
|     ByteString const& parsed_pattern() const { return m_parsed_pattern; } |     ByteString const& parsed_pattern() const { return m_parsed_pattern; } | ||||||
|  | @ -1391,7 +1392,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     virtual bool is_super_expression() const override { return true; } |     virtual bool is_super_expression() const override { return true; } | ||||||
| }; | }; | ||||||
|  | @ -1414,8 +1415,8 @@ public: | ||||||
|     RefPtr<FunctionExpression const> constructor() const { return m_constructor; } |     RefPtr<FunctionExpression const> constructor() const { return m_constructor; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode_with_lhs_name(Bytecode::Generator&, Optional<Bytecode::IdentifierTableIndex> lhs_name) const; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode_with_lhs_name(Bytecode::Generator&, Optional<Bytecode::IdentifierTableIndex> lhs_name, Optional<Bytecode::Operand> preferred_dst = {}) const; | ||||||
| 
 | 
 | ||||||
|     bool has_name() const { return m_name; } |     bool has_name() const { return m_name; } | ||||||
| 
 | 
 | ||||||
|  | @ -1443,7 +1444,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     ThrowCompletionOr<void> for_each_bound_identifier(ThrowCompletionOrVoidCallback<Identifier const&>&&) const override; |     ThrowCompletionOr<void> for_each_bound_identifier(ThrowCompletionOrVoidCallback<Identifier const&>&&) const override; | ||||||
| 
 | 
 | ||||||
|  | @ -1471,7 +1472,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int) const override; |     virtual void dump(int) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_expression; |     NonnullRefPtr<Expression const> m_expression; | ||||||
|  | @ -1487,7 +1488,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_target; |     NonnullRefPtr<Expression const> m_target; | ||||||
|  | @ -1500,7 +1501,7 @@ public: | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct CallExpressionArgument { | struct CallExpressionArgument { | ||||||
|  | @ -1530,7 +1531,7 @@ public: | ||||||
|     static NonnullRefPtr<CallExpression> create(SourceRange, NonnullRefPtr<Expression const> callee, ReadonlySpan<Argument> arguments, InvocationStyleEnum invocation_style, InsideParenthesesEnum inside_parens); |     static NonnullRefPtr<CallExpression> create(SourceRange, NonnullRefPtr<Expression const> callee, ReadonlySpan<Argument> arguments, InvocationStyleEnum invocation_style, InsideParenthesesEnum inside_parens); | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     Expression const& callee() const { return m_callee; } |     Expression const& callee() const { return m_callee; } | ||||||
| 
 | 
 | ||||||
|  | @ -1598,7 +1599,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     Vector<CallExpression::Argument> const m_arguments; |     Vector<CallExpression::Argument> const m_arguments; | ||||||
|  | @ -1643,7 +1644,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     AssignmentOp m_op; |     AssignmentOp m_op; | ||||||
|  | @ -1667,7 +1668,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual bool is_update_expression() const override { return true; } |     virtual bool is_update_expression() const override { return true; } | ||||||
|  | @ -1727,7 +1728,7 @@ public: | ||||||
|     DeclarationKind declaration_kind() const { return m_declaration_kind; } |     DeclarationKind declaration_kind() const { return m_declaration_kind; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     Vector<NonnullRefPtr<VariableDeclarator const>> const& declarations() const { return m_declarations; } |     Vector<NonnullRefPtr<VariableDeclarator const>> const& declarations() const { return m_declarations; } | ||||||
| 
 | 
 | ||||||
|  | @ -1813,7 +1814,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual bool is_object_expression() const override { return true; } |     virtual bool is_object_expression() const override { return true; } | ||||||
|  | @ -1832,7 +1833,7 @@ public: | ||||||
|     Vector<RefPtr<Expression const>> const& elements() const { return m_elements; } |     Vector<RefPtr<Expression const>> const& elements() const { return m_elements; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual bool is_array_expression() const override { return true; } |     virtual bool is_array_expression() const override { return true; } | ||||||
|  | @ -1856,7 +1857,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     Vector<NonnullRefPtr<Expression const>> const& expressions() const { return m_expressions; } |     Vector<NonnullRefPtr<Expression const>> const& expressions() const { return m_expressions; } | ||||||
|     Vector<NonnullRefPtr<Expression const>> const& raw_strings() const { return m_raw_strings; } |     Vector<NonnullRefPtr<Expression const>> const& raw_strings() const { return m_raw_strings; } | ||||||
|  | @ -1876,7 +1877,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> const m_tag; |     NonnullRefPtr<Expression const> const m_tag; | ||||||
|  | @ -1894,7 +1895,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     bool is_computed() const { return m_computed; } |     bool is_computed() const { return m_computed; } | ||||||
|     Expression const& object() const { return *m_object; } |     Expression const& object() const { return *m_object; } | ||||||
|  | @ -1946,7 +1947,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     Expression const& base() const { return *m_base; } |     Expression const& base() const { return *m_base; } | ||||||
|     Vector<Reference> const& references() const { return m_references; } |     Vector<Reference> const& references() const { return m_references; } | ||||||
|  | @ -1970,7 +1971,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     Type m_type; |     Type m_type; | ||||||
|  | @ -1986,7 +1987,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual bool is_import_call() const override { return true; } |     virtual bool is_import_call() const override { return true; } | ||||||
|  | @ -2006,7 +2007,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_test; |     NonnullRefPtr<Expression const> m_test; | ||||||
|  | @ -2055,7 +2056,7 @@ public: | ||||||
|     BlockStatement const* finalizer() const { return m_finalizer; } |     BlockStatement const* finalizer() const { return m_finalizer; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<BlockStatement const> m_block; |     NonnullRefPtr<BlockStatement const> m_block; | ||||||
|  | @ -2074,7 +2075,7 @@ public: | ||||||
|     Expression const& argument() const { return m_argument; } |     Expression const& argument() const { return m_argument; } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     NonnullRefPtr<Expression const> m_argument; |     NonnullRefPtr<Expression const> m_argument; | ||||||
|  | @ -2105,8 +2106,8 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual void dump(int indent) const override; |     virtual void dump(int indent) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&, Optional<Bytecode::Operand> preferred_dst = {}) const; | ||||||
| 
 | 
 | ||||||
|     void add_case(NonnullRefPtr<SwitchCase const> switch_case) { m_cases.append(move(switch_case)); } |     void add_case(NonnullRefPtr<SwitchCase const> switch_case) { m_cases.append(move(switch_case)); } | ||||||
| 
 | 
 | ||||||
|  | @ -2124,7 +2125,7 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     DeprecatedFlyString const& target_label() const { return m_target_label; } |     DeprecatedFlyString const& target_label() const { return m_target_label; } | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     DeprecatedFlyString m_target_label; |     DeprecatedFlyString m_target_label; | ||||||
|  | @ -2138,7 +2139,7 @@ public: | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| 
 | 
 | ||||||
|     DeprecatedFlyString const& target_label() const { return m_target_label; } |     DeprecatedFlyString const& target_label() const { return m_target_label; } | ||||||
| 
 | 
 | ||||||
|  | @ -2153,7 +2154,7 @@ public: | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; |     virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class SyntheticReferenceExpression final : public Expression { | class SyntheticReferenceExpression final : public Expression { | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -4,6 +4,8 @@ | ||||||
|  * SPDX-License-Identifier: BSD-2-Clause |  * SPDX-License-Identifier: BSD-2-Clause | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #define FIXME_NEWBC (void) | ||||||
|  | 
 | ||||||
| #include <AK/TemporaryChange.h> | #include <AK/TemporaryChange.h> | ||||||
| #include <LibJS/AST.h> | #include <LibJS/AST.h> | ||||||
| #include <LibJS/Bytecode/BasicBlock.h> | #include <LibJS/Bytecode/BasicBlock.h> | ||||||
|  | @ -36,7 +38,7 @@ CodeGenerationErrorOr<NonnullGCPtr<Executable>> Generator::generate(VM& vm, ASTN | ||||||
|         // NOTE: This doesn't have to handle received throw/return completions, as GeneratorObject::resume_abrupt
 |         // NOTE: This doesn't have to handle received throw/return completions, as GeneratorObject::resume_abrupt
 | ||||||
|         //       will not enter the generator from the SuspendedStart state and immediately completes the generator.
 |         //       will not enter the generator from the SuspendedStart state and immediately completes the generator.
 | ||||||
|     } |     } | ||||||
|     TRY(node.generate_bytecode(generator)); |     FIXME_NEWBC TRY(node.generate_bytecode(generator)); | ||||||
|     if (generator.is_in_generator_or_async_function()) { |     if (generator.is_in_generator_or_async_function()) { | ||||||
|         // Terminate all unterminated blocks with yield return
 |         // Terminate all unterminated blocks with yield return
 | ||||||
|         for (auto& block : generator.m_root_basic_blocks) { |         for (auto& block : generator.m_root_basic_blocks) { | ||||||
|  | @ -184,7 +186,7 @@ CodeGenerationErrorOr<Generator::ReferenceRegisters> Generator::emit_super_refer | ||||||
|         // SuperProperty : super [ Expression ]
 |         // SuperProperty : super [ Expression ]
 | ||||||
|         // 3. Let propertyNameReference be ? Evaluation of Expression.
 |         // 3. Let propertyNameReference be ? Evaluation of Expression.
 | ||||||
|         // 4. Let propertyNameValue be ? GetValue(propertyNameReference).
 |         // 4. Let propertyNameValue be ? GetValue(propertyNameReference).
 | ||||||
|         TRY(expression.property().generate_bytecode(*this)); |         FIXME_NEWBC TRY(expression.property().generate_bytecode(*this)); | ||||||
|         computed_property_value_register = allocate_register(); |         computed_property_value_register = allocate_register(); | ||||||
|         emit<Bytecode::Op::Store>(*computed_property_value_register); |         emit<Bytecode::Op::Store>(*computed_property_value_register); | ||||||
|     } |     } | ||||||
|  | @ -211,7 +213,7 @@ CodeGenerationErrorOr<Optional<Generator::ReferenceRegisters>> Generator::emit_l | ||||||
| { | { | ||||||
|     if (is<Identifier>(node)) { |     if (is<Identifier>(node)) { | ||||||
|         auto& identifier = static_cast<Identifier const&>(node); |         auto& identifier = static_cast<Identifier const&>(node); | ||||||
|         TRY(identifier.generate_bytecode(*this)); |         FIXME_NEWBC TRY(identifier.generate_bytecode(*this)); | ||||||
|         return Optional<ReferenceRegisters> {}; |         return Optional<ReferenceRegisters> {}; | ||||||
|     } |     } | ||||||
|     if (is<MemberExpression>(node)) { |     if (is<MemberExpression>(node)) { | ||||||
|  | @ -234,12 +236,12 @@ CodeGenerationErrorOr<Optional<Generator::ReferenceRegisters>> Generator::emit_l | ||||||
| 
 | 
 | ||||||
|             return super_reference; |             return super_reference; | ||||||
|         } else { |         } else { | ||||||
|             TRY(expression.object().generate_bytecode(*this)); |             FIXME_NEWBC TRY(expression.object().generate_bytecode(*this)); | ||||||
|             if (expression.is_computed()) { |             if (expression.is_computed()) { | ||||||
|                 auto object_reg = allocate_register(); |                 auto object_reg = allocate_register(); | ||||||
|                 emit<Bytecode::Op::Store>(object_reg); |                 emit<Bytecode::Op::Store>(object_reg); | ||||||
| 
 | 
 | ||||||
|                 TRY(expression.property().generate_bytecode(*this)); |                 FIXME_NEWBC TRY(expression.property().generate_bytecode(*this)); | ||||||
|                 Optional<Register> property_reg {}; |                 Optional<Register> property_reg {}; | ||||||
|                 if (collect_registers == CollectRegisters::Yes) { |                 if (collect_registers == CollectRegisters::Yes) { | ||||||
|                     property_reg = allocate_register(); |                     property_reg = allocate_register(); | ||||||
|  | @ -275,12 +277,12 @@ CodeGenerationErrorOr<Optional<Generator::ReferenceRegisters>> Generator::emit_l | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CodeGenerationErrorOr<void> Generator::emit_store_to_reference(JS::ASTNode const& node) | CodeGenerationErrorOr<Optional<Operand>> Generator::emit_store_to_reference(JS::ASTNode const& node) | ||||||
| { | { | ||||||
|     if (is<Identifier>(node)) { |     if (is<Identifier>(node)) { | ||||||
|         auto& identifier = static_cast<Identifier const&>(node); |         auto& identifier = static_cast<Identifier const&>(node); | ||||||
|         emit_set_variable(identifier); |         emit_set_variable(identifier); | ||||||
|         return {}; |         return Optional<Operand> {}; | ||||||
|     } |     } | ||||||
|     if (is<MemberExpression>(node)) { |     if (is<MemberExpression>(node)) { | ||||||
|         // NOTE: The value is in the accumulator, so we have to store that away first.
 |         // NOTE: The value is in the accumulator, so we have to store that away first.
 | ||||||
|  | @ -305,13 +307,13 @@ CodeGenerationErrorOr<void> Generator::emit_store_to_reference(JS::ASTNode const | ||||||
|                 emit<Bytecode::Op::PutByIdWithThis>(super_reference.base, super_reference.this_value, identifier_table_ref, Bytecode::Op::PropertyKind::KeyValue, next_property_lookup_cache()); |                 emit<Bytecode::Op::PutByIdWithThis>(super_reference.base, super_reference.this_value, identifier_table_ref, Bytecode::Op::PropertyKind::KeyValue, next_property_lookup_cache()); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             TRY(expression.object().generate_bytecode(*this)); |             FIXME_NEWBC TRY(expression.object().generate_bytecode(*this)); | ||||||
| 
 | 
 | ||||||
|             auto object_reg = allocate_register(); |             auto object_reg = allocate_register(); | ||||||
|             emit<Bytecode::Op::Store>(object_reg); |             emit<Bytecode::Op::Store>(object_reg); | ||||||
| 
 | 
 | ||||||
|             if (expression.is_computed()) { |             if (expression.is_computed()) { | ||||||
|                 TRY(expression.property().generate_bytecode(*this)); |                 FIXME_NEWBC TRY(expression.property().generate_bytecode(*this)); | ||||||
|                 auto property_reg = allocate_register(); |                 auto property_reg = allocate_register(); | ||||||
|                 emit<Bytecode::Op::Store>(property_reg); |                 emit<Bytecode::Op::Store>(property_reg); | ||||||
|                 emit<Bytecode::Op::Load>(value_reg); |                 emit<Bytecode::Op::Load>(value_reg); | ||||||
|  | @ -332,7 +334,7 @@ CodeGenerationErrorOr<void> Generator::emit_store_to_reference(JS::ASTNode const | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return {}; |         return Optional<Operand> {}; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return CodeGenerationError { |     return CodeGenerationError { | ||||||
|  | @ -341,16 +343,16 @@ CodeGenerationErrorOr<void> Generator::emit_store_to_reference(JS::ASTNode const | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CodeGenerationErrorOr<void> Generator::emit_store_to_reference(ReferenceRegisters const& reference_registers) | CodeGenerationErrorOr<Optional<Operand>> Generator::emit_store_to_reference(ReferenceRegisters const& reference_registers) | ||||||
| { | { | ||||||
|     if (reference_registers.base == reference_registers.this_value) |     if (reference_registers.base == reference_registers.this_value) | ||||||
|         emit<Bytecode::Op::PutByValue>(reference_registers.base, reference_registers.referenced_name.value()); |         emit<Bytecode::Op::PutByValue>(reference_registers.base, reference_registers.referenced_name.value()); | ||||||
|     else |     else | ||||||
|         emit<Bytecode::Op::PutByValueWithThis>(reference_registers.base, reference_registers.referenced_name.value(), reference_registers.this_value); |         emit<Bytecode::Op::PutByValueWithThis>(reference_registers.base, reference_registers.referenced_name.value(), reference_registers.this_value); | ||||||
|     return {}; |     return Optional<Operand> {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CodeGenerationErrorOr<void> Generator::emit_delete_reference(JS::ASTNode const& node) | CodeGenerationErrorOr<Optional<Operand>> Generator::emit_delete_reference(JS::ASTNode const& node) | ||||||
| { | { | ||||||
|     if (is<Identifier>(node)) { |     if (is<Identifier>(node)) { | ||||||
|         auto& identifier = static_cast<Identifier const&>(node); |         auto& identifier = static_cast<Identifier const&>(node); | ||||||
|  | @ -358,7 +360,7 @@ CodeGenerationErrorOr<void> Generator::emit_delete_reference(JS::ASTNode const& | ||||||
|             emit<Bytecode::Op::LoadImmediate>(Value(false)); |             emit<Bytecode::Op::LoadImmediate>(Value(false)); | ||||||
|         else |         else | ||||||
|             emit<Bytecode::Op::DeleteVariable>(intern_identifier(identifier.string())); |             emit<Bytecode::Op::DeleteVariable>(intern_identifier(identifier.string())); | ||||||
|         return {}; |         return Optional<Operand> {}; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (is<MemberExpression>(node)) { |     if (is<MemberExpression>(node)) { | ||||||
|  | @ -375,16 +377,16 @@ CodeGenerationErrorOr<void> Generator::emit_delete_reference(JS::ASTNode const& | ||||||
|                 emit<Bytecode::Op::DeleteByIdWithThis>(super_reference.this_value, identifier_table_ref); |                 emit<Bytecode::Op::DeleteByIdWithThis>(super_reference.this_value, identifier_table_ref); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return {}; |             return Optional<Operand> {}; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         TRY(expression.object().generate_bytecode(*this)); |         FIXME_NEWBC TRY(expression.object().generate_bytecode(*this)); | ||||||
| 
 | 
 | ||||||
|         if (expression.is_computed()) { |         if (expression.is_computed()) { | ||||||
|             auto object_reg = allocate_register(); |             auto object_reg = allocate_register(); | ||||||
|             emit<Bytecode::Op::Store>(object_reg); |             emit<Bytecode::Op::Store>(object_reg); | ||||||
| 
 | 
 | ||||||
|             TRY(expression.property().generate_bytecode(*this)); |             FIXME_NEWBC TRY(expression.property().generate_bytecode(*this)); | ||||||
|             emit<Bytecode::Op::DeleteByValue>(object_reg); |             emit<Bytecode::Op::DeleteByValue>(object_reg); | ||||||
|         } else if (expression.property().is_identifier()) { |         } else if (expression.property().is_identifier()) { | ||||||
|             auto identifier_table_ref = intern_identifier(verify_cast<Identifier>(expression.property()).string()); |             auto identifier_table_ref = intern_identifier(verify_cast<Identifier>(expression.property()).string()); | ||||||
|  | @ -396,7 +398,7 @@ CodeGenerationErrorOr<void> Generator::emit_delete_reference(JS::ASTNode const& | ||||||
|                 "Unimplemented non-computed member expression"sv |                 "Unimplemented non-computed member expression"sv | ||||||
|             }; |             }; | ||||||
|         } |         } | ||||||
|         return {}; |         return Optional<Operand> {}; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Though this will have no deletion effect, we still have to evaluate the node as it can have side effects.
 |     // Though this will have no deletion effect, we still have to evaluate the node as it can have side effects.
 | ||||||
|  | @ -405,13 +407,13 @@ CodeGenerationErrorOr<void> Generator::emit_delete_reference(JS::ASTNode const& | ||||||
|     // 13.5.1.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-delete-operator-runtime-semantics-evaluation
 |     // 13.5.1.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-delete-operator-runtime-semantics-evaluation
 | ||||||
|     // 1. Let ref be the result of evaluating UnaryExpression.
 |     // 1. Let ref be the result of evaluating UnaryExpression.
 | ||||||
|     // 2. ReturnIfAbrupt(ref).
 |     // 2. ReturnIfAbrupt(ref).
 | ||||||
|     TRY(node.generate_bytecode(*this)); |     FIXME_NEWBC TRY(node.generate_bytecode(*this)); | ||||||
| 
 | 
 | ||||||
|     // 3. If ref is not a Reference Record, return true.
 |     // 3. If ref is not a Reference Record, return true.
 | ||||||
|     emit<Bytecode::Op::LoadImmediate>(Value(true)); |     emit<Bytecode::Op::LoadImmediate>(Value(true)); | ||||||
| 
 | 
 | ||||||
|     // NOTE: The rest of the steps are handled by Delete{Variable,ByValue,Id}.
 |     // NOTE: The rest of the steps are handled by Delete{Variable,ByValue,Id}.
 | ||||||
|     return {}; |     return Optional<Operand> {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Generator::emit_set_variable(JS::Identifier const& identifier, Bytecode::Op::SetVariable::InitializationMode initialization_mode, Bytecode::Op::EnvironmentMode mode) | void Generator::emit_set_variable(JS::Identifier const& identifier, Bytecode::Op::SetVariable::InitializationMode initialization_mode, Bytecode::Op::EnvironmentMode mode) | ||||||
|  | @ -561,7 +563,7 @@ CodeGenerationErrorOr<void> Generator::emit_named_evaluation_if_anonymous_functi | ||||||
|     if (is<FunctionExpression>(expression)) { |     if (is<FunctionExpression>(expression)) { | ||||||
|         auto const& function_expression = static_cast<FunctionExpression const&>(expression); |         auto const& function_expression = static_cast<FunctionExpression const&>(expression); | ||||||
|         if (!function_expression.has_name()) { |         if (!function_expression.has_name()) { | ||||||
|             TRY(function_expression.generate_bytecode_with_lhs_name(*this, move(lhs_name))); |             FIXME_NEWBC TRY(function_expression.generate_bytecode_with_lhs_name(*this, move(lhs_name))); | ||||||
|             return {}; |             return {}; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -569,12 +571,12 @@ CodeGenerationErrorOr<void> Generator::emit_named_evaluation_if_anonymous_functi | ||||||
|     if (is<ClassExpression>(expression)) { |     if (is<ClassExpression>(expression)) { | ||||||
|         auto const& class_expression = static_cast<ClassExpression const&>(expression); |         auto const& class_expression = static_cast<ClassExpression const&>(expression); | ||||||
|         if (!class_expression.has_name()) { |         if (!class_expression.has_name()) { | ||||||
|             TRY(class_expression.generate_bytecode_with_lhs_name(*this, move(lhs_name))); |             FIXME_NEWBC TRY(class_expression.generate_bytecode_with_lhs_name(*this, move(lhs_name))); | ||||||
|             return {}; |             return {}; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     TRY(expression.generate_bytecode(*this)); |     FIXME_NEWBC TRY(expression.generate_bytecode(*this)); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -103,9 +103,9 @@ public: | ||||||
|         No |         No | ||||||
|     }; |     }; | ||||||
|     CodeGenerationErrorOr<Optional<ReferenceRegisters>> emit_load_from_reference(JS::ASTNode const&, CollectRegisters); |     CodeGenerationErrorOr<Optional<ReferenceRegisters>> emit_load_from_reference(JS::ASTNode const&, CollectRegisters); | ||||||
|     CodeGenerationErrorOr<void> emit_store_to_reference(JS::ASTNode const&); |     CodeGenerationErrorOr<Optional<Operand>> emit_store_to_reference(JS::ASTNode const&); | ||||||
|     CodeGenerationErrorOr<void> emit_store_to_reference(ReferenceRegisters const&); |     CodeGenerationErrorOr<Optional<Operand>> emit_store_to_reference(ReferenceRegisters const&); | ||||||
|     CodeGenerationErrorOr<void> emit_delete_reference(JS::ASTNode const&); |     CodeGenerationErrorOr<Optional<Operand>> emit_delete_reference(JS::ASTNode const&); | ||||||
| 
 | 
 | ||||||
|     CodeGenerationErrorOr<ReferenceRegisters> emit_super_reference(MemberExpression const&); |     CodeGenerationErrorOr<ReferenceRegisters> emit_super_reference(MemberExpression const&); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling