Browse Source

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.
Andreas Kling 1 year ago
parent
commit
7f1a62a1d3

+ 70 - 69
Userland/Libraries/LibJS/AST.h

@@ -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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override;
+    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<void> generate_bytecode_with_lhs_name(Bytecode::Generator&, Optional<Bytecode::IdentifierTableIndex> lhs_name) const;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override;
+    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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) 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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) 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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) 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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) 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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) 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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) 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<void> generate_bytecode_with_lhs_name(Bytecode::Generator&, Optional<Bytecode::IdentifierTableIndex> lhs_name) const;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override;
+    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<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const;
+    virtual Bytecode::CodeGenerationErrorOr<Optional<Bytecode::Operand>> generate_bytecode(Bytecode::Generator&, Optional<Bytecode::Operand> preferred_dst = {}) const override;
+    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
+ 153 - 151
Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp


+ 25 - 23
Userland/Libraries/LibJS/Bytecode/Generator.cpp

@@ -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 {};
 }
 }
 
 

+ 3 - 3
Userland/Libraries/LibJS/Bytecode/Generator.h

@@ -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<void> emit_store_to_reference(ReferenceRegisters const&);
-    CodeGenerationErrorOr<void> emit_delete_reference(JS::ASTNode const&);
+    CodeGenerationErrorOr<Optional<Operand>> emit_store_to_reference(JS::ASTNode const&);
+    CodeGenerationErrorOr<Optional<Operand>> emit_store_to_reference(ReferenceRegisters const&);
+    CodeGenerationErrorOr<Optional<Operand>> emit_delete_reference(JS::ASTNode const&);
 
 
     CodeGenerationErrorOr<ReferenceRegisters> emit_super_reference(MemberExpression const&);
     CodeGenerationErrorOr<ReferenceRegisters> emit_super_reference(MemberExpression const&);
 
 

Some files were not shown because too many files changed in this diff