OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_AST_H_ | 5 #ifndef V8_AST_H_ |
6 #define V8_AST_H_ | 6 #define V8_AST_H_ |
7 | 7 |
8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
9 #include "src/ast-value-factory.h" | 9 #include "src/ast-value-factory.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 // ---------------------------------------------------------------------------- | 37 // ---------------------------------------------------------------------------- |
38 // Nodes of the abstract syntax tree. Only concrete classes are | 38 // Nodes of the abstract syntax tree. Only concrete classes are |
39 // enumerated here. | 39 // enumerated here. |
40 | 40 |
41 #define DECLARATION_NODE_LIST(V) \ | 41 #define DECLARATION_NODE_LIST(V) \ |
42 V(VariableDeclaration) \ | 42 V(VariableDeclaration) \ |
43 V(FunctionDeclaration) \ | 43 V(FunctionDeclaration) \ |
44 V(ImportDeclaration) \ | 44 V(ImportDeclaration) \ |
45 V(ExportDeclaration) | 45 V(ExportDeclaration) |
46 | 46 |
47 #define STATEMENT_NODE_LIST(V) \ | 47 #define STATEMENT_NODE_LIST(V) \ |
48 V(Block) \ | 48 V(Block) \ |
49 V(ExpressionStatement) \ | 49 V(ExpressionStatement) \ |
50 V(EmptyStatement) \ | 50 V(EmptyStatement) \ |
51 V(IfStatement) \ | 51 V(SloppyBlockFunctionStatement) \ |
52 V(ContinueStatement) \ | 52 V(IfStatement) \ |
53 V(BreakStatement) \ | 53 V(ContinueStatement) \ |
54 V(ReturnStatement) \ | 54 V(BreakStatement) \ |
55 V(WithStatement) \ | 55 V(ReturnStatement) \ |
56 V(SwitchStatement) \ | 56 V(WithStatement) \ |
57 V(DoWhileStatement) \ | 57 V(SwitchStatement) \ |
58 V(WhileStatement) \ | 58 V(DoWhileStatement) \ |
59 V(ForStatement) \ | 59 V(WhileStatement) \ |
60 V(ForInStatement) \ | 60 V(ForStatement) \ |
61 V(ForOfStatement) \ | 61 V(ForInStatement) \ |
62 V(TryCatchStatement) \ | 62 V(ForOfStatement) \ |
63 V(TryFinallyStatement) \ | 63 V(TryCatchStatement) \ |
| 64 V(TryFinallyStatement) \ |
64 V(DebuggerStatement) | 65 V(DebuggerStatement) |
65 | 66 |
66 #define EXPRESSION_NODE_LIST(V) \ | 67 #define EXPRESSION_NODE_LIST(V) \ |
67 V(FunctionLiteral) \ | 68 V(FunctionLiteral) \ |
68 V(ClassLiteral) \ | 69 V(ClassLiteral) \ |
69 V(NativeFunctionLiteral) \ | 70 V(NativeFunctionLiteral) \ |
70 V(Conditional) \ | 71 V(Conditional) \ |
71 V(VariableProxy) \ | 72 V(VariableProxy) \ |
72 V(Literal) \ | 73 V(Literal) \ |
73 V(RegExpLiteral) \ | 74 V(RegExpLiteral) \ |
(...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1261 | 1262 |
1262 class EmptyStatement final : public Statement { | 1263 class EmptyStatement final : public Statement { |
1263 public: | 1264 public: |
1264 DECLARE_NODE_TYPE(EmptyStatement) | 1265 DECLARE_NODE_TYPE(EmptyStatement) |
1265 | 1266 |
1266 protected: | 1267 protected: |
1267 explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {} | 1268 explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {} |
1268 }; | 1269 }; |
1269 | 1270 |
1270 | 1271 |
| 1272 // Delegates to another statement, which may be overwritten. |
| 1273 // This was introduced to implement ES2015 Annex B3.3 for conditionally making |
| 1274 // sloppy-mode block-scoped functions have a var binding, which is changed |
| 1275 // from one statement to another during parsing. |
| 1276 class SloppyBlockFunctionStatement final : public Statement { |
| 1277 public: |
| 1278 DECLARE_NODE_TYPE(SloppyBlockFunctionStatement) |
| 1279 |
| 1280 Statement* statement() const { return statement_; } |
| 1281 void set_statement(Statement* statement) { statement_ = statement; } |
| 1282 Scope* scope() const { return scope_; } |
| 1283 |
| 1284 private: |
| 1285 SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) |
| 1286 : Statement(zone, RelocInfo::kNoPosition), |
| 1287 statement_(statement), |
| 1288 scope_(scope) {} |
| 1289 |
| 1290 Statement* statement_; |
| 1291 Scope* const scope_; |
| 1292 }; |
| 1293 |
| 1294 |
1271 class Literal final : public Expression { | 1295 class Literal final : public Expression { |
1272 public: | 1296 public: |
1273 DECLARE_NODE_TYPE(Literal) | 1297 DECLARE_NODE_TYPE(Literal) |
1274 | 1298 |
1275 bool IsPropertyName() const override { return value_->IsPropertyName(); } | 1299 bool IsPropertyName() const override { return value_->IsPropertyName(); } |
1276 | 1300 |
1277 Handle<String> AsPropertyName() { | 1301 Handle<String> AsPropertyName() { |
1278 DCHECK(IsPropertyName()); | 1302 DCHECK(IsPropertyName()); |
1279 return Handle<String>::cast(value()); | 1303 return Handle<String>::cast(value()); |
1280 } | 1304 } |
(...skipping 2116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3397 } | 3421 } |
3398 | 3422 |
3399 DebuggerStatement* NewDebuggerStatement(int pos) { | 3423 DebuggerStatement* NewDebuggerStatement(int pos) { |
3400 return new (local_zone_) DebuggerStatement(local_zone_, pos); | 3424 return new (local_zone_) DebuggerStatement(local_zone_, pos); |
3401 } | 3425 } |
3402 | 3426 |
3403 EmptyStatement* NewEmptyStatement(int pos) { | 3427 EmptyStatement* NewEmptyStatement(int pos) { |
3404 return new (local_zone_) EmptyStatement(local_zone_, pos); | 3428 return new (local_zone_) EmptyStatement(local_zone_, pos); |
3405 } | 3429 } |
3406 | 3430 |
| 3431 SloppyBlockFunctionStatement* NewSloppyBlockFunctionStatement( |
| 3432 Statement* statement, Scope* scope) { |
| 3433 return new (local_zone_) |
| 3434 SloppyBlockFunctionStatement(local_zone_, statement, scope); |
| 3435 } |
| 3436 |
3407 CaseClause* NewCaseClause( | 3437 CaseClause* NewCaseClause( |
3408 Expression* label, ZoneList<Statement*>* statements, int pos) { | 3438 Expression* label, ZoneList<Statement*>* statements, int pos) { |
3409 return new (local_zone_) CaseClause(local_zone_, label, statements, pos); | 3439 return new (local_zone_) CaseClause(local_zone_, label, statements, pos); |
3410 } | 3440 } |
3411 | 3441 |
3412 Literal* NewStringLiteral(const AstRawString* string, int pos) { | 3442 Literal* NewStringLiteral(const AstRawString* string, int pos) { |
3413 return new (local_zone_) | 3443 return new (local_zone_) |
3414 Literal(local_zone_, ast_value_factory_->NewString(string), pos); | 3444 Literal(local_zone_, ast_value_factory_->NewString(string), pos); |
3415 } | 3445 } |
3416 | 3446 |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3703 // ZoneObjects which need to persist until scope analysis must be allocated in | 3733 // ZoneObjects which need to persist until scope analysis must be allocated in |
3704 // the parser-level zone. | 3734 // the parser-level zone. |
3705 Zone* parser_zone_; | 3735 Zone* parser_zone_; |
3706 AstValueFactory* ast_value_factory_; | 3736 AstValueFactory* ast_value_factory_; |
3707 }; | 3737 }; |
3708 | 3738 |
3709 | 3739 |
3710 } } // namespace v8::internal | 3740 } } // namespace v8::internal |
3711 | 3741 |
3712 #endif // V8_AST_H_ | 3742 #endif // V8_AST_H_ |
OLD | NEW |