AST.h 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2020, Linus Groh <mail@linusgroh.de>
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice, this
  10. * list of conditions and the following disclaimer.
  11. *
  12. * 2. Redistributions in binary form must reproduce the above copyright notice,
  13. * this list of conditions and the following disclaimer in the documentation
  14. * and/or other materials provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  20. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #pragma once
  28. #include <AK/FlyString.h>
  29. #include <AK/HashMap.h>
  30. #include <AK/NonnullRefPtrVector.h>
  31. #include <AK/RefPtr.h>
  32. #include <AK/String.h>
  33. #include <AK/Vector.h>
  34. #include <LibJS/Forward.h>
  35. #include <LibJS/Runtime/PropertyName.h>
  36. #include <LibJS/Runtime/Value.h>
  37. namespace JS {
  38. class VariableDeclaration;
  39. class FunctionDeclaration;
  40. template<class T, class... Args>
  41. static inline NonnullRefPtr<T>
  42. create_ast_node(Args&&... args)
  43. {
  44. return adopt(*new T(forward<Args>(args)...));
  45. }
  46. class ASTNode : public RefCounted<ASTNode> {
  47. public:
  48. virtual ~ASTNode() { }
  49. virtual const char* class_name() const = 0;
  50. virtual Value execute(Interpreter&, GlobalObject&) const = 0;
  51. virtual void dump(int indent) const;
  52. virtual bool is_identifier() const { return false; }
  53. virtual bool is_spread_expression() const { return false; }
  54. virtual bool is_member_expression() const { return false; }
  55. virtual bool is_scope_node() const { return false; }
  56. virtual bool is_program() const { return false; }
  57. virtual bool is_variable_declaration() const { return false; }
  58. virtual bool is_call_expression() const { return false; }
  59. virtual bool is_new_expression() const { return false; }
  60. virtual bool is_super_expression() const { return false; }
  61. protected:
  62. ASTNode() { }
  63. private:
  64. };
  65. class Statement : public ASTNode {
  66. public:
  67. const FlyString& label() const { return m_label; }
  68. void set_label(FlyString string) { m_label = string; }
  69. protected:
  70. FlyString m_label;
  71. };
  72. class EmptyStatement final : public Statement {
  73. public:
  74. Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
  75. const char* class_name() const override { return "EmptyStatement"; }
  76. };
  77. class ErrorStatement final : public Statement {
  78. public:
  79. Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
  80. const char* class_name() const override { return "ErrorStatement"; }
  81. };
  82. class ExpressionStatement final : public Statement {
  83. public:
  84. ExpressionStatement(NonnullRefPtr<Expression> expression)
  85. : m_expression(move(expression))
  86. {
  87. }
  88. Value execute(Interpreter&, GlobalObject&) const override;
  89. const char* class_name() const override { return "ExpressionStatement"; }
  90. virtual void dump(int indent) const override;
  91. private:
  92. NonnullRefPtr<Expression> m_expression;
  93. };
  94. class ScopeNode : public Statement {
  95. public:
  96. template<typename T, typename... Args>
  97. T& append(Args&&... args)
  98. {
  99. auto child = create_ast_node<T>(forward<Args>(args)...);
  100. m_children.append(move(child));
  101. return static_cast<T&>(m_children.last());
  102. }
  103. void append(NonnullRefPtr<Statement> child)
  104. {
  105. m_children.append(move(child));
  106. }
  107. const NonnullRefPtrVector<Statement>& children() const { return m_children; }
  108. virtual Value execute(Interpreter&, GlobalObject&) const override;
  109. virtual void dump(int indent) const override;
  110. void add_variables(NonnullRefPtrVector<VariableDeclaration>);
  111. void add_functions(NonnullRefPtrVector<FunctionDeclaration>);
  112. const NonnullRefPtrVector<VariableDeclaration>& variables() const { return m_variables; }
  113. const NonnullRefPtrVector<FunctionDeclaration>& functions() const { return m_functions; }
  114. protected:
  115. ScopeNode() { }
  116. private:
  117. virtual bool is_scope_node() const final { return true; }
  118. NonnullRefPtrVector<Statement> m_children;
  119. NonnullRefPtrVector<VariableDeclaration> m_variables;
  120. NonnullRefPtrVector<FunctionDeclaration> m_functions;
  121. };
  122. class Program final : public ScopeNode {
  123. public:
  124. Program() { }
  125. virtual Value execute(Interpreter&, GlobalObject&) const override;
  126. bool is_strict_mode() const { return m_is_strict_mode; }
  127. void set_strict_mode() { m_is_strict_mode = true; }
  128. private:
  129. bool m_is_strict_mode { false };
  130. virtual bool is_program() const override { return true; }
  131. virtual const char* class_name() const override { return "Program"; }
  132. };
  133. class BlockStatement final : public ScopeNode {
  134. public:
  135. BlockStatement() { }
  136. private:
  137. virtual const char* class_name() const override { return "BlockStatement"; }
  138. };
  139. class Expression : public ASTNode {
  140. public:
  141. virtual Reference to_reference(Interpreter&, GlobalObject&) const;
  142. };
  143. class Declaration : public Statement {
  144. };
  145. class ErrorDeclaration final : public Declaration {
  146. public:
  147. Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
  148. const char* class_name() const override { return "ErrorDeclaration"; }
  149. };
  150. class FunctionNode {
  151. public:
  152. struct Parameter {
  153. FlyString name;
  154. RefPtr<Expression> default_value;
  155. bool is_rest { false };
  156. };
  157. const FlyString& name() const { return m_name; }
  158. const Statement& body() const { return *m_body; }
  159. const Vector<Parameter>& parameters() const { return m_parameters; };
  160. i32 function_length() const { return m_function_length; }
  161. bool is_strict_mode() const { return m_is_strict_mode; }
  162. protected:
  163. FunctionNode(const FlyString& name, NonnullRefPtr<Statement> body, Vector<Parameter> parameters, i32 function_length, NonnullRefPtrVector<VariableDeclaration> variables, bool is_strict_mode)
  164. : m_name(name)
  165. , m_body(move(body))
  166. , m_parameters(move(parameters))
  167. , m_variables(move(variables))
  168. , m_function_length(function_length)
  169. , m_is_strict_mode(is_strict_mode)
  170. {
  171. }
  172. void dump(int indent, const char* class_name) const;
  173. const NonnullRefPtrVector<VariableDeclaration>& variables() const { return m_variables; }
  174. private:
  175. FlyString m_name;
  176. NonnullRefPtr<Statement> m_body;
  177. const Vector<Parameter> m_parameters;
  178. NonnullRefPtrVector<VariableDeclaration> m_variables;
  179. const i32 m_function_length;
  180. bool m_is_strict_mode;
  181. };
  182. class FunctionDeclaration final
  183. : public Declaration
  184. , public FunctionNode {
  185. public:
  186. static bool must_have_name() { return true; }
  187. FunctionDeclaration(const FlyString& name, NonnullRefPtr<Statement> body, Vector<Parameter> parameters, i32 function_length, NonnullRefPtrVector<VariableDeclaration> variables, bool is_strict_mode = false)
  188. : FunctionNode(name, move(body), move(parameters), function_length, move(variables), is_strict_mode)
  189. {
  190. }
  191. virtual Value execute(Interpreter&, GlobalObject&) const override;
  192. virtual void dump(int indent) const override;
  193. private:
  194. virtual const char* class_name() const override { return "FunctionDeclaration"; }
  195. };
  196. class FunctionExpression final
  197. : public Expression
  198. , public FunctionNode {
  199. public:
  200. static bool must_have_name() { return false; }
  201. FunctionExpression(const FlyString& name, NonnullRefPtr<Statement> body, Vector<Parameter> parameters, i32 function_length, NonnullRefPtrVector<VariableDeclaration> variables, bool is_strict_mode, bool is_arrow_function = false)
  202. : FunctionNode(name, move(body), move(parameters), function_length, move(variables), is_strict_mode)
  203. , m_is_arrow_function(is_arrow_function)
  204. {
  205. }
  206. virtual Value execute(Interpreter&, GlobalObject&) const override;
  207. virtual void dump(int indent) const override;
  208. private:
  209. virtual const char* class_name() const override { return "FunctionExpression"; }
  210. bool m_is_arrow_function;
  211. };
  212. class ErrorExpression final : public Expression {
  213. public:
  214. Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
  215. const char* class_name() const override { return "ErrorExpression"; }
  216. };
  217. class ReturnStatement final : public Statement {
  218. public:
  219. explicit ReturnStatement(RefPtr<Expression> argument)
  220. : m_argument(move(argument))
  221. {
  222. }
  223. const Expression* argument() const { return m_argument; }
  224. virtual Value execute(Interpreter&, GlobalObject&) const override;
  225. virtual void dump(int indent) const override;
  226. private:
  227. virtual const char* class_name() const override { return "ReturnStatement"; }
  228. RefPtr<Expression> m_argument;
  229. };
  230. class IfStatement final : public Statement {
  231. public:
  232. IfStatement(NonnullRefPtr<Expression> predicate, NonnullRefPtr<Statement> consequent, RefPtr<Statement> alternate)
  233. : m_predicate(move(predicate))
  234. , m_consequent(move(consequent))
  235. , m_alternate(move(alternate))
  236. {
  237. }
  238. const Expression& predicate() const { return *m_predicate; }
  239. const Statement& consequent() const { return *m_consequent; }
  240. const Statement* alternate() const { return m_alternate; }
  241. virtual Value execute(Interpreter&, GlobalObject&) const override;
  242. virtual void dump(int indent) const override;
  243. private:
  244. virtual const char* class_name() const override { return "IfStatement"; }
  245. NonnullRefPtr<Expression> m_predicate;
  246. NonnullRefPtr<Statement> m_consequent;
  247. RefPtr<Statement> m_alternate;
  248. };
  249. class WhileStatement final : public Statement {
  250. public:
  251. WhileStatement(NonnullRefPtr<Expression> test, NonnullRefPtr<Statement> body)
  252. : m_test(move(test))
  253. , m_body(move(body))
  254. {
  255. }
  256. const Expression& test() const { return *m_test; }
  257. const Statement& body() const { return *m_body; }
  258. virtual Value execute(Interpreter&, GlobalObject&) const override;
  259. virtual void dump(int indent) const override;
  260. private:
  261. virtual const char* class_name() const override { return "WhileStatement"; }
  262. NonnullRefPtr<Expression> m_test;
  263. NonnullRefPtr<Statement> m_body;
  264. };
  265. class DoWhileStatement final : public Statement {
  266. public:
  267. DoWhileStatement(NonnullRefPtr<Expression> test, NonnullRefPtr<Statement> body)
  268. : m_test(move(test))
  269. , m_body(move(body))
  270. {
  271. }
  272. const Expression& test() const { return *m_test; }
  273. const Statement& body() const { return *m_body; }
  274. virtual Value execute(Interpreter&, GlobalObject&) const override;
  275. virtual void dump(int indent) const override;
  276. private:
  277. virtual const char* class_name() const override { return "DoWhileStatement"; }
  278. NonnullRefPtr<Expression> m_test;
  279. NonnullRefPtr<Statement> m_body;
  280. };
  281. class ForStatement final : public Statement {
  282. public:
  283. ForStatement(RefPtr<ASTNode> init, RefPtr<Expression> test, RefPtr<Expression> update, NonnullRefPtr<Statement> body)
  284. : m_init(move(init))
  285. , m_test(move(test))
  286. , m_update(move(update))
  287. , m_body(move(body))
  288. {
  289. }
  290. const ASTNode* init() const { return m_init; }
  291. const Expression* test() const { return m_test; }
  292. const Expression* update() const { return m_update; }
  293. const Statement& body() const { return *m_body; }
  294. virtual Value execute(Interpreter&, GlobalObject&) const override;
  295. virtual void dump(int indent) const override;
  296. private:
  297. virtual const char* class_name() const override { return "ForStatement"; }
  298. RefPtr<ASTNode> m_init;
  299. RefPtr<Expression> m_test;
  300. RefPtr<Expression> m_update;
  301. NonnullRefPtr<Statement> m_body;
  302. };
  303. class ForInStatement final : public Statement {
  304. public:
  305. ForInStatement(NonnullRefPtr<ASTNode> lhs, NonnullRefPtr<Expression> rhs, NonnullRefPtr<Statement> body)
  306. : m_lhs(move(lhs))
  307. , m_rhs(move(rhs))
  308. , m_body(move(body))
  309. {
  310. }
  311. const ASTNode& lhs() const { return *m_lhs; }
  312. const Expression& rhs() const { return *m_rhs; }
  313. const Statement& body() const { return *m_body; }
  314. virtual Value execute(Interpreter&, GlobalObject&) const override;
  315. virtual void dump(int indent) const override;
  316. private:
  317. virtual const char* class_name() const override { return "ForInStatement"; }
  318. NonnullRefPtr<ASTNode> m_lhs;
  319. NonnullRefPtr<Expression> m_rhs;
  320. NonnullRefPtr<Statement> m_body;
  321. };
  322. class ForOfStatement final : public Statement {
  323. public:
  324. ForOfStatement(NonnullRefPtr<ASTNode> lhs, NonnullRefPtr<Expression> rhs, NonnullRefPtr<Statement> body)
  325. : m_lhs(move(lhs))
  326. , m_rhs(move(rhs))
  327. , m_body(move(body))
  328. {
  329. }
  330. const ASTNode& lhs() const { return *m_lhs; }
  331. const Expression& rhs() const { return *m_rhs; }
  332. const Statement& body() const { return *m_body; }
  333. virtual Value execute(Interpreter&, GlobalObject&) const override;
  334. virtual void dump(int indent) const override;
  335. private:
  336. virtual const char* class_name() const override { return "ForOfStatement"; }
  337. NonnullRefPtr<ASTNode> m_lhs;
  338. NonnullRefPtr<Expression> m_rhs;
  339. NonnullRefPtr<Statement> m_body;
  340. };
  341. enum class BinaryOp {
  342. Addition,
  343. Subtraction,
  344. Multiplication,
  345. Division,
  346. Modulo,
  347. Exponentiation,
  348. TypedEquals,
  349. TypedInequals,
  350. AbstractEquals,
  351. AbstractInequals,
  352. GreaterThan,
  353. GreaterThanEquals,
  354. LessThan,
  355. LessThanEquals,
  356. BitwiseAnd,
  357. BitwiseOr,
  358. BitwiseXor,
  359. LeftShift,
  360. RightShift,
  361. UnsignedRightShift,
  362. In,
  363. InstanceOf,
  364. };
  365. class BinaryExpression final : public Expression {
  366. public:
  367. BinaryExpression(BinaryOp op, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  368. : m_op(op)
  369. , m_lhs(move(lhs))
  370. , m_rhs(move(rhs))
  371. {
  372. }
  373. virtual Value execute(Interpreter&, GlobalObject&) const override;
  374. virtual void dump(int indent) const override;
  375. private:
  376. virtual const char* class_name() const override { return "BinaryExpression"; }
  377. BinaryOp m_op;
  378. NonnullRefPtr<Expression> m_lhs;
  379. NonnullRefPtr<Expression> m_rhs;
  380. };
  381. enum class LogicalOp {
  382. And,
  383. Or,
  384. NullishCoalescing,
  385. };
  386. class LogicalExpression final : public Expression {
  387. public:
  388. LogicalExpression(LogicalOp op, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  389. : m_op(op)
  390. , m_lhs(move(lhs))
  391. , m_rhs(move(rhs))
  392. {
  393. }
  394. virtual Value execute(Interpreter&, GlobalObject&) const override;
  395. virtual void dump(int indent) const override;
  396. private:
  397. virtual const char* class_name() const override { return "LogicalExpression"; }
  398. LogicalOp m_op;
  399. NonnullRefPtr<Expression> m_lhs;
  400. NonnullRefPtr<Expression> m_rhs;
  401. };
  402. enum class UnaryOp {
  403. BitwiseNot,
  404. Not,
  405. Plus,
  406. Minus,
  407. Typeof,
  408. Void,
  409. Delete,
  410. };
  411. class UnaryExpression final : public Expression {
  412. public:
  413. UnaryExpression(UnaryOp op, NonnullRefPtr<Expression> lhs)
  414. : m_op(op)
  415. , m_lhs(move(lhs))
  416. {
  417. }
  418. virtual Value execute(Interpreter&, GlobalObject&) const override;
  419. virtual void dump(int indent) const override;
  420. private:
  421. virtual const char* class_name() const override { return "UnaryExpression"; }
  422. UnaryOp m_op;
  423. NonnullRefPtr<Expression> m_lhs;
  424. };
  425. class SequenceExpression final : public Expression {
  426. public:
  427. SequenceExpression(NonnullRefPtrVector<Expression> expressions)
  428. : m_expressions(move(expressions))
  429. {
  430. }
  431. virtual void dump(int indent) const override;
  432. virtual Value execute(Interpreter&, GlobalObject&) const override;
  433. private:
  434. virtual const char* class_name() const override { return "SequenceExpression"; }
  435. NonnullRefPtrVector<Expression> m_expressions;
  436. };
  437. class Literal : public Expression {
  438. protected:
  439. explicit Literal() { }
  440. };
  441. class BooleanLiteral final : public Literal {
  442. public:
  443. explicit BooleanLiteral(bool value)
  444. : m_value(value)
  445. {
  446. }
  447. virtual Value execute(Interpreter&, GlobalObject&) const override;
  448. virtual void dump(int indent) const override;
  449. private:
  450. virtual const char* class_name() const override { return "BooleanLiteral"; }
  451. bool m_value { false };
  452. };
  453. class NumericLiteral final : public Literal {
  454. public:
  455. explicit NumericLiteral(double value)
  456. : m_value(value)
  457. {
  458. }
  459. virtual Value execute(Interpreter&, GlobalObject&) const override;
  460. virtual void dump(int indent) const override;
  461. private:
  462. virtual const char* class_name() const override { return "NumericLiteral"; }
  463. double m_value { 0 };
  464. };
  465. class BigIntLiteral final : public Literal {
  466. public:
  467. explicit BigIntLiteral(String value)
  468. : m_value(move(value))
  469. {
  470. }
  471. virtual Value execute(Interpreter&, GlobalObject&) const override;
  472. virtual void dump(int indent) const override;
  473. private:
  474. virtual const char* class_name() const override { return "BigIntLiteral"; }
  475. String m_value;
  476. };
  477. class StringLiteral final : public Literal {
  478. public:
  479. explicit StringLiteral(String value)
  480. : m_value(move(value))
  481. {
  482. }
  483. StringView value() const { return m_value; }
  484. virtual Value execute(Interpreter&, GlobalObject&) const override;
  485. virtual void dump(int indent) const override;
  486. private:
  487. virtual const char* class_name() const override { return "StringLiteral"; }
  488. String m_value;
  489. };
  490. class NullLiteral final : public Literal {
  491. public:
  492. explicit NullLiteral() { }
  493. virtual Value execute(Interpreter&, GlobalObject&) const override;
  494. virtual void dump(int indent) const override;
  495. private:
  496. virtual const char* class_name() const override { return "NullLiteral"; }
  497. };
  498. class RegExpLiteral final : public Literal {
  499. public:
  500. explicit RegExpLiteral(String content, String flags)
  501. : m_content(content)
  502. , m_flags(flags)
  503. {
  504. }
  505. virtual Value execute(Interpreter&, GlobalObject&) const override;
  506. virtual void dump(int indent) const override;
  507. const String& content() const { return m_content; }
  508. const String& flags() const { return m_flags; }
  509. private:
  510. virtual const char* class_name() const override { return "RegexLiteral"; }
  511. String m_content;
  512. String m_flags;
  513. };
  514. class Identifier final : public Expression {
  515. public:
  516. explicit Identifier(const FlyString& string)
  517. : m_string(string)
  518. {
  519. }
  520. const FlyString& string() const { return m_string; }
  521. virtual Value execute(Interpreter&, GlobalObject&) const override;
  522. virtual void dump(int indent) const override;
  523. virtual bool is_identifier() const override { return true; }
  524. virtual Reference to_reference(Interpreter&, GlobalObject&) const override;
  525. private:
  526. virtual const char* class_name() const override { return "Identifier"; }
  527. FlyString m_string;
  528. };
  529. class ClassMethod final : public ASTNode {
  530. public:
  531. enum class Kind {
  532. Method,
  533. Getter,
  534. Setter,
  535. };
  536. ClassMethod(NonnullRefPtr<Expression> key, NonnullRefPtr<FunctionExpression> function, Kind kind, bool is_static)
  537. : m_key(move(key))
  538. , m_function(move(function))
  539. , m_kind(kind)
  540. , m_is_static(is_static)
  541. {
  542. }
  543. const Expression& key() const { return *m_key; }
  544. Kind kind() const { return m_kind; }
  545. bool is_static() const { return m_is_static; }
  546. virtual Value execute(Interpreter&, GlobalObject&) const override;
  547. virtual void dump(int indent) const override;
  548. private:
  549. virtual const char* class_name() const override { return "ClassMethod"; }
  550. NonnullRefPtr<Expression> m_key;
  551. NonnullRefPtr<FunctionExpression> m_function;
  552. Kind m_kind;
  553. bool m_is_static;
  554. };
  555. class SuperExpression final : public Expression {
  556. public:
  557. virtual Value execute(Interpreter&, GlobalObject&) const override;
  558. virtual void dump(int indent) const override;
  559. private:
  560. virtual bool is_super_expression() const override { return true; }
  561. virtual const char* class_name() const override { return "SuperExpression"; }
  562. };
  563. class ClassExpression final : public Expression {
  564. public:
  565. ClassExpression(String name, RefPtr<FunctionExpression> constructor, RefPtr<Expression> super_class, NonnullRefPtrVector<ClassMethod> methods)
  566. : m_name(move(name))
  567. , m_constructor(move(constructor))
  568. , m_super_class(move(super_class))
  569. , m_methods(move(methods))
  570. {
  571. }
  572. StringView name() const { return m_name; }
  573. virtual Value execute(Interpreter&, GlobalObject&) const override;
  574. virtual void dump(int indent) const override;
  575. private:
  576. virtual const char* class_name() const override { return "ClassExpression"; }
  577. String m_name;
  578. RefPtr<FunctionExpression> m_constructor;
  579. RefPtr<Expression> m_super_class;
  580. NonnullRefPtrVector<ClassMethod> m_methods;
  581. };
  582. class ClassDeclaration final : public Declaration {
  583. public:
  584. ClassDeclaration(NonnullRefPtr<ClassExpression> class_expression)
  585. : m_class_expression(move(class_expression))
  586. {
  587. }
  588. virtual Value execute(Interpreter&, GlobalObject&) const override;
  589. virtual void dump(int indent) const override;
  590. private:
  591. virtual const char* class_name() const override { return "ClassDeclaration"; }
  592. NonnullRefPtr<ClassExpression> m_class_expression;
  593. };
  594. class SpreadExpression final : public Expression {
  595. public:
  596. explicit SpreadExpression(NonnullRefPtr<Expression> target)
  597. : m_target(target)
  598. {
  599. }
  600. virtual Value execute(Interpreter&, GlobalObject&) const override;
  601. virtual void dump(int indent) const override;
  602. virtual bool is_spread_expression() const override { return true; }
  603. private:
  604. virtual const char* class_name() const override { return "SpreadExpression"; }
  605. NonnullRefPtr<Expression> m_target;
  606. };
  607. class ThisExpression final : public Expression {
  608. public:
  609. virtual Value execute(Interpreter&, GlobalObject&) const override;
  610. virtual void dump(int indent) const override;
  611. private:
  612. virtual const char* class_name() const override { return "ThisExpression"; }
  613. };
  614. class CallExpression : public Expression {
  615. public:
  616. struct Argument {
  617. NonnullRefPtr<Expression> value;
  618. bool is_spread;
  619. };
  620. CallExpression(NonnullRefPtr<Expression> callee, Vector<Argument> arguments = {})
  621. : m_callee(move(callee))
  622. , m_arguments(move(arguments))
  623. {
  624. }
  625. virtual Value execute(Interpreter&, GlobalObject&) const override;
  626. virtual void dump(int indent) const override;
  627. private:
  628. virtual const char* class_name() const override { return "CallExpression"; }
  629. virtual bool is_call_expression() const override { return true; }
  630. struct ThisAndCallee {
  631. Value this_value;
  632. Value callee;
  633. };
  634. ThisAndCallee compute_this_and_callee(Interpreter&, GlobalObject&) const;
  635. NonnullRefPtr<Expression> m_callee;
  636. const Vector<Argument> m_arguments;
  637. };
  638. class NewExpression final : public CallExpression {
  639. public:
  640. NewExpression(NonnullRefPtr<Expression> callee, Vector<Argument> arguments = {})
  641. : CallExpression(move(callee), move(arguments))
  642. {
  643. }
  644. private:
  645. virtual const char* class_name() const override { return "NewExpression"; }
  646. virtual bool is_call_expression() const override { return false; }
  647. virtual bool is_new_expression() const override { return true; }
  648. };
  649. enum class AssignmentOp {
  650. Assignment,
  651. AdditionAssignment,
  652. SubtractionAssignment,
  653. MultiplicationAssignment,
  654. DivisionAssignment,
  655. ModuloAssignment,
  656. ExponentiationAssignment,
  657. BitwiseAndAssignment,
  658. BitwiseOrAssignment,
  659. BitwiseXorAssignment,
  660. LeftShiftAssignment,
  661. RightShiftAssignment,
  662. UnsignedRightShiftAssignment,
  663. AndAssignment,
  664. OrAssignment,
  665. NullishAssignment,
  666. };
  667. class AssignmentExpression final : public Expression {
  668. public:
  669. AssignmentExpression(AssignmentOp op, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  670. : m_op(op)
  671. , m_lhs(move(lhs))
  672. , m_rhs(move(rhs))
  673. {
  674. }
  675. virtual Value execute(Interpreter&, GlobalObject&) const override;
  676. virtual void dump(int indent) const override;
  677. private:
  678. virtual const char* class_name() const override { return "AssignmentExpression"; }
  679. AssignmentOp m_op;
  680. NonnullRefPtr<Expression> m_lhs;
  681. NonnullRefPtr<Expression> m_rhs;
  682. };
  683. enum class UpdateOp {
  684. Increment,
  685. Decrement,
  686. };
  687. class UpdateExpression final : public Expression {
  688. public:
  689. UpdateExpression(UpdateOp op, NonnullRefPtr<Expression> argument, bool prefixed = false)
  690. : m_op(op)
  691. , m_argument(move(argument))
  692. , m_prefixed(prefixed)
  693. {
  694. }
  695. virtual Value execute(Interpreter&, GlobalObject&) const override;
  696. virtual void dump(int indent) const override;
  697. private:
  698. virtual const char* class_name() const override { return "UpdateExpression"; }
  699. UpdateOp m_op;
  700. NonnullRefPtr<Expression> m_argument;
  701. bool m_prefixed;
  702. };
  703. enum class DeclarationKind {
  704. Var,
  705. Let,
  706. Const,
  707. };
  708. class VariableDeclarator final : public ASTNode {
  709. public:
  710. VariableDeclarator(NonnullRefPtr<Identifier> id)
  711. : m_id(move(id))
  712. {
  713. }
  714. VariableDeclarator(NonnullRefPtr<Identifier> id, RefPtr<Expression> init)
  715. : m_id(move(id))
  716. , m_init(move(init))
  717. {
  718. }
  719. const Identifier& id() const { return m_id; }
  720. const Expression* init() const { return m_init; }
  721. virtual Value execute(Interpreter&, GlobalObject&) const override;
  722. virtual void dump(int indent) const override;
  723. private:
  724. virtual const char* class_name() const override { return "VariableDeclarator"; }
  725. NonnullRefPtr<Identifier> m_id;
  726. RefPtr<Expression> m_init;
  727. };
  728. class VariableDeclaration final : public Declaration {
  729. public:
  730. VariableDeclaration(DeclarationKind declaration_kind, NonnullRefPtrVector<VariableDeclarator> declarations)
  731. : m_declaration_kind(declaration_kind)
  732. , m_declarations(move(declarations))
  733. {
  734. }
  735. virtual bool is_variable_declaration() const override { return true; }
  736. DeclarationKind declaration_kind() const { return m_declaration_kind; }
  737. virtual Value execute(Interpreter&, GlobalObject&) const override;
  738. virtual void dump(int indent) const override;
  739. const NonnullRefPtrVector<VariableDeclarator>& declarations() const { return m_declarations; }
  740. private:
  741. virtual const char* class_name() const override { return "VariableDeclaration"; }
  742. DeclarationKind m_declaration_kind;
  743. NonnullRefPtrVector<VariableDeclarator> m_declarations;
  744. };
  745. class ObjectProperty final : public ASTNode {
  746. public:
  747. enum class Type {
  748. KeyValue,
  749. Getter,
  750. Setter,
  751. Spread,
  752. };
  753. ObjectProperty(NonnullRefPtr<Expression> key, RefPtr<Expression> value, Type property_type, bool is_method)
  754. : m_key(move(key))
  755. , m_value(move(value))
  756. , m_property_type(property_type)
  757. , m_is_method(is_method)
  758. {
  759. }
  760. const Expression& key() const { return m_key; }
  761. const Expression& value() const
  762. {
  763. ASSERT(m_value);
  764. return *m_value;
  765. }
  766. Type type() const { return m_property_type; }
  767. bool is_method() const { return m_is_method; }
  768. virtual void dump(int indent) const override;
  769. virtual Value execute(Interpreter&, GlobalObject&) const override;
  770. private:
  771. virtual const char* class_name() const override { return "ObjectProperty"; }
  772. NonnullRefPtr<Expression> m_key;
  773. RefPtr<Expression> m_value;
  774. Type m_property_type;
  775. bool m_is_method { false };
  776. };
  777. class ObjectExpression final : public Expression {
  778. public:
  779. ObjectExpression(NonnullRefPtrVector<ObjectProperty> properties = {})
  780. : m_properties(move(properties))
  781. {
  782. }
  783. virtual Value execute(Interpreter&, GlobalObject&) const override;
  784. virtual void dump(int indent) const override;
  785. private:
  786. virtual const char* class_name() const override { return "ObjectExpression"; }
  787. NonnullRefPtrVector<ObjectProperty> m_properties;
  788. };
  789. class ArrayExpression final : public Expression {
  790. public:
  791. ArrayExpression(Vector<RefPtr<Expression>> elements)
  792. : m_elements(move(elements))
  793. {
  794. }
  795. const Vector<RefPtr<Expression>>& elements() const { return m_elements; }
  796. virtual Value execute(Interpreter&, GlobalObject&) const override;
  797. virtual void dump(int indent) const override;
  798. private:
  799. virtual const char* class_name() const override { return "ArrayExpression"; }
  800. Vector<RefPtr<Expression>> m_elements;
  801. };
  802. class TemplateLiteral final : public Expression {
  803. public:
  804. TemplateLiteral(NonnullRefPtrVector<Expression> expressions)
  805. : m_expressions(move(expressions))
  806. {
  807. }
  808. TemplateLiteral(NonnullRefPtrVector<Expression> expressions, NonnullRefPtrVector<Expression> raw_strings)
  809. : m_expressions(move(expressions))
  810. , m_raw_strings(move(raw_strings))
  811. {
  812. }
  813. virtual Value execute(Interpreter&, GlobalObject&) const override;
  814. virtual void dump(int indent) const override;
  815. const NonnullRefPtrVector<Expression>& expressions() const { return m_expressions; }
  816. const NonnullRefPtrVector<Expression>& raw_strings() const { return m_raw_strings; }
  817. private:
  818. virtual const char* class_name() const override { return "TemplateLiteral"; }
  819. const NonnullRefPtrVector<Expression> m_expressions;
  820. const NonnullRefPtrVector<Expression> m_raw_strings;
  821. };
  822. class TaggedTemplateLiteral final : public Expression {
  823. public:
  824. TaggedTemplateLiteral(NonnullRefPtr<Expression> tag, NonnullRefPtr<TemplateLiteral> template_literal)
  825. : m_tag(move(tag))
  826. , m_template_literal(move(template_literal))
  827. {
  828. }
  829. virtual Value execute(Interpreter&, GlobalObject&) const override;
  830. virtual void dump(int indent) const override;
  831. private:
  832. virtual const char* class_name() const override { return "TaggedTemplateLiteral"; }
  833. const NonnullRefPtr<Expression> m_tag;
  834. const NonnullRefPtr<TemplateLiteral> m_template_literal;
  835. };
  836. class MemberExpression final : public Expression {
  837. public:
  838. MemberExpression(NonnullRefPtr<Expression> object, NonnullRefPtr<Expression> property, bool computed = false)
  839. : m_object(move(object))
  840. , m_property(move(property))
  841. , m_computed(computed)
  842. {
  843. }
  844. virtual Value execute(Interpreter&, GlobalObject&) const override;
  845. virtual void dump(int indent) const override;
  846. virtual Reference to_reference(Interpreter&, GlobalObject&) const override;
  847. bool is_computed() const { return m_computed; }
  848. const Expression& object() const { return *m_object; }
  849. const Expression& property() const { return *m_property; }
  850. PropertyName computed_property_name(Interpreter&, GlobalObject&) const;
  851. String to_string_approximation() const;
  852. private:
  853. virtual bool is_member_expression() const override { return true; }
  854. virtual const char* class_name() const override { return "MemberExpression"; }
  855. NonnullRefPtr<Expression> m_object;
  856. NonnullRefPtr<Expression> m_property;
  857. bool m_computed { false };
  858. };
  859. class ConditionalExpression final : public Expression {
  860. public:
  861. ConditionalExpression(NonnullRefPtr<Expression> test, NonnullRefPtr<Expression> consequent, NonnullRefPtr<Expression> alternate)
  862. : m_test(move(test))
  863. , m_consequent(move(consequent))
  864. , m_alternate(move(alternate))
  865. {
  866. }
  867. virtual void dump(int indent) const override;
  868. virtual Value execute(Interpreter&, GlobalObject&) const override;
  869. private:
  870. virtual const char* class_name() const override { return "ConditionalExpression"; }
  871. NonnullRefPtr<Expression> m_test;
  872. NonnullRefPtr<Expression> m_consequent;
  873. NonnullRefPtr<Expression> m_alternate;
  874. };
  875. class CatchClause final : public ASTNode {
  876. public:
  877. CatchClause(const FlyString& parameter, NonnullRefPtr<BlockStatement> body)
  878. : m_parameter(parameter)
  879. , m_body(move(body))
  880. {
  881. }
  882. const FlyString& parameter() const { return m_parameter; }
  883. const BlockStatement& body() const { return m_body; }
  884. virtual void dump(int indent) const override;
  885. virtual Value execute(Interpreter&, GlobalObject&) const override;
  886. private:
  887. virtual const char* class_name() const override { return "CatchClause"; }
  888. FlyString m_parameter;
  889. NonnullRefPtr<BlockStatement> m_body;
  890. };
  891. class TryStatement final : public Statement {
  892. public:
  893. TryStatement(NonnullRefPtr<BlockStatement> block, RefPtr<CatchClause> handler, RefPtr<BlockStatement> finalizer)
  894. : m_block(move(block))
  895. , m_handler(move(handler))
  896. , m_finalizer(move(finalizer))
  897. {
  898. }
  899. const BlockStatement& block() const { return m_block; }
  900. const CatchClause* handler() const { return m_handler; }
  901. const BlockStatement* finalizer() const { return m_finalizer; }
  902. virtual void dump(int indent) const override;
  903. virtual Value execute(Interpreter&, GlobalObject&) const override;
  904. private:
  905. virtual const char* class_name() const override { return "TryStatement"; }
  906. NonnullRefPtr<BlockStatement> m_block;
  907. RefPtr<CatchClause> m_handler;
  908. RefPtr<BlockStatement> m_finalizer;
  909. };
  910. class ThrowStatement final : public Statement {
  911. public:
  912. explicit ThrowStatement(NonnullRefPtr<Expression> argument)
  913. : m_argument(move(argument))
  914. {
  915. }
  916. const Expression& argument() const { return m_argument; }
  917. virtual void dump(int indent) const override;
  918. virtual Value execute(Interpreter&, GlobalObject&) const override;
  919. private:
  920. virtual const char* class_name() const override { return "ThrowStatement"; }
  921. NonnullRefPtr<Expression> m_argument;
  922. };
  923. class SwitchCase final : public ASTNode {
  924. public:
  925. SwitchCase(RefPtr<Expression> test, NonnullRefPtrVector<Statement> consequent)
  926. : m_test(move(test))
  927. , m_consequent(move(consequent))
  928. {
  929. }
  930. const Expression* test() const { return m_test; }
  931. const NonnullRefPtrVector<Statement>& consequent() const { return m_consequent; }
  932. virtual void dump(int indent) const override;
  933. virtual Value execute(Interpreter&, GlobalObject&) const override;
  934. private:
  935. virtual const char* class_name() const override { return "SwitchCase"; }
  936. RefPtr<Expression> m_test;
  937. NonnullRefPtrVector<Statement> m_consequent;
  938. };
  939. class SwitchStatement final : public Statement {
  940. public:
  941. SwitchStatement(NonnullRefPtr<Expression> discriminant, NonnullRefPtrVector<SwitchCase> cases)
  942. : m_discriminant(move(discriminant))
  943. , m_cases(move(cases))
  944. {
  945. }
  946. virtual void dump(int indent) const override;
  947. virtual Value execute(Interpreter&, GlobalObject&) const override;
  948. private:
  949. virtual const char* class_name() const override { return "SwitchStatement"; }
  950. NonnullRefPtr<Expression> m_discriminant;
  951. NonnullRefPtrVector<SwitchCase> m_cases;
  952. };
  953. class BreakStatement final : public Statement {
  954. public:
  955. BreakStatement(FlyString target_label)
  956. : m_target_label(target_label)
  957. {
  958. }
  959. virtual Value execute(Interpreter&, GlobalObject&) const override;
  960. const FlyString& target_label() const { return m_target_label; }
  961. private:
  962. virtual const char* class_name() const override { return "BreakStatement"; }
  963. FlyString m_target_label;
  964. };
  965. class ContinueStatement final : public Statement {
  966. public:
  967. ContinueStatement(FlyString target_label)
  968. : m_target_label(target_label)
  969. {
  970. }
  971. virtual Value execute(Interpreter&, GlobalObject&) const override;
  972. const FlyString& target_label() const { return m_target_label; }
  973. private:
  974. virtual const char* class_name() const override { return "ContinueStatement"; }
  975. FlyString m_target_label;
  976. };
  977. class DebuggerStatement final : public Statement {
  978. public:
  979. DebuggerStatement() { }
  980. virtual Value execute(Interpreter&, GlobalObject&) const override;
  981. private:
  982. virtual const char* class_name() const override { return "DebuggerStatement"; }
  983. };
  984. }