Serenity Operating System
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}