Serenity Operating System
at master 2243 lines 78 kB view raw
1/* 2 * Copyright (c) 2020-2023, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2020-2022, Linus Groh <linusg@serenityos.org> 4 * Copyright (c) 2021-2022, David Tuin <davidot@serenityos.org> 5 * 6 * SPDX-License-Identifier: BSD-2-Clause 7 */ 8 9#pragma once 10 11#include <AK/DeprecatedFlyString.h> 12#include <AK/DeprecatedString.h> 13#include <AK/HashMap.h> 14#include <AK/OwnPtr.h> 15#include <AK/RefPtr.h> 16#include <AK/Variant.h> 17#include <AK/Vector.h> 18#include <LibJS/Bytecode/CodeGenerationError.h> 19#include <LibJS/Forward.h> 20#include <LibJS/Heap/Handle.h> 21#include <LibJS/Runtime/ClassFieldDefinition.h> 22#include <LibJS/Runtime/Completion.h> 23#include <LibJS/Runtime/EnvironmentCoordinate.h> 24#include <LibJS/Runtime/FunctionKind.h> 25#include <LibJS/Runtime/ModuleRequest.h> 26#include <LibJS/Runtime/PropertyKey.h> 27#include <LibJS/Runtime/Reference.h> 28#include <LibJS/Runtime/Value.h> 29#include <LibJS/SourceRange.h> 30#include <LibRegex/Regex.h> 31 32namespace JS { 33 34class Declaration; 35class ClassDeclaration; 36class FunctionDeclaration; 37class Identifier; 38class MemberExpression; 39class VariableDeclaration; 40 41template<class T, class... Args> 42static inline NonnullRefPtr<T> 43create_ast_node(SourceRange range, Args&&... args) 44{ 45 return adopt_ref(*new T(move(range), forward<Args>(args)...)); 46} 47 48class ASTNode : public RefCounted<ASTNode> { 49public: 50 virtual ~ASTNode() = default; 51 52 // NOTE: This is here to stop ASAN complaining about mismatch between new/delete sizes in ASTNodeWithTailArray. 53 void operator delete(void* ptr) { ::operator delete(ptr); } 54 55 virtual Completion execute(Interpreter&) const = 0; 56 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const; 57 virtual void dump(int indent) const; 58 59 [[nodiscard]] SourceRange source_range() const; 60 u32 start_offset() const { return m_start_offset; } 61 62 void set_end_offset(Badge<Parser>, u32 end_offset) { m_end_offset = end_offset; } 63 64 DeprecatedString class_name() const; 65 66 template<typename T> 67 bool fast_is() const = delete; 68 69 virtual bool is_new_expression() const { return false; } 70 virtual bool is_member_expression() const { return false; } 71 virtual bool is_super_expression() const { return false; } 72 virtual bool is_function_expression() const { return false; } 73 virtual bool is_class_expression() const { return false; } 74 virtual bool is_expression_statement() const { return false; } 75 virtual bool is_identifier() const { return false; } 76 virtual bool is_private_identifier() const { return false; } 77 virtual bool is_scope_node() const { return false; } 78 virtual bool is_program() const { return false; } 79 virtual bool is_class_declaration() const { return false; } 80 virtual bool is_function_declaration() const { return false; } 81 virtual bool is_variable_declaration() const { return false; } 82 virtual bool is_import_call() const { return false; } 83 virtual bool is_array_expression() const { return false; } 84 virtual bool is_object_expression() const { return false; } 85 virtual bool is_string_literal() const { return false; } 86 virtual bool is_update_expression() const { return false; } 87 virtual bool is_call_expression() const { return false; } 88 virtual bool is_labelled_statement() const { return false; } 89 virtual bool is_iteration_statement() const { return false; } 90 virtual bool is_class_method() const { return false; } 91 92protected: 93 explicit ASTNode(SourceRange); 94 95private: 96 // NOTE: These members are carefully ordered so that `m_start_offset` is packed with the padding after RefCounted::m_ref_count. 97 // This creates a 4-byte padding hole after `m_end_offset` which is used to pack subclasses better. 98 u32 m_start_offset { 0 }; 99 RefPtr<SourceCode const> m_source_code; 100 u32 m_end_offset { 0 }; 101}; 102 103// This is a helper class that packs an array of T after the AST node, all in the same allocation. 104template<typename Derived, typename Base, typename T> 105class ASTNodeWithTailArray : public Base { 106public: 107 virtual ~ASTNodeWithTailArray() override 108 { 109 for (auto& value : tail_span()) 110 value.~T(); 111 } 112 113 ReadonlySpan<T> tail_span() const { return { tail_data(), tail_size() }; } 114 115 T const* tail_data() const { return reinterpret_cast<T const*>(reinterpret_cast<uintptr_t>(this) + sizeof(Derived)); } 116 size_t tail_size() const { return m_tail_size; } 117 118protected: 119 template<typename ActualDerived = Derived, typename... Args> 120 static NonnullRefPtr<ActualDerived> create(size_t tail_size, SourceRange source_range, Args&&... args) 121 { 122 static_assert(sizeof(ActualDerived) == sizeof(Derived), "This leaf class cannot add more members"); 123 static_assert(alignof(ActualDerived) % alignof(T) == 0, "Need padding for tail array"); 124 auto memory = ::operator new(sizeof(ActualDerived) + tail_size * sizeof(T)); 125 return adopt_ref(*::new (memory) ActualDerived(move(source_range), forward<Args>(args)...)); 126 } 127 128 ASTNodeWithTailArray(SourceRange source_range, ReadonlySpan<T> values) 129 : Base(move(source_range)) 130 , m_tail_size(values.size()) 131 { 132 VERIFY(values.size() <= NumericLimits<u32>::max()); 133 for (size_t i = 0; i < values.size(); ++i) 134 new (&tail_data()[i]) T(values[i]); 135 } 136 137private: 138 T* tail_data() { return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(this) + sizeof(Derived)); } 139 140 u32 m_tail_size { 0 }; 141}; 142 143class Statement : public ASTNode { 144public: 145 explicit Statement(SourceRange source_range) 146 : ASTNode(source_range) 147 { 148 } 149}; 150 151// 14.13 Labelled Statements, https://tc39.es/ecma262/#sec-labelled-statements 152class LabelledStatement : public Statement { 153public: 154 LabelledStatement(SourceRange source_range, DeprecatedFlyString label, NonnullRefPtr<Statement const> labelled_item) 155 : Statement(source_range) 156 , m_label(move(label)) 157 , m_labelled_item(move(labelled_item)) 158 { 159 } 160 161 virtual Completion execute(Interpreter&) const override; 162 virtual void dump(int indent) const override; 163 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 164 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const; 165 166 DeprecatedFlyString const& label() const { return m_label; } 167 DeprecatedFlyString& label() { return m_label; } 168 NonnullRefPtr<Statement const> const& labelled_item() const { return m_labelled_item; } 169 170private: 171 virtual bool is_labelled_statement() const final { return true; } 172 173 DeprecatedFlyString m_label; 174 NonnullRefPtr<Statement const> m_labelled_item; 175}; 176 177class LabelableStatement : public Statement { 178public: 179 using Statement::Statement; 180 181 Vector<DeprecatedFlyString> const& labels() const { return m_labels; } 182 virtual void add_label(DeprecatedFlyString string) { m_labels.append(move(string)); } 183 184protected: 185 Vector<DeprecatedFlyString> m_labels; 186}; 187 188class IterationStatement : public Statement { 189public: 190 using Statement::Statement; 191 192 virtual Completion loop_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&) const = 0; 193 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const; 194 195private: 196 virtual bool is_iteration_statement() const final { return true; } 197}; 198 199class EmptyStatement final : public Statement { 200public: 201 explicit EmptyStatement(SourceRange source_range) 202 : Statement(source_range) 203 { 204 } 205 Completion execute(Interpreter&) const override; 206 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 207}; 208 209class ErrorStatement final : public Statement { 210public: 211 explicit ErrorStatement(SourceRange source_range) 212 : Statement(source_range) 213 { 214 } 215 Completion execute(Interpreter&) const override { return {}; } 216}; 217 218class ExpressionStatement final : public Statement { 219public: 220 ExpressionStatement(SourceRange source_range, NonnullRefPtr<Expression const> expression) 221 : Statement(source_range) 222 , m_expression(move(expression)) 223 { 224 } 225 226 virtual Completion execute(Interpreter&) const override; 227 virtual void dump(int indent) const override; 228 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 229 230 Expression const& expression() const { return m_expression; }; 231 232private: 233 virtual bool is_expression_statement() const override { return true; } 234 235 NonnullRefPtr<Expression const> m_expression; 236}; 237 238template<typename Func, typename... Args> 239concept ThrowCompletionOrVoidFunction = requires(Func func, Args... args) { 240 { 241 func(args...) 242 } 243 -> SameAs<ThrowCompletionOr<void>>; 244 }; 245 246template<typename... Args> 247class ThrowCompletionOrVoidCallback : public Function<ThrowCompletionOr<void>(Args...)> { 248public: 249 template<typename CallableType> 250 ThrowCompletionOrVoidCallback(CallableType&& callable) 251 requires(VoidFunction<CallableType, Args...>) 252 : Function<ThrowCompletionOr<void>(Args...)>([callable = forward<CallableType>(callable)](Args... args) { 253 callable(args...); 254 return ThrowCompletionOr<void> {}; 255 }) 256 { 257 } 258 259 template<typename CallableType> 260 ThrowCompletionOrVoidCallback(CallableType&& callable) 261 requires(ThrowCompletionOrVoidFunction<CallableType, Args...>) 262 : Function<ThrowCompletionOr<void>(Args...)>(forward<CallableType>(callable)) 263 { 264 } 265}; 266 267class ScopeNode : public Statement { 268public: 269 template<typename T, typename... Args> 270 T& append(SourceRange range, Args&&... args) 271 { 272 auto child = create_ast_node<T>(range, forward<Args>(args)...); 273 m_children.append(move(child)); 274 return static_cast<T&>(*m_children.last()); 275 } 276 void append(NonnullRefPtr<Statement const> child) 277 { 278 m_children.append(move(child)); 279 } 280 281 void shrink_to_fit() 282 { 283 m_children.shrink_to_fit(); 284 m_lexical_declarations.shrink_to_fit(); 285 m_var_declarations.shrink_to_fit(); 286 m_functions_hoistable_with_annexB_extension.shrink_to_fit(); 287 } 288 289 Vector<NonnullRefPtr<Statement const>> const& children() const { return m_children; } 290 virtual void dump(int indent) const override; 291 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 292 293 Completion evaluate_statements(Interpreter&) const; 294 295 void add_var_scoped_declaration(NonnullRefPtr<Declaration const> variables); 296 void add_lexical_declaration(NonnullRefPtr<Declaration const> variables); 297 void add_hoisted_function(NonnullRefPtr<FunctionDeclaration const> declaration); 298 299 [[nodiscard]] bool has_lexical_declarations() const { return !m_lexical_declarations.is_empty(); } 300 [[nodiscard]] bool has_var_declarations() const { return !m_var_declarations.is_empty(); } 301 302 [[nodiscard]] size_t var_declaration_count() const { return m_var_declarations.size(); } 303 [[nodiscard]] size_t lexical_declaration_count() const { return m_lexical_declarations.size(); } 304 305 ThrowCompletionOr<void> for_each_lexically_scoped_declaration(ThrowCompletionOrVoidCallback<Declaration const&>&& callback) const; 306 ThrowCompletionOr<void> for_each_lexically_declared_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const; 307 308 ThrowCompletionOr<void> for_each_var_declared_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const; 309 310 ThrowCompletionOr<void> for_each_var_function_declaration_in_reverse_order(ThrowCompletionOrVoidCallback<FunctionDeclaration const&>&& callback) const; 311 ThrowCompletionOr<void> for_each_var_scoped_variable_declaration(ThrowCompletionOrVoidCallback<VariableDeclaration const&>&& callback) const; 312 313 void block_declaration_instantiation(Interpreter&, Environment*) const; 314 315 ThrowCompletionOr<void> for_each_function_hoistable_with_annexB_extension(ThrowCompletionOrVoidCallback<FunctionDeclaration&>&& callback) const; 316 317protected: 318 explicit ScopeNode(SourceRange source_range) 319 : Statement(source_range) 320 { 321 } 322 323private: 324 virtual bool is_scope_node() const final { return true; } 325 326 Vector<NonnullRefPtr<Statement const>> m_children; 327 Vector<NonnullRefPtr<Declaration const>> m_lexical_declarations; 328 Vector<NonnullRefPtr<Declaration const>> m_var_declarations; 329 330 Vector<NonnullRefPtr<FunctionDeclaration const>> m_functions_hoistable_with_annexB_extension; 331}; 332 333// ImportEntry Record, https://tc39.es/ecma262/#table-importentry-record-fields 334struct ImportEntry { 335 DeprecatedFlyString import_name; // [[ImportName]] if a String 336 DeprecatedFlyString local_name; // [[LocalName]] 337 bool is_namespace { false }; // [[ImportName]] if `namespace-object` 338 339 ImportEntry(DeprecatedFlyString import_name_, DeprecatedFlyString local_name_, bool is_namespace_ = false) 340 : import_name(move(import_name_)) 341 , local_name(move(local_name_)) 342 , is_namespace(is_namespace_) 343 { 344 VERIFY(!is_namespace || import_name.is_null()); 345 } 346 347 ModuleRequest const& module_request() const 348 { 349 VERIFY(m_module_request); 350 return *m_module_request; 351 } 352 353private: 354 friend class ImportStatement; 355 ModuleRequest* m_module_request; // [[ModuleRequest]] 356}; 357 358class ImportStatement final : public Statement { 359public: 360 explicit ImportStatement(SourceRange source_range, ModuleRequest from_module, Vector<ImportEntry> entries = {}) 361 : Statement(source_range) 362 , m_module_request(move(from_module)) 363 , m_entries(move(entries)) 364 { 365 for (auto& entry : m_entries) 366 entry.m_module_request = &m_module_request; 367 } 368 369 virtual Completion execute(Interpreter&) const override; 370 371 virtual void dump(int indent) const override; 372 373 bool has_bound_name(DeprecatedFlyString const& name) const; 374 Vector<ImportEntry> const& entries() const { return m_entries; } 375 ModuleRequest const& module_request() const { return m_module_request; } 376 377private: 378 ModuleRequest m_module_request; 379 Vector<ImportEntry> m_entries; 380}; 381 382// ExportEntry Record, https://tc39.es/ecma262/#table-exportentry-records 383struct ExportEntry { 384 enum class Kind { 385 NamedExport, 386 ModuleRequestAll, 387 ModuleRequestAllButDefault, 388 // EmptyNamedExport is a special type for export {} from "module", 389 // which should import the module without getting any of the exports 390 // however we don't want give it a fake export name which may get 391 // duplicates 392 EmptyNamedExport, 393 } kind; 394 395 DeprecatedFlyString export_name; // [[ExportName]] 396 DeprecatedFlyString local_or_import_name; // Either [[ImportName]] or [[LocalName]] 397 398 ExportEntry(Kind export_kind, DeprecatedFlyString export_name_, DeprecatedFlyString local_or_import_name_) 399 : kind(export_kind) 400 , export_name(move(export_name_)) 401 , local_or_import_name(move(local_or_import_name_)) 402 { 403 } 404 405 bool is_module_request() const 406 { 407 return m_module_request != nullptr; 408 } 409 410 static ExportEntry indirect_export_entry(ModuleRequest const& module_request, DeprecatedFlyString export_name, DeprecatedFlyString import_name) 411 { 412 ExportEntry entry { Kind::NamedExport, move(export_name), move(import_name) }; 413 entry.m_module_request = &module_request; 414 return entry; 415 } 416 417 ModuleRequest const& module_request() const 418 { 419 VERIFY(m_module_request); 420 return *m_module_request; 421 } 422 423private: 424 ModuleRequest const* m_module_request { nullptr }; // [[ModuleRequest]] 425 friend class ExportStatement; 426 427public: 428 static ExportEntry named_export(DeprecatedFlyString export_name, DeprecatedFlyString local_name) 429 { 430 return ExportEntry { Kind::NamedExport, move(export_name), move(local_name) }; 431 } 432 433 static ExportEntry all_but_default_entry() 434 { 435 return ExportEntry { Kind::ModuleRequestAllButDefault, {}, {} }; 436 } 437 438 static ExportEntry all_module_request(DeprecatedFlyString export_name) 439 { 440 return ExportEntry { Kind::ModuleRequestAll, move(export_name), {} }; 441 } 442 443 static ExportEntry empty_named_export() 444 { 445 return ExportEntry { Kind::EmptyNamedExport, {}, {} }; 446 } 447}; 448 449class ExportStatement final : public Statement { 450public: 451 static DeprecatedFlyString local_name_for_default; 452 453 ExportStatement(SourceRange source_range, RefPtr<ASTNode const> statement, Vector<ExportEntry> entries, bool is_default_export, ModuleRequest module_request) 454 : Statement(source_range) 455 , m_statement(move(statement)) 456 , m_entries(move(entries)) 457 , m_is_default_export(is_default_export) 458 , m_module_request(move(module_request)) 459 { 460 if (!m_module_request.module_specifier.is_null()) { 461 for (auto& entry : m_entries) 462 entry.m_module_request = &m_module_request; 463 } 464 } 465 466 virtual Completion execute(Interpreter&) const override; 467 468 virtual void dump(int indent) const override; 469 470 bool has_export(DeprecatedFlyString const& export_name) const; 471 472 bool has_statement() const { return m_statement; } 473 Vector<ExportEntry> const& entries() const { return m_entries; } 474 475 bool is_default_export() const { return m_is_default_export; } 476 477 ASTNode const& statement() const 478 { 479 VERIFY(m_statement); 480 return *m_statement; 481 } 482 483 ModuleRequest const& module_request() const 484 { 485 VERIFY(!m_module_request.module_specifier.is_null()); 486 return m_module_request; 487 } 488 489private: 490 RefPtr<ASTNode const> m_statement; 491 Vector<ExportEntry> m_entries; 492 bool m_is_default_export { false }; 493 ModuleRequest m_module_request; 494}; 495 496class Program final : public ScopeNode { 497public: 498 enum class Type { 499 Script, 500 Module 501 }; 502 503 explicit Program(SourceRange source_range, Type program_type) 504 : ScopeNode(source_range) 505 , m_type(program_type) 506 { 507 } 508 509 virtual Completion execute(Interpreter&) const override; 510 511 bool is_strict_mode() const { return m_is_strict_mode; } 512 void set_strict_mode() { m_is_strict_mode = true; } 513 514 Type type() const { return m_type; } 515 516 void append_import(NonnullRefPtr<ImportStatement const> import_statement) 517 { 518 m_imports.append(import_statement); 519 append(import_statement); 520 } 521 522 void append_export(NonnullRefPtr<ExportStatement const> export_statement) 523 { 524 m_exports.append(export_statement); 525 append(export_statement); 526 } 527 528 Vector<NonnullRefPtr<ImportStatement const>> const& imports() const { return m_imports; } 529 Vector<NonnullRefPtr<ExportStatement const>> const& exports() const { return m_exports; } 530 531 Vector<NonnullRefPtr<ImportStatement const>>& imports() { return m_imports; } 532 Vector<NonnullRefPtr<ExportStatement const>>& exports() { return m_exports; } 533 534 bool has_top_level_await() const { return m_has_top_level_await; } 535 void set_has_top_level_await() { m_has_top_level_await = true; } 536 537 ThrowCompletionOr<void> global_declaration_instantiation(Interpreter&, GlobalEnvironment&) const; 538 539private: 540 virtual bool is_program() const override { return true; } 541 542 bool m_is_strict_mode { false }; 543 Type m_type { Type::Script }; 544 545 Vector<NonnullRefPtr<ImportStatement const>> m_imports; 546 Vector<NonnullRefPtr<ExportStatement const>> m_exports; 547 bool m_has_top_level_await { false }; 548}; 549 550class BlockStatement final : public ScopeNode { 551public: 552 explicit BlockStatement(SourceRange source_range) 553 : ScopeNode(source_range) 554 { 555 } 556 Completion execute(Interpreter&) const override; 557}; 558 559class FunctionBody final : public ScopeNode { 560public: 561 explicit FunctionBody(SourceRange source_range) 562 : ScopeNode(source_range) 563 { 564 } 565 566 void set_strict_mode() { m_in_strict_mode = true; } 567 568 bool in_strict_mode() const { return m_in_strict_mode; } 569 570 virtual Completion execute(Interpreter&) const override; 571 572private: 573 bool m_in_strict_mode { false }; 574}; 575 576class Expression : public ASTNode { 577public: 578 explicit Expression(SourceRange source_range) 579 : ASTNode(source_range) 580 { 581 } 582 virtual ThrowCompletionOr<Reference> to_reference(Interpreter&) const; 583}; 584 585class Declaration : public Statement { 586public: 587 explicit Declaration(SourceRange source_range) 588 : Statement(source_range) 589 { 590 } 591 592 virtual ThrowCompletionOr<void> for_each_bound_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const = 0; 593 594 // 8.1.3 Static Semantics: IsConstantDeclaration, https://tc39.es/ecma262/#sec-static-semantics-isconstantdeclaration 595 virtual bool is_constant_declaration() const { return false; } 596 597 virtual bool is_lexical_declaration() const { return false; } 598}; 599 600class ErrorDeclaration final : public Declaration { 601public: 602 explicit ErrorDeclaration(SourceRange source_range) 603 : Declaration(source_range) 604 { 605 } 606 Completion execute(Interpreter&) const override { return {}; } 607 608 ThrowCompletionOr<void> for_each_bound_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&&) const override 609 { 610 VERIFY_NOT_REACHED(); 611 } 612}; 613 614struct BindingPattern : RefCounted<BindingPattern> { 615 // This covers both BindingProperty and BindingElement, hence the more generic name 616 struct BindingEntry { 617 // If this entry represents a BindingElement, then name will be Empty 618 Variant<NonnullRefPtr<Identifier const>, NonnullRefPtr<Expression const>, Empty> name {}; 619 Variant<NonnullRefPtr<Identifier const>, NonnullRefPtr<BindingPattern const>, NonnullRefPtr<MemberExpression const>, Empty> alias {}; 620 RefPtr<Expression const> initializer {}; 621 bool is_rest { false }; 622 623 bool is_elision() const { return name.has<Empty>() && alias.has<Empty>(); } 624 }; 625 626 enum class Kind { 627 Array, 628 Object, 629 }; 630 631 void dump(int indent) const; 632 633 ThrowCompletionOr<void> for_each_bound_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const; 634 635 bool contains_expression() const; 636 637 Vector<BindingEntry> entries; 638 Kind kind { Kind::Object }; 639}; 640 641struct FunctionParameter { 642 Variant<DeprecatedFlyString, NonnullRefPtr<BindingPattern const>> binding; 643 RefPtr<Expression const> default_value; 644 bool is_rest { false }; 645}; 646 647class FunctionNode { 648public: 649 DeprecatedFlyString const& name() const { return m_name; } 650 DeprecatedString const& source_text() const { return m_source_text; } 651 Statement const& body() const { return *m_body; } 652 Vector<FunctionParameter> const& parameters() const { return m_parameters; }; 653 i32 function_length() const { return m_function_length; } 654 bool is_strict_mode() const { return m_is_strict_mode; } 655 bool might_need_arguments_object() const { return m_might_need_arguments_object; } 656 bool contains_direct_call_to_eval() const { return m_contains_direct_call_to_eval; } 657 bool is_arrow_function() const { return m_is_arrow_function; } 658 FunctionKind kind() const { return m_kind; } 659 660protected: 661 FunctionNode(DeprecatedFlyString name, DeprecatedString source_text, NonnullRefPtr<Statement const> body, Vector<FunctionParameter> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, bool might_need_arguments_object, bool contains_direct_call_to_eval, bool is_arrow_function) 662 : m_name(move(name)) 663 , m_source_text(move(source_text)) 664 , m_body(move(body)) 665 , m_parameters(move(parameters)) 666 , m_function_length(function_length) 667 , m_kind(kind) 668 , m_is_strict_mode(is_strict_mode) 669 , m_might_need_arguments_object(might_need_arguments_object) 670 , m_contains_direct_call_to_eval(contains_direct_call_to_eval) 671 , m_is_arrow_function(is_arrow_function) 672 { 673 if (m_is_arrow_function) 674 VERIFY(!m_might_need_arguments_object); 675 } 676 677 void dump(int indent, DeprecatedString const& class_name) const; 678 679private: 680 DeprecatedFlyString m_name; 681 DeprecatedString m_source_text; 682 NonnullRefPtr<Statement const> m_body; 683 Vector<FunctionParameter> const m_parameters; 684 const i32 m_function_length; 685 FunctionKind m_kind; 686 bool m_is_strict_mode : 1 { false }; 687 bool m_might_need_arguments_object : 1 { false }; 688 bool m_contains_direct_call_to_eval : 1 { false }; 689 bool m_is_arrow_function : 1 { false }; 690}; 691 692class FunctionDeclaration final 693 : public Declaration 694 , public FunctionNode { 695public: 696 static bool must_have_name() { return true; } 697 698 FunctionDeclaration(SourceRange source_range, DeprecatedFlyString const& name, DeprecatedString source_text, NonnullRefPtr<Statement const> body, Vector<FunctionParameter> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, bool might_need_arguments_object, bool contains_direct_call_to_eval) 699 : Declaration(source_range) 700 , FunctionNode(name, move(source_text), move(body), move(parameters), function_length, kind, is_strict_mode, might_need_arguments_object, contains_direct_call_to_eval, false) 701 { 702 } 703 704 virtual Completion execute(Interpreter&) const override; 705 virtual void dump(int indent) const override; 706 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 707 708 virtual ThrowCompletionOr<void> for_each_bound_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const override; 709 710 virtual bool is_function_declaration() const override { return true; } 711 712 void set_should_do_additional_annexB_steps() { m_is_hoisted = true; } 713 714private: 715 bool m_is_hoisted { false }; 716}; 717 718class FunctionExpression final 719 : public Expression 720 , public FunctionNode { 721public: 722 static bool must_have_name() { return false; } 723 724 FunctionExpression(SourceRange source_range, DeprecatedFlyString const& name, DeprecatedString source_text, NonnullRefPtr<Statement const> body, Vector<FunctionParameter> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, bool might_need_arguments_object, bool contains_direct_call_to_eval, bool is_arrow_function = false) 725 : Expression(source_range) 726 , FunctionNode(name, move(source_text), move(body), move(parameters), function_length, kind, is_strict_mode, might_need_arguments_object, contains_direct_call_to_eval, is_arrow_function) 727 { 728 } 729 730 virtual Completion execute(Interpreter&) const override; 731 virtual void dump(int indent) const override; 732 733 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 734 735 bool has_name() const { return !name().is_empty(); } 736 737 Value instantiate_ordinary_function_expression(Interpreter&, DeprecatedFlyString given_name) const; 738 739private: 740 virtual bool is_function_expression() const override { return true; } 741}; 742 743class ErrorExpression final : public Expression { 744public: 745 explicit ErrorExpression(SourceRange source_range) 746 : Expression(source_range) 747 { 748 } 749 750 Completion execute(Interpreter&) const override { return {}; } 751}; 752 753class YieldExpression final : public Expression { 754public: 755 explicit YieldExpression(SourceRange source_range, RefPtr<Expression const> argument, bool is_yield_from) 756 : Expression(source_range) 757 , m_argument(move(argument)) 758 , m_is_yield_from(is_yield_from) 759 { 760 } 761 762 Expression const* argument() const { return m_argument; } 763 bool is_yield_from() const { return m_is_yield_from; } 764 765 virtual Completion execute(Interpreter&) const override; 766 virtual void dump(int indent) const override; 767 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 768 769private: 770 RefPtr<Expression const> m_argument; 771 bool m_is_yield_from { false }; 772}; 773 774class AwaitExpression final : public Expression { 775public: 776 explicit AwaitExpression(SourceRange source_range, NonnullRefPtr<Expression const> argument) 777 : Expression(source_range) 778 , m_argument(move(argument)) 779 { 780 } 781 782 virtual Completion execute(Interpreter&) const override; 783 virtual void dump(int indent) const override; 784 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 785 786private: 787 NonnullRefPtr<Expression const> m_argument; 788}; 789 790class ReturnStatement final : public Statement { 791public: 792 explicit ReturnStatement(SourceRange source_range, RefPtr<Expression const> argument) 793 : Statement(source_range) 794 , m_argument(move(argument)) 795 { 796 } 797 798 Expression const* argument() const { return m_argument; } 799 800 virtual Completion execute(Interpreter&) const override; 801 virtual void dump(int indent) const override; 802 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 803 804private: 805 RefPtr<Expression const> m_argument; 806}; 807 808class IfStatement final : public Statement { 809public: 810 IfStatement(SourceRange source_range, NonnullRefPtr<Expression const> predicate, NonnullRefPtr<Statement const> consequent, RefPtr<Statement const> alternate) 811 : Statement(source_range) 812 , m_predicate(move(predicate)) 813 , m_consequent(move(consequent)) 814 , m_alternate(move(alternate)) 815 { 816 } 817 818 Expression const& predicate() const { return *m_predicate; } 819 Statement const& consequent() const { return *m_consequent; } 820 Statement const* alternate() const { return m_alternate; } 821 822 virtual Completion execute(Interpreter&) const override; 823 virtual void dump(int indent) const override; 824 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 825 826private: 827 NonnullRefPtr<Expression const> m_predicate; 828 NonnullRefPtr<Statement const> m_consequent; 829 RefPtr<Statement const> m_alternate; 830}; 831 832class WhileStatement final : public IterationStatement { 833public: 834 WhileStatement(SourceRange source_range, NonnullRefPtr<Expression const> test, NonnullRefPtr<Statement const> body) 835 : IterationStatement(source_range) 836 , m_test(move(test)) 837 , m_body(move(body)) 838 { 839 } 840 841 Expression const& test() const { return *m_test; } 842 Statement const& body() const { return *m_body; } 843 844 virtual Completion execute(Interpreter&) const override; 845 virtual Completion loop_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&) const override; 846 virtual void dump(int indent) const override; 847 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 848 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; 849 850private: 851 NonnullRefPtr<Expression const> m_test; 852 NonnullRefPtr<Statement const> m_body; 853}; 854 855class DoWhileStatement final : public IterationStatement { 856public: 857 DoWhileStatement(SourceRange source_range, NonnullRefPtr<Expression const> test, NonnullRefPtr<Statement const> body) 858 : IterationStatement(source_range) 859 , m_test(move(test)) 860 , m_body(move(body)) 861 { 862 } 863 864 Expression const& test() const { return *m_test; } 865 Statement const& body() const { return *m_body; } 866 867 virtual Completion execute(Interpreter&) const override; 868 virtual Completion loop_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&) const override; 869 virtual void dump(int indent) const override; 870 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 871 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; 872 873private: 874 NonnullRefPtr<Expression const> m_test; 875 NonnullRefPtr<Statement const> m_body; 876}; 877 878class WithStatement final : public Statement { 879public: 880 WithStatement(SourceRange source_range, NonnullRefPtr<Expression const> object, NonnullRefPtr<Statement const> body) 881 : Statement(source_range) 882 , m_object(move(object)) 883 , m_body(move(body)) 884 { 885 } 886 887 Expression const& object() const { return *m_object; } 888 Statement const& body() const { return *m_body; } 889 890 virtual Completion execute(Interpreter&) const override; 891 virtual void dump(int indent) const override; 892 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 893 894private: 895 NonnullRefPtr<Expression const> m_object; 896 NonnullRefPtr<Statement const> m_body; 897}; 898 899class ForStatement final : public IterationStatement { 900public: 901 ForStatement(SourceRange source_range, RefPtr<ASTNode const> init, RefPtr<Expression const> test, RefPtr<Expression const> update, NonnullRefPtr<Statement const> body) 902 : IterationStatement(source_range) 903 , m_init(move(init)) 904 , m_test(move(test)) 905 , m_update(move(update)) 906 , m_body(move(body)) 907 { 908 } 909 910 ASTNode const* init() const { return m_init; } 911 Expression const* test() const { return m_test; } 912 Expression const* update() const { return m_update; } 913 Statement const& body() const { return *m_body; } 914 915 virtual Completion execute(Interpreter&) const override; 916 virtual Completion loop_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&) const override; 917 virtual void dump(int indent) const override; 918 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 919 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; 920 921private: 922 Completion for_body_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&, size_t per_iteration_bindings_size) const; 923 924 RefPtr<ASTNode const> m_init; 925 RefPtr<Expression const> m_test; 926 RefPtr<Expression const> m_update; 927 NonnullRefPtr<Statement const> m_body; 928}; 929 930class ForInStatement final : public IterationStatement { 931public: 932 ForInStatement(SourceRange source_range, Variant<NonnullRefPtr<ASTNode const>, NonnullRefPtr<BindingPattern const>> lhs, NonnullRefPtr<Expression const> rhs, NonnullRefPtr<Statement const> body) 933 : IterationStatement(source_range) 934 , m_lhs(move(lhs)) 935 , m_rhs(move(rhs)) 936 , m_body(move(body)) 937 { 938 } 939 940 auto const& lhs() const { return m_lhs; } 941 Expression const& rhs() const { return *m_rhs; } 942 Statement const& body() const { return *m_body; } 943 944 virtual Completion execute(Interpreter&) const override; 945 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 946 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; 947 virtual Completion loop_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&) const override; 948 virtual void dump(int indent) const override; 949 950private: 951 Variant<NonnullRefPtr<ASTNode const>, NonnullRefPtr<BindingPattern const>> m_lhs; 952 NonnullRefPtr<Expression const> m_rhs; 953 NonnullRefPtr<Statement const> m_body; 954}; 955 956class ForOfStatement final : public IterationStatement { 957public: 958 ForOfStatement(SourceRange source_range, Variant<NonnullRefPtr<ASTNode const>, NonnullRefPtr<BindingPattern const>> lhs, NonnullRefPtr<Expression const> rhs, NonnullRefPtr<Statement const> body) 959 : IterationStatement(source_range) 960 , m_lhs(move(lhs)) 961 , m_rhs(move(rhs)) 962 , m_body(move(body)) 963 { 964 } 965 966 auto const& lhs() const { return m_lhs; } 967 Expression const& rhs() const { return *m_rhs; } 968 Statement const& body() const { return *m_body; } 969 970 virtual Completion execute(Interpreter&) const override; 971 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 972 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const override; 973 virtual Completion loop_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&) const override; 974 virtual void dump(int indent) const override; 975 976private: 977 Variant<NonnullRefPtr<ASTNode const>, NonnullRefPtr<BindingPattern const>> m_lhs; 978 NonnullRefPtr<Expression const> m_rhs; 979 NonnullRefPtr<Statement const> m_body; 980}; 981 982class ForAwaitOfStatement final : public IterationStatement { 983public: 984 ForAwaitOfStatement(SourceRange source_range, Variant<NonnullRefPtr<ASTNode const>, NonnullRefPtr<BindingPattern const>> lhs, NonnullRefPtr<Expression const> rhs, NonnullRefPtr<Statement const> body) 985 : IterationStatement(source_range) 986 , m_lhs(move(lhs)) 987 , m_rhs(move(rhs)) 988 , m_body(move(body)) 989 { 990 } 991 992 virtual Completion execute(Interpreter&) const override; 993 virtual Completion loop_evaluation(Interpreter&, Vector<DeprecatedFlyString> const&) const override; 994 virtual void dump(int indent) const override; 995 996private: 997 Variant<NonnullRefPtr<ASTNode const>, NonnullRefPtr<BindingPattern const>> m_lhs; 998 NonnullRefPtr<Expression const> m_rhs; 999 NonnullRefPtr<Statement const> m_body; 1000}; 1001 1002enum class BinaryOp { 1003 Addition, 1004 Subtraction, 1005 Multiplication, 1006 Division, 1007 Modulo, 1008 Exponentiation, 1009 StrictlyEquals, 1010 StrictlyInequals, 1011 LooselyEquals, 1012 LooselyInequals, 1013 GreaterThan, 1014 GreaterThanEquals, 1015 LessThan, 1016 LessThanEquals, 1017 BitwiseAnd, 1018 BitwiseOr, 1019 BitwiseXor, 1020 LeftShift, 1021 RightShift, 1022 UnsignedRightShift, 1023 In, 1024 InstanceOf, 1025}; 1026 1027class BinaryExpression final : public Expression { 1028public: 1029 BinaryExpression(SourceRange source_range, BinaryOp op, NonnullRefPtr<Expression const> lhs, NonnullRefPtr<Expression const> rhs) 1030 : Expression(source_range) 1031 , m_op(op) 1032 , m_lhs(move(lhs)) 1033 , m_rhs(move(rhs)) 1034 { 1035 } 1036 1037 virtual Completion execute(Interpreter&) const override; 1038 virtual void dump(int indent) const override; 1039 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1040 1041private: 1042 BinaryOp m_op; 1043 NonnullRefPtr<Expression const> m_lhs; 1044 NonnullRefPtr<Expression const> m_rhs; 1045}; 1046 1047enum class LogicalOp { 1048 And, 1049 Or, 1050 NullishCoalescing, 1051}; 1052 1053class LogicalExpression final : public Expression { 1054public: 1055 LogicalExpression(SourceRange source_range, LogicalOp op, NonnullRefPtr<Expression const> lhs, NonnullRefPtr<Expression const> rhs) 1056 : Expression(source_range) 1057 , m_op(op) 1058 , m_lhs(move(lhs)) 1059 , m_rhs(move(rhs)) 1060 { 1061 } 1062 1063 virtual Completion execute(Interpreter&) const override; 1064 virtual void dump(int indent) const override; 1065 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1066 1067private: 1068 LogicalOp m_op; 1069 NonnullRefPtr<Expression const> m_lhs; 1070 NonnullRefPtr<Expression const> m_rhs; 1071}; 1072 1073enum class UnaryOp { 1074 BitwiseNot, 1075 Not, 1076 Plus, 1077 Minus, 1078 Typeof, 1079 Void, 1080 Delete, 1081}; 1082 1083class UnaryExpression final : public Expression { 1084public: 1085 UnaryExpression(SourceRange source_range, UnaryOp op, NonnullRefPtr<Expression const> lhs) 1086 : Expression(source_range) 1087 , m_op(op) 1088 , m_lhs(move(lhs)) 1089 { 1090 } 1091 1092 virtual Completion execute(Interpreter&) const override; 1093 virtual void dump(int indent) const override; 1094 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1095 1096private: 1097 UnaryOp m_op; 1098 NonnullRefPtr<Expression const> m_lhs; 1099}; 1100 1101class SequenceExpression final : public Expression { 1102public: 1103 SequenceExpression(SourceRange source_range, Vector<NonnullRefPtr<Expression const>> expressions) 1104 : Expression(source_range) 1105 , m_expressions(move(expressions)) 1106 { 1107 VERIFY(m_expressions.size() >= 2); 1108 } 1109 1110 virtual void dump(int indent) const override; 1111 virtual Completion execute(Interpreter&) const override; 1112 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1113 1114private: 1115 Vector<NonnullRefPtr<Expression const>> m_expressions; 1116}; 1117 1118class Literal : public Expression { 1119protected: 1120 explicit Literal(SourceRange source_range) 1121 : Expression(source_range) 1122 { 1123 } 1124}; 1125 1126class BooleanLiteral final : public Literal { 1127public: 1128 explicit BooleanLiteral(SourceRange source_range, bool value) 1129 : Literal(source_range) 1130 , m_value(value) 1131 { 1132 } 1133 1134 virtual Completion execute(Interpreter&) const override; 1135 virtual void dump(int indent) const override; 1136 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1137 1138private: 1139 bool m_value { false }; 1140}; 1141 1142class NumericLiteral final : public Literal { 1143public: 1144 explicit NumericLiteral(SourceRange source_range, double value) 1145 : Literal(source_range) 1146 , m_value(value) 1147 { 1148 } 1149 1150 virtual Completion execute(Interpreter&) const override; 1151 virtual void dump(int indent) const override; 1152 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1153 1154private: 1155 Value m_value; 1156}; 1157 1158class BigIntLiteral final : public Literal { 1159public: 1160 explicit BigIntLiteral(SourceRange source_range, DeprecatedString value) 1161 : Literal(source_range) 1162 , m_value(move(value)) 1163 { 1164 } 1165 1166 virtual Completion execute(Interpreter&) const override; 1167 virtual void dump(int indent) const override; 1168 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1169 1170private: 1171 DeprecatedString m_value; 1172}; 1173 1174class StringLiteral final : public Literal { 1175public: 1176 explicit StringLiteral(SourceRange source_range, DeprecatedString value) 1177 : Literal(source_range) 1178 , m_value(move(value)) 1179 { 1180 } 1181 1182 virtual Completion execute(Interpreter&) const override; 1183 virtual void dump(int indent) const override; 1184 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1185 1186 StringView value() const { return m_value; } 1187 1188private: 1189 virtual bool is_string_literal() const override { return true; } 1190 1191 DeprecatedString m_value; 1192}; 1193 1194class NullLiteral final : public Literal { 1195public: 1196 explicit NullLiteral(SourceRange source_range) 1197 : Literal(source_range) 1198 { 1199 } 1200 1201 virtual Completion execute(Interpreter&) const override; 1202 virtual void dump(int indent) const override; 1203 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1204}; 1205 1206class RegExpLiteral final : public Literal { 1207public: 1208 RegExpLiteral(SourceRange source_range, regex::Parser::Result parsed_regex, DeprecatedString parsed_pattern, regex::RegexOptions<ECMAScriptFlags> parsed_flags, DeprecatedString pattern, DeprecatedString flags) 1209 : Literal(source_range) 1210 , m_parsed_regex(move(parsed_regex)) 1211 , m_parsed_pattern(move(parsed_pattern)) 1212 , m_parsed_flags(move(parsed_flags)) 1213 , m_pattern(move(pattern)) 1214 , m_flags(move(flags)) 1215 { 1216 } 1217 1218 virtual Completion execute(Interpreter&) const override; 1219 virtual void dump(int indent) const override; 1220 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1221 1222 regex::Parser::Result const& parsed_regex() const { return m_parsed_regex; } 1223 DeprecatedString const& parsed_pattern() const { return m_parsed_pattern; } 1224 regex::RegexOptions<ECMAScriptFlags> const& parsed_flags() const { return m_parsed_flags; } 1225 DeprecatedString const& pattern() const { return m_pattern; } 1226 DeprecatedString const& flags() const { return m_flags; } 1227 1228private: 1229 regex::Parser::Result m_parsed_regex; 1230 DeprecatedString m_parsed_pattern; 1231 regex::RegexOptions<ECMAScriptFlags> m_parsed_flags; 1232 DeprecatedString m_pattern; 1233 DeprecatedString m_flags; 1234}; 1235 1236class Identifier final : public Expression { 1237public: 1238 explicit Identifier(SourceRange source_range, DeprecatedFlyString string) 1239 : Expression(source_range) 1240 , m_string(move(string)) 1241 { 1242 } 1243 1244 DeprecatedFlyString const& string() const { return m_string; } 1245 1246 virtual Completion execute(Interpreter&) const override; 1247 virtual void dump(int indent) const override; 1248 virtual ThrowCompletionOr<Reference> to_reference(Interpreter&) const override; 1249 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1250 1251private: 1252 virtual bool is_identifier() const override { return true; } 1253 1254 DeprecatedFlyString m_string; 1255 mutable EnvironmentCoordinate m_cached_environment_coordinate; 1256}; 1257 1258class PrivateIdentifier final : public Expression { 1259public: 1260 explicit PrivateIdentifier(SourceRange source_range, DeprecatedFlyString string) 1261 : Expression(source_range) 1262 , m_string(move(string)) 1263 { 1264 } 1265 1266 DeprecatedFlyString const& string() const { return m_string; } 1267 1268 virtual Completion execute(Interpreter&) const override; 1269 virtual void dump(int indent) const override; 1270 1271 virtual bool is_private_identifier() const override { return true; } 1272 1273private: 1274 DeprecatedFlyString m_string; 1275}; 1276 1277class ClassElement : public ASTNode { 1278public: 1279 ClassElement(SourceRange source_range, bool is_static) 1280 : ASTNode(source_range) 1281 , m_is_static(is_static) 1282 { 1283 } 1284 1285 virtual Completion execute(Interpreter&) const override; 1286 1287 enum class ElementKind { 1288 Method, 1289 Field, 1290 StaticInitializer, 1291 }; 1292 1293 virtual ElementKind class_element_kind() const = 0; 1294 bool is_static() const { return m_is_static; } 1295 1296 // We use the Completion also as a ClassStaticBlockDefinition Record. 1297 using ClassValue = Variant<ClassFieldDefinition, Completion, PrivateElement>; 1298 virtual ThrowCompletionOr<ClassValue> class_element_evaluation(Interpreter&, Object& home_object) const = 0; 1299 1300 virtual Optional<DeprecatedFlyString> private_bound_identifier() const { return {}; }; 1301 1302private: 1303 bool m_is_static { false }; 1304}; 1305 1306class ClassMethod final : public ClassElement { 1307public: 1308 enum class Kind { 1309 Method, 1310 Getter, 1311 Setter, 1312 }; 1313 1314 ClassMethod(SourceRange source_range, NonnullRefPtr<Expression const> key, NonnullRefPtr<FunctionExpression const> function, Kind kind, bool is_static) 1315 : ClassElement(source_range, is_static) 1316 , m_key(move(key)) 1317 , m_function(move(function)) 1318 , m_kind(kind) 1319 { 1320 } 1321 1322 Expression const& key() const { return *m_key; } 1323 Kind kind() const { return m_kind; } 1324 virtual ElementKind class_element_kind() const override { return ElementKind::Method; } 1325 1326 virtual void dump(int indent) const override; 1327 virtual ThrowCompletionOr<ClassValue> class_element_evaluation(Interpreter&, Object& home_object) const override; 1328 virtual Optional<DeprecatedFlyString> private_bound_identifier() const override; 1329 1330private: 1331 virtual bool is_class_method() const override { return true; } 1332 NonnullRefPtr<Expression const> m_key; 1333 NonnullRefPtr<FunctionExpression const> m_function; 1334 Kind m_kind; 1335}; 1336 1337class ClassField final : public ClassElement { 1338public: 1339 ClassField(SourceRange source_range, NonnullRefPtr<Expression const> key, RefPtr<Expression const> init, bool contains_direct_call_to_eval, bool is_static) 1340 : ClassElement(source_range, is_static) 1341 , m_key(move(key)) 1342 , m_initializer(move(init)) 1343 , m_contains_direct_call_to_eval(contains_direct_call_to_eval) 1344 { 1345 } 1346 1347 Expression const& key() const { return *m_key; } 1348 RefPtr<Expression const> const& initializer() const { return m_initializer; } 1349 RefPtr<Expression const>& initializer() { return m_initializer; } 1350 1351 virtual ElementKind class_element_kind() const override { return ElementKind::Field; } 1352 1353 virtual void dump(int indent) const override; 1354 virtual ThrowCompletionOr<ClassValue> class_element_evaluation(Interpreter&, Object& home_object) const override; 1355 virtual Optional<DeprecatedFlyString> private_bound_identifier() const override; 1356 1357private: 1358 NonnullRefPtr<Expression const> m_key; 1359 RefPtr<Expression const> m_initializer; 1360 bool m_contains_direct_call_to_eval { false }; 1361}; 1362 1363class StaticInitializer final : public ClassElement { 1364public: 1365 StaticInitializer(SourceRange source_range, NonnullRefPtr<FunctionBody> function_body, bool contains_direct_call_to_eval) 1366 : ClassElement(source_range, true) 1367 , m_function_body(move(function_body)) 1368 , m_contains_direct_call_to_eval(contains_direct_call_to_eval) 1369 { 1370 } 1371 1372 virtual ElementKind class_element_kind() const override { return ElementKind::StaticInitializer; } 1373 virtual ThrowCompletionOr<ClassValue> class_element_evaluation(Interpreter&, Object& home_object) const override; 1374 1375 virtual void dump(int indent) const override; 1376 1377private: 1378 NonnullRefPtr<FunctionBody> m_function_body; 1379 bool m_contains_direct_call_to_eval { false }; 1380}; 1381 1382class SuperExpression final : public Expression { 1383public: 1384 explicit SuperExpression(SourceRange source_range) 1385 : Expression(source_range) 1386 { 1387 } 1388 1389 virtual Completion execute(Interpreter&) const override; 1390 virtual void dump(int indent) const override; 1391 1392 virtual bool is_super_expression() const override { return true; } 1393}; 1394 1395class ClassExpression final : public Expression { 1396public: 1397 ClassExpression(SourceRange source_range, DeprecatedString name, DeprecatedString source_text, RefPtr<FunctionExpression const> constructor, RefPtr<Expression const> super_class, Vector<NonnullRefPtr<ClassElement const>> elements) 1398 : Expression(source_range) 1399 , m_name(move(name)) 1400 , m_source_text(move(source_text)) 1401 , m_constructor(move(constructor)) 1402 , m_super_class(move(super_class)) 1403 , m_elements(move(elements)) 1404 { 1405 } 1406 1407 StringView name() const { return m_name; } 1408 DeprecatedString const& source_text() const { return m_source_text; } 1409 RefPtr<FunctionExpression const> constructor() const { return m_constructor; } 1410 1411 virtual Completion execute(Interpreter&) const override; 1412 virtual void dump(int indent) const override; 1413 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1414 1415 bool has_name() const { return !m_name.is_empty(); } 1416 1417 ThrowCompletionOr<ECMAScriptFunctionObject*> class_definition_evaluation(Interpreter&, DeprecatedFlyString const& binding_name = {}, DeprecatedFlyString const& class_name = {}) const; 1418 1419private: 1420 virtual bool is_class_expression() const override { return true; } 1421 1422 DeprecatedString m_name; 1423 DeprecatedString m_source_text; 1424 RefPtr<FunctionExpression const> m_constructor; 1425 RefPtr<Expression const> m_super_class; 1426 Vector<NonnullRefPtr<ClassElement const>> m_elements; 1427}; 1428 1429class ClassDeclaration final : public Declaration { 1430public: 1431 ClassDeclaration(SourceRange source_range, NonnullRefPtr<ClassExpression const> class_expression) 1432 : Declaration(source_range) 1433 , m_class_expression(move(class_expression)) 1434 { 1435 } 1436 1437 virtual Completion execute(Interpreter&) const override; 1438 virtual void dump(int indent) const override; 1439 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1440 1441 virtual ThrowCompletionOr<void> for_each_bound_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const override; 1442 1443 virtual bool is_lexical_declaration() const override { return true; } 1444 1445 StringView name() const { return m_class_expression->name(); } 1446 1447private: 1448 virtual bool is_class_declaration() const override { return true; } 1449 1450 friend ExportStatement; 1451 1452 NonnullRefPtr<ClassExpression const> m_class_expression; 1453}; 1454 1455class SpreadExpression final : public Expression { 1456public: 1457 explicit SpreadExpression(SourceRange source_range, NonnullRefPtr<Expression const> target) 1458 : Expression(source_range) 1459 , m_target(move(target)) 1460 { 1461 } 1462 1463 virtual Completion execute(Interpreter&) const override; 1464 virtual void dump(int indent) const override; 1465 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1466 1467private: 1468 NonnullRefPtr<Expression const> m_target; 1469}; 1470 1471class ThisExpression final : public Expression { 1472public: 1473 explicit ThisExpression(SourceRange source_range) 1474 : Expression(source_range) 1475 { 1476 } 1477 virtual Completion execute(Interpreter&) const override; 1478 virtual void dump(int indent) const override; 1479 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1480}; 1481 1482struct CallExpressionArgument { 1483 NonnullRefPtr<Expression const> value; 1484 bool is_spread; 1485}; 1486 1487class CallExpression : public ASTNodeWithTailArray<CallExpression, Expression, CallExpressionArgument> { 1488 friend class ASTNodeWithTailArray; 1489 1490public: 1491 using Argument = CallExpressionArgument; 1492 1493 static NonnullRefPtr<CallExpression> create(SourceRange, NonnullRefPtr<Expression const> callee, ReadonlySpan<Argument> arguments); 1494 1495 virtual Completion execute(Interpreter&) const override; 1496 virtual void dump(int indent) const override; 1497 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1498 1499 Expression const& callee() const { return m_callee; } 1500 1501 ReadonlySpan<Argument> arguments() const { return tail_span(); } 1502 1503protected: 1504 CallExpression(SourceRange source_range, NonnullRefPtr<Expression const> callee, ReadonlySpan<Argument> arguments) 1505 : ASTNodeWithTailArray(move(source_range), arguments) 1506 , m_callee(move(callee)) 1507 { 1508 } 1509 1510private: 1511 struct ThisAndCallee { 1512 Value this_value; 1513 Value callee; 1514 }; 1515 ThrowCompletionOr<ThisAndCallee> compute_this_and_callee(Interpreter&, Reference const&) const; 1516 1517protected: 1518 virtual bool is_call_expression() const override { return true; } 1519 1520 Completion throw_type_error_for_callee(Interpreter&, Value callee_value, StringView call_type) const; 1521 Optional<DeprecatedString> expression_string() const; 1522 1523 NonnullRefPtr<Expression const> m_callee; 1524}; 1525 1526class NewExpression final : public CallExpression { 1527 friend class ASTNodeWithTailArray; 1528 1529public: 1530 static NonnullRefPtr<NewExpression> create(SourceRange, NonnullRefPtr<Expression const> callee, ReadonlySpan<Argument> arguments); 1531 1532 virtual Completion execute(Interpreter&) const override; 1533 1534 virtual bool is_new_expression() const override { return true; } 1535 1536private: 1537 NewExpression(SourceRange source_range, NonnullRefPtr<Expression const> callee, ReadonlySpan<Argument> arguments) 1538 : CallExpression(move(source_range), move(callee), arguments) 1539 { 1540 } 1541}; 1542 1543static_assert(sizeof(NewExpression) == sizeof(CallExpression), "Adding members to NewExpression will break CallExpression memory layout"); 1544 1545class SuperCall final : public Expression { 1546public: 1547 // This is here to be able to make a constructor like 1548 // constructor(...args) { super(...args); } which does not use @@iterator of %Array.prototype%. 1549 enum class IsPartOfSyntheticConstructor { 1550 No, 1551 Yes, 1552 }; 1553 1554 SuperCall(SourceRange source_range, Vector<CallExpression::Argument> arguments) 1555 : Expression(source_range) 1556 , m_arguments(move(arguments)) 1557 , m_is_synthetic(IsPartOfSyntheticConstructor::No) 1558 { 1559 } 1560 1561 SuperCall(SourceRange source_range, IsPartOfSyntheticConstructor is_part_of_synthetic_constructor, CallExpression::Argument constructor_argument) 1562 : Expression(source_range) 1563 , m_arguments({ move(constructor_argument) }) 1564 , m_is_synthetic(IsPartOfSyntheticConstructor::Yes) 1565 { 1566 VERIFY(is_part_of_synthetic_constructor == IsPartOfSyntheticConstructor::Yes); 1567 } 1568 1569 virtual Completion execute(Interpreter&) const override; 1570 virtual void dump(int indent) const override; 1571 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1572 1573private: 1574 Vector<CallExpression::Argument> const m_arguments; 1575 IsPartOfSyntheticConstructor const m_is_synthetic; 1576}; 1577 1578enum class AssignmentOp { 1579 Assignment, 1580 AdditionAssignment, 1581 SubtractionAssignment, 1582 MultiplicationAssignment, 1583 DivisionAssignment, 1584 ModuloAssignment, 1585 ExponentiationAssignment, 1586 BitwiseAndAssignment, 1587 BitwiseOrAssignment, 1588 BitwiseXorAssignment, 1589 LeftShiftAssignment, 1590 RightShiftAssignment, 1591 UnsignedRightShiftAssignment, 1592 AndAssignment, 1593 OrAssignment, 1594 NullishAssignment, 1595}; 1596 1597class AssignmentExpression final : public Expression { 1598public: 1599 AssignmentExpression(SourceRange source_range, AssignmentOp op, NonnullRefPtr<Expression const> lhs, NonnullRefPtr<Expression const> rhs) 1600 : Expression(source_range) 1601 , m_op(op) 1602 , m_lhs(move(lhs)) 1603 , m_rhs(move(rhs)) 1604 { 1605 } 1606 1607 AssignmentExpression(SourceRange source_range, AssignmentOp op, NonnullRefPtr<BindingPattern const> lhs, NonnullRefPtr<Expression const> rhs) 1608 : Expression(source_range) 1609 , m_op(op) 1610 , m_lhs(move(lhs)) 1611 , m_rhs(move(rhs)) 1612 { 1613 } 1614 1615 virtual Completion execute(Interpreter&) const override; 1616 virtual void dump(int indent) const override; 1617 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1618 1619private: 1620 AssignmentOp m_op; 1621 Variant<NonnullRefPtr<Expression const>, NonnullRefPtr<BindingPattern const>> m_lhs; 1622 NonnullRefPtr<Expression const> m_rhs; 1623}; 1624 1625enum class UpdateOp { 1626 Increment, 1627 Decrement, 1628}; 1629 1630class UpdateExpression final : public Expression { 1631public: 1632 UpdateExpression(SourceRange source_range, UpdateOp op, NonnullRefPtr<Expression const> argument, bool prefixed = false) 1633 : Expression(source_range) 1634 , m_op(op) 1635 , m_argument(move(argument)) 1636 , m_prefixed(prefixed) 1637 { 1638 } 1639 1640 virtual Completion execute(Interpreter&) const override; 1641 virtual void dump(int indent) const override; 1642 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1643 1644private: 1645 virtual bool is_update_expression() const override { return true; } 1646 1647 UpdateOp m_op; 1648 NonnullRefPtr<Expression const> m_argument; 1649 bool m_prefixed; 1650}; 1651 1652enum class DeclarationKind { 1653 Var, 1654 Let, 1655 Const, 1656}; 1657 1658class VariableDeclarator final : public ASTNode { 1659public: 1660 VariableDeclarator(SourceRange source_range, NonnullRefPtr<Identifier const> id) 1661 : ASTNode(source_range) 1662 , m_target(move(id)) 1663 { 1664 } 1665 1666 VariableDeclarator(SourceRange source_range, NonnullRefPtr<Identifier const> target, RefPtr<Expression const> init) 1667 : ASTNode(source_range) 1668 , m_target(move(target)) 1669 , m_init(move(init)) 1670 { 1671 } 1672 1673 VariableDeclarator(SourceRange source_range, Variant<NonnullRefPtr<Identifier const>, NonnullRefPtr<BindingPattern const>> target, RefPtr<Expression const> init) 1674 : ASTNode(source_range) 1675 , m_target(move(target)) 1676 , m_init(move(init)) 1677 { 1678 } 1679 1680 auto& target() const { return m_target; } 1681 Expression const* init() const { return m_init; } 1682 1683 virtual Completion execute(Interpreter&) const override; 1684 virtual void dump(int indent) const override; 1685 1686private: 1687 Variant<NonnullRefPtr<Identifier const>, NonnullRefPtr<BindingPattern const>> m_target; 1688 RefPtr<Expression const> m_init; 1689}; 1690 1691class VariableDeclaration final : public Declaration { 1692public: 1693 VariableDeclaration(SourceRange source_range, DeclarationKind declaration_kind, Vector<NonnullRefPtr<VariableDeclarator const>> declarations) 1694 : Declaration(source_range) 1695 , m_declaration_kind(declaration_kind) 1696 , m_declarations(move(declarations)) 1697 { 1698 } 1699 1700 DeclarationKind declaration_kind() const { return m_declaration_kind; } 1701 1702 virtual Completion execute(Interpreter&) const override; 1703 virtual void dump(int indent) const override; 1704 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1705 1706 Vector<NonnullRefPtr<VariableDeclarator const>> const& declarations() const { return m_declarations; } 1707 1708 virtual ThrowCompletionOr<void> for_each_bound_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const override; 1709 1710 virtual bool is_constant_declaration() const override { return m_declaration_kind == DeclarationKind::Const; }; 1711 1712 virtual bool is_lexical_declaration() const override { return m_declaration_kind != DeclarationKind::Var; } 1713 1714private: 1715 virtual bool is_variable_declaration() const override { return true; } 1716 1717 DeclarationKind m_declaration_kind; 1718 Vector<NonnullRefPtr<VariableDeclarator const>> m_declarations; 1719}; 1720 1721class UsingDeclaration final : public Declaration { 1722public: 1723 UsingDeclaration(SourceRange source_range, Vector<NonnullRefPtr<VariableDeclarator const>> declarations) 1724 : Declaration(move(source_range)) 1725 , m_declarations(move(declarations)) 1726 { 1727 } 1728 1729 virtual Completion execute(Interpreter&) const override; 1730 virtual void dump(int indent) const override; 1731 1732 virtual ThrowCompletionOr<void> for_each_bound_name(ThrowCompletionOrVoidCallback<DeprecatedFlyString const&>&& callback) const override; 1733 1734 virtual bool is_constant_declaration() const override { return true; }; 1735 1736 virtual bool is_lexical_declaration() const override { return true; } 1737 1738 Vector<NonnullRefPtr<VariableDeclarator const>> const& declarations() const { return m_declarations; } 1739 1740private: 1741 Vector<NonnullRefPtr<VariableDeclarator const>> m_declarations; 1742}; 1743 1744class ObjectProperty final : public ASTNode { 1745public: 1746 enum class Type : u8 { 1747 KeyValue, 1748 Getter, 1749 Setter, 1750 Spread, 1751 ProtoSetter, 1752 }; 1753 1754 ObjectProperty(SourceRange source_range, NonnullRefPtr<Expression const> key, RefPtr<Expression const> value, Type property_type, bool is_method) 1755 : ASTNode(source_range) 1756 , m_property_type(property_type) 1757 , m_is_method(is_method) 1758 , m_key(move(key)) 1759 , m_value(move(value)) 1760 { 1761 } 1762 1763 Expression const& key() const { return m_key; } 1764 Expression const& value() const 1765 { 1766 VERIFY(m_value); 1767 return *m_value; 1768 } 1769 1770 Type type() const { return m_property_type; } 1771 bool is_method() const { return m_is_method; } 1772 1773 virtual void dump(int indent) const override; 1774 virtual Completion execute(Interpreter&) const override; 1775 1776private: 1777 Type m_property_type; 1778 bool m_is_method { false }; 1779 NonnullRefPtr<Expression const> m_key; 1780 RefPtr<Expression const> m_value; 1781}; 1782 1783class ObjectExpression final : public Expression { 1784public: 1785 explicit ObjectExpression(SourceRange source_range, Vector<NonnullRefPtr<ObjectProperty>> properties = {}) 1786 : Expression(source_range) 1787 , m_properties(move(properties)) 1788 { 1789 } 1790 1791 virtual Completion execute(Interpreter&) const override; 1792 virtual void dump(int indent) const override; 1793 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1794 1795private: 1796 virtual bool is_object_expression() const override { return true; } 1797 1798 Vector<NonnullRefPtr<ObjectProperty>> m_properties; 1799}; 1800 1801class ArrayExpression final : public Expression { 1802public: 1803 ArrayExpression(SourceRange source_range, Vector<RefPtr<Expression const>> elements) 1804 : Expression(source_range) 1805 , m_elements(move(elements)) 1806 { 1807 } 1808 1809 Vector<RefPtr<Expression const>> const& elements() const { return m_elements; } 1810 1811 virtual Completion execute(Interpreter&) const override; 1812 virtual void dump(int indent) const override; 1813 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1814 1815private: 1816 virtual bool is_array_expression() const override { return true; } 1817 1818 Vector<RefPtr<Expression const>> m_elements; 1819}; 1820 1821class TemplateLiteral final : public Expression { 1822public: 1823 TemplateLiteral(SourceRange source_range, Vector<NonnullRefPtr<Expression const>> expressions) 1824 : Expression(source_range) 1825 , m_expressions(move(expressions)) 1826 { 1827 } 1828 1829 TemplateLiteral(SourceRange source_range, Vector<NonnullRefPtr<Expression const>> expressions, Vector<NonnullRefPtr<Expression const>> raw_strings) 1830 : Expression(source_range) 1831 , m_expressions(move(expressions)) 1832 , m_raw_strings(move(raw_strings)) 1833 { 1834 } 1835 1836 virtual Completion execute(Interpreter&) const override; 1837 virtual void dump(int indent) const override; 1838 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1839 1840 Vector<NonnullRefPtr<Expression const>> const& expressions() const { return m_expressions; } 1841 Vector<NonnullRefPtr<Expression const>> const& raw_strings() const { return m_raw_strings; } 1842 1843private: 1844 Vector<NonnullRefPtr<Expression const>> const m_expressions; 1845 Vector<NonnullRefPtr<Expression const>> const m_raw_strings; 1846}; 1847 1848class TaggedTemplateLiteral final : public Expression { 1849public: 1850 TaggedTemplateLiteral(SourceRange source_range, NonnullRefPtr<Expression const> tag, NonnullRefPtr<TemplateLiteral const> template_literal) 1851 : Expression(source_range) 1852 , m_tag(move(tag)) 1853 , m_template_literal(move(template_literal)) 1854 { 1855 } 1856 1857 virtual Completion execute(Interpreter&) const override; 1858 virtual void dump(int indent) const override; 1859 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1860 1861 ThrowCompletionOr<Value> get_template_object(Interpreter&) const; 1862 1863private: 1864 NonnullRefPtr<Expression const> const m_tag; 1865 NonnullRefPtr<TemplateLiteral const> const m_template_literal; 1866 mutable HashMap<Realm*, Handle<Array>> m_cached_values; 1867}; 1868 1869class MemberExpression final : public Expression { 1870public: 1871 MemberExpression(SourceRange source_range, NonnullRefPtr<Expression const> object, NonnullRefPtr<Expression const> property, bool computed = false) 1872 : Expression(source_range) 1873 , m_computed(computed) 1874 , m_object(move(object)) 1875 , m_property(move(property)) 1876 { 1877 } 1878 1879 virtual Completion execute(Interpreter&) const override; 1880 virtual void dump(int indent) const override; 1881 virtual ThrowCompletionOr<Reference> to_reference(Interpreter&) const override; 1882 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1883 1884 bool is_computed() const { return m_computed; } 1885 Expression const& object() const { return *m_object; } 1886 Expression const& property() const { return *m_property; } 1887 1888 DeprecatedString to_string_approximation() const; 1889 1890 bool ends_in_private_name() const; 1891 1892private: 1893 virtual bool is_member_expression() const override { return true; } 1894 1895 bool m_computed { false }; 1896 NonnullRefPtr<Expression const> m_object; 1897 NonnullRefPtr<Expression const> m_property; 1898}; 1899 1900class OptionalChain final : public Expression { 1901public: 1902 enum class Mode { 1903 Optional, 1904 NotOptional, 1905 }; 1906 1907 struct Call { 1908 Vector<CallExpression::Argument> arguments; 1909 Mode mode; 1910 }; 1911 struct ComputedReference { 1912 NonnullRefPtr<Expression const> expression; 1913 Mode mode; 1914 }; 1915 struct MemberReference { 1916 NonnullRefPtr<Identifier const> identifier; 1917 Mode mode; 1918 }; 1919 struct PrivateMemberReference { 1920 NonnullRefPtr<PrivateIdentifier const> private_identifier; 1921 Mode mode; 1922 }; 1923 1924 using Reference = Variant<Call, ComputedReference, MemberReference, PrivateMemberReference>; 1925 1926 OptionalChain(SourceRange source_range, NonnullRefPtr<Expression const> base, Vector<Reference> references) 1927 : Expression(source_range) 1928 , m_base(move(base)) 1929 , m_references(move(references)) 1930 { 1931 } 1932 1933 virtual Completion execute(Interpreter&) const override; 1934 virtual ThrowCompletionOr<JS::Reference> to_reference(Interpreter&) const override; 1935 virtual void dump(int indent) const override; 1936 1937private: 1938 struct ReferenceAndValue { 1939 JS::Reference reference; 1940 Value value; 1941 }; 1942 ThrowCompletionOr<ReferenceAndValue> to_reference_and_value(Interpreter&) const; 1943 1944 NonnullRefPtr<Expression const> m_base; 1945 Vector<Reference> m_references; 1946}; 1947 1948class MetaProperty final : public Expression { 1949public: 1950 enum class Type { 1951 NewTarget, 1952 ImportMeta, 1953 }; 1954 1955 MetaProperty(SourceRange source_range, Type type) 1956 : Expression(source_range) 1957 , m_type(type) 1958 { 1959 } 1960 1961 virtual Completion execute(Interpreter&) const override; 1962 virtual void dump(int indent) const override; 1963 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 1964 1965private: 1966 Type m_type; 1967}; 1968 1969class ImportCall final : public Expression { 1970public: 1971 ImportCall(SourceRange source_range, NonnullRefPtr<Expression const> specifier, RefPtr<Expression const> options) 1972 : Expression(source_range) 1973 , m_specifier(move(specifier)) 1974 , m_options(move(options)) 1975 { 1976 } 1977 1978 virtual void dump(int indent) const override; 1979 virtual Completion execute(Interpreter&) const override; 1980 1981private: 1982 virtual bool is_import_call() const override { return true; } 1983 1984 NonnullRefPtr<Expression const> m_specifier; 1985 RefPtr<Expression const> m_options; 1986}; 1987 1988class ConditionalExpression final : public Expression { 1989public: 1990 ConditionalExpression(SourceRange source_range, NonnullRefPtr<Expression const> test, NonnullRefPtr<Expression const> consequent, NonnullRefPtr<Expression const> alternate) 1991 : Expression(source_range) 1992 , m_test(move(test)) 1993 , m_consequent(move(consequent)) 1994 , m_alternate(move(alternate)) 1995 { 1996 } 1997 1998 virtual void dump(int indent) const override; 1999 virtual Completion execute(Interpreter&) const override; 2000 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 2001 2002private: 2003 NonnullRefPtr<Expression const> m_test; 2004 NonnullRefPtr<Expression const> m_consequent; 2005 NonnullRefPtr<Expression const> m_alternate; 2006}; 2007 2008class CatchClause final : public ASTNode { 2009public: 2010 CatchClause(SourceRange source_range, DeprecatedFlyString parameter, NonnullRefPtr<BlockStatement const> body) 2011 : ASTNode(source_range) 2012 , m_parameter(move(parameter)) 2013 , m_body(move(body)) 2014 { 2015 } 2016 2017 CatchClause(SourceRange source_range, NonnullRefPtr<BindingPattern const> parameter, NonnullRefPtr<BlockStatement const> body) 2018 : ASTNode(source_range) 2019 , m_parameter(move(parameter)) 2020 , m_body(move(body)) 2021 { 2022 } 2023 2024 auto& parameter() const { return m_parameter; } 2025 BlockStatement const& body() const { return m_body; } 2026 2027 virtual void dump(int indent) const override; 2028 virtual Completion execute(Interpreter&) const override; 2029 2030private: 2031 Variant<DeprecatedFlyString, NonnullRefPtr<BindingPattern const>> m_parameter; 2032 NonnullRefPtr<BlockStatement const> m_body; 2033}; 2034 2035class TryStatement final : public Statement { 2036public: 2037 TryStatement(SourceRange source_range, NonnullRefPtr<BlockStatement const> block, RefPtr<CatchClause const> handler, RefPtr<BlockStatement const> finalizer) 2038 : Statement(source_range) 2039 , m_block(move(block)) 2040 , m_handler(move(handler)) 2041 , m_finalizer(move(finalizer)) 2042 { 2043 } 2044 2045 BlockStatement const& block() const { return m_block; } 2046 CatchClause const* handler() const { return m_handler; } 2047 BlockStatement const* finalizer() const { return m_finalizer; } 2048 2049 virtual void dump(int indent) const override; 2050 virtual Completion execute(Interpreter&) const override; 2051 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 2052 2053private: 2054 NonnullRefPtr<BlockStatement const> m_block; 2055 RefPtr<CatchClause const> m_handler; 2056 RefPtr<BlockStatement const> m_finalizer; 2057}; 2058 2059class ThrowStatement final : public Statement { 2060public: 2061 explicit ThrowStatement(SourceRange source_range, NonnullRefPtr<Expression const> argument) 2062 : Statement(source_range) 2063 , m_argument(move(argument)) 2064 { 2065 } 2066 2067 Expression const& argument() const { return m_argument; } 2068 2069 virtual void dump(int indent) const override; 2070 virtual Completion execute(Interpreter&) const override; 2071 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 2072 2073private: 2074 NonnullRefPtr<Expression const> m_argument; 2075}; 2076 2077class SwitchCase final : public ScopeNode { 2078public: 2079 SwitchCase(SourceRange source_range, RefPtr<Expression const> test) 2080 : ScopeNode(source_range) 2081 , m_test(move(test)) 2082 { 2083 } 2084 2085 Expression const* test() const { return m_test; } 2086 2087 virtual void dump(int indent) const override; 2088 virtual Completion execute(Interpreter&) const override; 2089 2090private: 2091 RefPtr<Expression const> m_test; 2092}; 2093 2094class SwitchStatement final : public ScopeNode { 2095public: 2096 SwitchStatement(SourceRange source_range, NonnullRefPtr<Expression const> discriminant) 2097 : ScopeNode(source_range) 2098 , m_discriminant(move(discriminant)) 2099 { 2100 } 2101 2102 virtual void dump(int indent) const override; 2103 virtual Completion execute(Interpreter&) const override; 2104 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 2105 virtual Bytecode::CodeGenerationErrorOr<void> generate_labelled_evaluation(Bytecode::Generator&, Vector<DeprecatedFlyString> const&) const; 2106 2107 Completion execute_impl(Interpreter&) const; 2108 void add_case(NonnullRefPtr<SwitchCase const> switch_case) { m_cases.append(move(switch_case)); } 2109 2110private: 2111 NonnullRefPtr<Expression const> m_discriminant; 2112 Vector<NonnullRefPtr<SwitchCase const>> m_cases; 2113}; 2114 2115class BreakStatement final : public Statement { 2116public: 2117 BreakStatement(SourceRange source_range, DeprecatedFlyString target_label) 2118 : Statement(source_range) 2119 , m_target_label(move(target_label)) 2120 { 2121 } 2122 2123 virtual Completion execute(Interpreter&) const override; 2124 2125 DeprecatedFlyString const& target_label() const { return m_target_label; } 2126 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 2127 2128private: 2129 DeprecatedFlyString m_target_label; 2130}; 2131 2132class ContinueStatement final : public Statement { 2133public: 2134 ContinueStatement(SourceRange source_range, DeprecatedFlyString target_label) 2135 : Statement(source_range) 2136 , m_target_label(move(target_label)) 2137 { 2138 } 2139 2140 virtual Completion execute(Interpreter&) const override; 2141 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 2142 2143 DeprecatedFlyString const& target_label() const { return m_target_label; } 2144 2145private: 2146 DeprecatedFlyString m_target_label; 2147}; 2148 2149class DebuggerStatement final : public Statement { 2150public: 2151 explicit DebuggerStatement(SourceRange source_range) 2152 : Statement(source_range) 2153 { 2154 } 2155 2156 virtual Completion execute(Interpreter&) const override; 2157 virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override; 2158}; 2159 2160class SyntheticReferenceExpression final : public Expression { 2161public: 2162 explicit SyntheticReferenceExpression(SourceRange source_range, Reference reference, Value value) 2163 : Expression(source_range) 2164 , m_reference(move(reference)) 2165 , m_value(value) 2166 { 2167 } 2168 2169 virtual Completion execute(Interpreter&) const override { return m_value; } 2170 virtual ThrowCompletionOr<Reference> to_reference(Interpreter&) const override { return m_reference; } 2171 2172private: 2173 Reference m_reference; 2174 Value m_value; 2175}; 2176 2177template<> 2178inline bool ASTNode::fast_is<NewExpression>() const { return is_new_expression(); } 2179 2180template<> 2181inline bool ASTNode::fast_is<MemberExpression>() const { return is_member_expression(); } 2182 2183template<> 2184inline bool ASTNode::fast_is<SuperExpression>() const { return is_super_expression(); } 2185 2186template<> 2187inline bool ASTNode::fast_is<FunctionExpression>() const { return is_function_expression(); } 2188 2189template<> 2190inline bool ASTNode::fast_is<ClassExpression>() const { return is_class_expression(); } 2191 2192template<> 2193inline bool ASTNode::fast_is<Identifier>() const { return is_identifier(); } 2194 2195template<> 2196inline bool ASTNode::fast_is<PrivateIdentifier>() const { return is_private_identifier(); } 2197 2198template<> 2199inline bool ASTNode::fast_is<ExpressionStatement>() const { return is_expression_statement(); } 2200 2201template<> 2202inline bool ASTNode::fast_is<ScopeNode>() const { return is_scope_node(); } 2203 2204template<> 2205inline bool ASTNode::fast_is<Program>() const { return is_program(); } 2206 2207template<> 2208inline bool ASTNode::fast_is<ClassDeclaration>() const { return is_class_declaration(); } 2209 2210template<> 2211inline bool ASTNode::fast_is<FunctionDeclaration>() const { return is_function_declaration(); } 2212 2213template<> 2214inline bool ASTNode::fast_is<VariableDeclaration>() const { return is_variable_declaration(); } 2215 2216template<> 2217inline bool ASTNode::fast_is<ArrayExpression>() const { return is_array_expression(); } 2218 2219template<> 2220inline bool ASTNode::fast_is<ObjectExpression>() const { return is_object_expression(); } 2221 2222template<> 2223inline bool ASTNode::fast_is<ImportCall>() const { return is_import_call(); } 2224 2225template<> 2226inline bool ASTNode::fast_is<StringLiteral>() const { return is_string_literal(); } 2227 2228template<> 2229inline bool ASTNode::fast_is<UpdateExpression>() const { return is_update_expression(); } 2230 2231template<> 2232inline bool ASTNode::fast_is<CallExpression>() const { return is_call_expression(); } 2233 2234template<> 2235inline bool ASTNode::fast_is<LabelledStatement>() const { return is_labelled_statement(); } 2236 2237template<> 2238inline bool ASTNode::fast_is<IterationStatement>() const { return is_iteration_statement(); } 2239 2240template<> 2241inline bool ASTNode::fast_is<ClassMethod>() const { return is_class_method(); } 2242 2243}