Chromium Code Reviews| 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/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/assembler.h" | 10 #include "src/assembler.h" |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 | 33 |
| 34 // Nodes are allocated in a separate zone, which allows faster | 34 // Nodes are allocated in a separate zone, which allows faster |
| 35 // allocation and constant-time deallocation of the entire syntax | 35 // allocation and constant-time deallocation of the entire syntax |
| 36 // tree. | 36 // tree. |
| 37 | 37 |
| 38 | 38 |
| 39 // ---------------------------------------------------------------------------- | 39 // ---------------------------------------------------------------------------- |
| 40 // Nodes of the abstract syntax tree. Only concrete classes are | 40 // Nodes of the abstract syntax tree. Only concrete classes are |
| 41 // enumerated here. | 41 // enumerated here. |
| 42 | 42 |
| 43 #define DECLARATION_NODE_LIST(V) \ | 43 #define DECLARATION_NODE_LIST(V) \ |
| 44 V(VariableDeclaration) \ | 44 V(VariableDeclaration) \ |
| 45 V(FunctionDeclaration) \ | 45 V(FunctionDeclaration) \ |
| 46 V(ModuleDeclaration) \ | 46 V(ModuleDeclaration) \ |
| 47 V(ImportDeclaration) \ | 47 V(ImportDeclaration) \ |
| 48 V(ExportDeclaration) \ | 48 V(ExportDeclaration) |
| 49 | 49 |
| 50 #define MODULE_NODE_LIST(V) \ | 50 #define MODULE_NODE_LIST(V) \ |
| 51 V(ModuleLiteral) \ | 51 V(ModuleLiteral) \ |
| 52 V(ModuleVariable) \ | 52 V(ModuleVariable) \ |
| 53 V(ModulePath) \ | 53 V(ModulePath) \ |
| 54 V(ModuleUrl) | 54 V(ModuleUrl) |
| 55 | 55 |
| 56 #define STATEMENT_NODE_LIST(V) \ | 56 #define STATEMENT_NODE_LIST(V) \ |
| 57 V(Block) \ | 57 V(Block) \ |
| 58 V(ModuleStatement) \ | 58 V(ModuleStatement) \ |
| 59 V(ExpressionStatement) \ | 59 V(ExpressionStatement) \ |
| 60 V(EmptyStatement) \ | 60 V(EmptyStatement) \ |
| 61 V(IfStatement) \ | 61 V(IfStatement) \ |
| 62 V(ContinueStatement) \ | 62 V(ContinueStatement) \ |
| 63 V(BreakStatement) \ | 63 V(BreakStatement) \ |
| 64 V(ReturnStatement) \ | 64 V(ReturnStatement) \ |
| 65 V(WithStatement) \ | 65 V(WithStatement) \ |
| 66 V(SwitchStatement) \ | 66 V(SwitchStatement) \ |
| 67 V(DoWhileStatement) \ | 67 V(DoWhileStatement) \ |
| 68 V(WhileStatement) \ | 68 V(WhileStatement) \ |
| 69 V(ForStatement) \ | 69 V(ForStatement) \ |
| 70 V(ForInStatement) \ | 70 V(ForInStatement) \ |
| 71 V(ForOfStatement) \ | 71 V(ForOfStatement) \ |
| 72 V(TryCatchStatement) \ | 72 V(TryCatchStatement) \ |
| 73 V(TryFinallyStatement) \ | 73 V(TryFinallyStatement) \ |
| 74 V(DebuggerStatement) | 74 V(DebuggerStatement) |
| 75 | 75 |
| 76 #define EXPRESSION_NODE_LIST(V) \ | 76 #define EXPRESSION_NODE_LIST(V) \ |
| 77 V(FunctionLiteral) \ | 77 V(FunctionLiteral) \ |
| 78 V(NativeFunctionLiteral) \ | 78 V(ClassLiteral) \ |
| 79 V(Conditional) \ | 79 V(NativeFunctionLiteral) \ |
| 80 V(VariableProxy) \ | 80 V(Conditional) \ |
| 81 V(Literal) \ | 81 V(VariableProxy) \ |
| 82 V(RegExpLiteral) \ | 82 V(Literal) \ |
| 83 V(ObjectLiteral) \ | 83 V(RegExpLiteral) \ |
| 84 V(ArrayLiteral) \ | 84 V(ObjectLiteral) \ |
| 85 V(Assignment) \ | 85 V(ArrayLiteral) \ |
| 86 V(Yield) \ | 86 V(Assignment) \ |
| 87 V(Throw) \ | 87 V(Yield) \ |
| 88 V(Property) \ | 88 V(Throw) \ |
| 89 V(Call) \ | 89 V(Property) \ |
| 90 V(CallNew) \ | 90 V(Call) \ |
| 91 V(CallRuntime) \ | 91 V(CallNew) \ |
| 92 V(UnaryOperation) \ | 92 V(CallRuntime) \ |
| 93 V(CountOperation) \ | 93 V(UnaryOperation) \ |
| 94 V(BinaryOperation) \ | 94 V(CountOperation) \ |
| 95 V(CompareOperation) \ | 95 V(BinaryOperation) \ |
| 96 V(ThisFunction) \ | 96 V(CompareOperation) \ |
| 97 V(SuperReference) \ | 97 V(ThisFunction) \ |
| 98 V(SuperReference) \ | |
| 98 V(CaseClause) | 99 V(CaseClause) |
| 99 | 100 |
| 100 #define AST_NODE_LIST(V) \ | 101 #define AST_NODE_LIST(V) \ |
| 101 DECLARATION_NODE_LIST(V) \ | 102 DECLARATION_NODE_LIST(V) \ |
| 102 MODULE_NODE_LIST(V) \ | 103 MODULE_NODE_LIST(V) \ |
| 103 STATEMENT_NODE_LIST(V) \ | 104 STATEMENT_NODE_LIST(V) \ |
| 104 EXPRESSION_NODE_LIST(V) | 105 EXPRESSION_NODE_LIST(V) |
| 105 | 106 |
| 106 // Forward declarations | 107 // Forward declarations |
| 107 class AstConstructionVisitor; | 108 class AstConstructionVisitor; |
| (...skipping 1344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1452 public: | 1453 public: |
| 1453 enum Kind { | 1454 enum Kind { |
| 1454 CONSTANT, // Property with constant value (compile time). | 1455 CONSTANT, // Property with constant value (compile time). |
| 1455 COMPUTED, // Property with computed value (execution time). | 1456 COMPUTED, // Property with computed value (execution time). |
| 1456 MATERIALIZED_LITERAL, // Property value is a materialized literal. | 1457 MATERIALIZED_LITERAL, // Property value is a materialized literal. |
| 1457 GETTER, SETTER, // Property is an accessor function. | 1458 GETTER, SETTER, // Property is an accessor function. |
| 1458 PROTOTYPE // Property is __proto__. | 1459 PROTOTYPE // Property is __proto__. |
| 1459 }; | 1460 }; |
| 1460 | 1461 |
| 1461 ObjectLiteralProperty(Zone* zone, AstValueFactory* ast_value_factory, | 1462 ObjectLiteralProperty(Zone* zone, AstValueFactory* ast_value_factory, |
| 1462 Literal* key, Expression* value); | 1463 Literal* key, Expression* value, |
| 1464 bool is_static); | |
|
rossberg
2014/09/15 12:32:48
Nit: formatting
arv (Not doing code reviews)
2014/09/15 15:12:32
Done.
| |
| 1463 | 1465 |
| 1464 Literal* key() { return key_; } | 1466 Literal* key() { return key_; } |
| 1465 Expression* value() { return value_; } | 1467 Expression* value() { return value_; } |
| 1466 Kind kind() { return kind_; } | 1468 Kind kind() { return kind_; } |
| 1467 | 1469 |
| 1468 // Type feedback information. | 1470 // Type feedback information. |
| 1469 void RecordTypeFeedback(TypeFeedbackOracle* oracle); | 1471 void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
| 1470 bool IsMonomorphic() { return !receiver_type_.is_null(); } | 1472 bool IsMonomorphic() { return !receiver_type_.is_null(); } |
| 1471 Handle<Map> GetReceiverType() { return receiver_type_; } | 1473 Handle<Map> GetReceiverType() { return receiver_type_; } |
| 1472 | 1474 |
| 1473 bool IsCompileTimeValue(); | 1475 bool IsCompileTimeValue(); |
| 1474 | 1476 |
| 1475 void set_emit_store(bool emit_store); | 1477 void set_emit_store(bool emit_store); |
| 1476 bool emit_store(); | 1478 bool emit_store(); |
| 1477 | 1479 |
| 1478 protected: | 1480 protected: |
| 1479 template<class> friend class AstNodeFactory; | 1481 template<class> friend class AstNodeFactory; |
| 1480 | 1482 |
| 1481 ObjectLiteralProperty(Zone* zone, bool is_getter, FunctionLiteral* value); | 1483 ObjectLiteralProperty(Zone* zone, bool is_getter, FunctionLiteral* value, |
| 1484 bool is_static); | |
| 1482 void set_key(Literal* key) { key_ = key; } | 1485 void set_key(Literal* key) { key_ = key; } |
| 1483 | 1486 |
| 1484 private: | 1487 private: |
| 1485 Literal* key_; | 1488 Literal* key_; |
| 1486 Expression* value_; | 1489 Expression* value_; |
| 1487 Kind kind_; | 1490 Kind kind_; |
| 1488 bool emit_store_; | 1491 bool emit_store_; |
| 1492 bool is_static_; | |
|
arv (Not doing code reviews)
2014/09/12 21:36:34
What was the conclusion on C++ bit field members?
Sven Panne
2014/09/15 11:13:05
I would leave it as it is, to avoid premature opti
rossberg
2014/09/15 12:32:48
Opinions still differ, better to avoid them for th
arv (Not doing code reviews)
2014/09/15 15:12:32
See later comment.
| |
| 1489 Handle<Map> receiver_type_; | 1493 Handle<Map> receiver_type_; |
| 1490 }; | 1494 }; |
| 1491 | 1495 |
| 1492 | 1496 |
| 1493 // An object literal has a boilerplate object that is used | 1497 // An object literal has a boilerplate object that is used |
| 1494 // for minimizing the work when constructing it at runtime. | 1498 // for minimizing the work when constructing it at runtime. |
| 1495 class ObjectLiteral FINAL : public MaterializedLiteral { | 1499 class ObjectLiteral FINAL : public MaterializedLiteral { |
| 1496 public: | 1500 public: |
| 1497 typedef ObjectLiteralProperty Property; | 1501 typedef ObjectLiteralProperty Property; |
| 1498 | 1502 |
| (...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2491 class IsExpression : public BitField<bool, 0, 1> {}; | 2495 class IsExpression : public BitField<bool, 0, 1> {}; |
| 2492 class IsAnonymous : public BitField<bool, 1, 1> {}; | 2496 class IsAnonymous : public BitField<bool, 1, 1> {}; |
| 2493 class Pretenure : public BitField<bool, 2, 1> {}; | 2497 class Pretenure : public BitField<bool, 2, 1> {}; |
| 2494 class HasDuplicateParameters : public BitField<ParameterFlag, 3, 1> {}; | 2498 class HasDuplicateParameters : public BitField<ParameterFlag, 3, 1> {}; |
| 2495 class IsFunction : public BitField<IsFunctionFlag, 4, 1> {}; | 2499 class IsFunction : public BitField<IsFunctionFlag, 4, 1> {}; |
| 2496 class IsParenthesized : public BitField<IsParenthesizedFlag, 5, 1> {}; | 2500 class IsParenthesized : public BitField<IsParenthesizedFlag, 5, 1> {}; |
| 2497 class FunctionKindBits : public BitField<FunctionKind, 6, 3> {}; | 2501 class FunctionKindBits : public BitField<FunctionKind, 6, 3> {}; |
| 2498 }; | 2502 }; |
| 2499 | 2503 |
| 2500 | 2504 |
| 2505 class ClassLiteral FINAL : public Expression { | |
| 2506 public: | |
| 2507 typedef ObjectLiteralProperty Property; | |
| 2508 | |
| 2509 DECLARE_NODE_TYPE(ClassLiteral) | |
| 2510 | |
| 2511 Handle<String> name() const { return raw_name_->string(); } | |
| 2512 const AstRawString* raw_name() const { return raw_name_; } | |
| 2513 Expression* extends() const { return extends_; } | |
| 2514 FunctionLiteral* constructor() const { return constructor_; } | |
| 2515 ZoneList<Property*>* properties() const { return properties_; } | |
| 2516 | |
| 2517 protected: | |
| 2518 ClassLiteral(Zone* zone, const AstRawString* name, Expression* extends, | |
| 2519 FunctionLiteral* constructor, ZoneList<Property*>* properties, | |
| 2520 AstValueFactory* ast_value_factory, int position, IdGen* id_gen) | |
| 2521 : Expression(zone, position, id_gen), | |
| 2522 raw_name_(name), | |
| 2523 raw_inferred_name_(ast_value_factory->empty_string()), | |
| 2524 extends_(extends), | |
| 2525 constructor_(constructor), | |
| 2526 properties_(properties) {} | |
| 2527 | |
| 2528 private: | |
| 2529 const AstRawString* raw_name_; | |
| 2530 Handle<String> name_; | |
| 2531 const AstString* raw_inferred_name_; | |
| 2532 Handle<String> inferred_name_; | |
| 2533 Expression* extends_; | |
| 2534 FunctionLiteral* constructor_; | |
| 2535 ZoneList<Property*>* properties_; | |
| 2536 }; | |
| 2537 | |
| 2538 | |
| 2501 class NativeFunctionLiteral FINAL : public Expression { | 2539 class NativeFunctionLiteral FINAL : public Expression { |
| 2502 public: | 2540 public: |
| 2503 DECLARE_NODE_TYPE(NativeFunctionLiteral) | 2541 DECLARE_NODE_TYPE(NativeFunctionLiteral) |
| 2504 | 2542 |
| 2505 Handle<String> name() const { return name_->string(); } | 2543 Handle<String> name() const { return name_->string(); } |
| 2506 v8::Extension* extension() const { return extension_; } | 2544 v8::Extension* extension() const { return extension_; } |
| 2507 | 2545 |
| 2508 protected: | 2546 protected: |
| 2509 NativeFunctionLiteral(Zone* zone, const AstRawString* name, | 2547 NativeFunctionLiteral(Zone* zone, const AstRawString* name, |
| 2510 v8::Extension* extension, int pos, IdGen* id_gen) | 2548 v8::Extension* extension, int pos, IdGen* id_gen) |
| (...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3282 int boilerplate_properties, | 3320 int boilerplate_properties, |
| 3283 bool has_function, | 3321 bool has_function, |
| 3284 int pos) { | 3322 int pos) { |
| 3285 ObjectLiteral* lit = new (zone_) | 3323 ObjectLiteral* lit = new (zone_) |
| 3286 ObjectLiteral(zone_, properties, literal_index, boilerplate_properties, | 3324 ObjectLiteral(zone_, properties, literal_index, boilerplate_properties, |
| 3287 has_function, pos, id_gen_); | 3325 has_function, pos, id_gen_); |
| 3288 VISIT_AND_RETURN(ObjectLiteral, lit) | 3326 VISIT_AND_RETURN(ObjectLiteral, lit) |
| 3289 } | 3327 } |
| 3290 | 3328 |
| 3291 ObjectLiteral::Property* NewObjectLiteralProperty(Literal* key, | 3329 ObjectLiteral::Property* NewObjectLiteralProperty(Literal* key, |
| 3292 Expression* value) { | 3330 Expression* value, |
| 3293 return new (zone_) | 3331 bool is_static) { |
| 3294 ObjectLiteral::Property(zone_, ast_value_factory_, key, value); | 3332 return new (zone_) ObjectLiteral::Property(zone_, ast_value_factory_, key, |
| 3333 value, is_static); | |
| 3295 } | 3334 } |
| 3296 | 3335 |
| 3297 ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter, | 3336 ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter, |
| 3298 FunctionLiteral* value, | 3337 FunctionLiteral* value, |
| 3299 int pos) { | 3338 int pos, bool is_static) { |
| 3300 ObjectLiteral::Property* prop = | 3339 ObjectLiteral::Property* prop = |
| 3301 new(zone_) ObjectLiteral::Property(zone_, is_getter, value); | 3340 new (zone_) ObjectLiteral::Property(zone_, is_getter, value, is_static); |
| 3302 prop->set_key(NewStringLiteral(value->raw_name(), pos)); | 3341 prop->set_key(NewStringLiteral(value->raw_name(), pos)); |
| 3303 return prop; // Not an AST node, will not be visited. | 3342 return prop; // Not an AST node, will not be visited. |
| 3304 } | 3343 } |
| 3305 | 3344 |
| 3306 RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, | 3345 RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, |
| 3307 const AstRawString* flags, | 3346 const AstRawString* flags, |
| 3308 int literal_index, | 3347 int literal_index, |
| 3309 int pos) { | 3348 int pos) { |
| 3310 RegExpLiteral* lit = new (zone_) | 3349 RegExpLiteral* lit = new (zone_) |
| 3311 RegExpLiteral(zone_, pattern, flags, literal_index, pos, id_gen_); | 3350 RegExpLiteral(zone_, pattern, flags, literal_index, pos, id_gen_); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3447 expected_property_count, handler_count, parameter_count, function_type, | 3486 expected_property_count, handler_count, parameter_count, function_type, |
| 3448 has_duplicate_parameters, is_function, is_parenthesized, kind, position, | 3487 has_duplicate_parameters, is_function, is_parenthesized, kind, position, |
| 3449 id_gen_); | 3488 id_gen_); |
| 3450 // Top-level literal doesn't count for the AST's properties. | 3489 // Top-level literal doesn't count for the AST's properties. |
| 3451 if (is_function == FunctionLiteral::kIsFunction) { | 3490 if (is_function == FunctionLiteral::kIsFunction) { |
| 3452 visitor_.VisitFunctionLiteral(lit); | 3491 visitor_.VisitFunctionLiteral(lit); |
| 3453 } | 3492 } |
| 3454 return lit; | 3493 return lit; |
| 3455 } | 3494 } |
| 3456 | 3495 |
| 3496 ClassLiteral* NewClassLiteral(const AstRawString* name, Expression* extends, | |
| 3497 FunctionLiteral* constructor, | |
| 3498 ZoneList<ObjectLiteral::Property*>* properties, | |
| 3499 AstValueFactory* ast_value_factory, | |
| 3500 int position) { | |
| 3501 ClassLiteral* lit = | |
| 3502 new (zone_) ClassLiteral(zone_, name, extends, constructor, properties, | |
| 3503 ast_value_factory, position, id_gen_); | |
| 3504 VISIT_AND_RETURN(ClassLiteral, lit) | |
| 3505 } | |
| 3506 | |
| 3457 NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name, | 3507 NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name, |
| 3458 v8::Extension* extension, | 3508 v8::Extension* extension, |
| 3459 int pos) { | 3509 int pos) { |
| 3460 NativeFunctionLiteral* lit = | 3510 NativeFunctionLiteral* lit = |
| 3461 new (zone_) NativeFunctionLiteral(zone_, name, extension, pos, id_gen_); | 3511 new (zone_) NativeFunctionLiteral(zone_, name, extension, pos, id_gen_); |
| 3462 VISIT_AND_RETURN(NativeFunctionLiteral, lit) | 3512 VISIT_AND_RETURN(NativeFunctionLiteral, lit) |
| 3463 } | 3513 } |
| 3464 | 3514 |
| 3465 ThisFunction* NewThisFunction(int pos) { | 3515 ThisFunction* NewThisFunction(int pos) { |
| 3466 ThisFunction* fun = new (zone_) ThisFunction(zone_, pos, id_gen_); | 3516 ThisFunction* fun = new (zone_) ThisFunction(zone_, pos, id_gen_); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 3479 Zone* zone_; | 3529 Zone* zone_; |
| 3480 Visitor visitor_; | 3530 Visitor visitor_; |
| 3481 AstValueFactory* ast_value_factory_; | 3531 AstValueFactory* ast_value_factory_; |
| 3482 AstNode::IdGen* id_gen_; | 3532 AstNode::IdGen* id_gen_; |
| 3483 }; | 3533 }; |
| 3484 | 3534 |
| 3485 | 3535 |
| 3486 } } // namespace v8::internal | 3536 } } // namespace v8::internal |
| 3487 | 3537 |
| 3488 #endif // V8_AST_H_ | 3538 #endif // V8_AST_H_ |
| OLD | NEW |