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_AST_H_ | 5 #ifndef V8_AST_AST_H_ |
6 #define V8_AST_AST_H_ | 6 #define V8_AST_AST_H_ |
7 | 7 |
8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
9 #include "src/ast/ast-types.h" | 9 #include "src/ast/ast-types.h" |
10 #include "src/ast/ast-value-factory.h" | 10 #include "src/ast/ast-value-factory.h" |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 | 686 |
687 Statement* init_; | 687 Statement* init_; |
688 Expression* cond_; | 688 Expression* cond_; |
689 Statement* next_; | 689 Statement* next_; |
690 }; | 690 }; |
691 | 691 |
692 | 692 |
693 class ForEachStatement : public IterationStatement { | 693 class ForEachStatement : public IterationStatement { |
694 public: | 694 public: |
695 enum VisitMode { | 695 enum VisitMode { |
696 ENUMERATE, // for (each in subject) body; | 696 ENUMERATE, // for (each in subject) body; |
697 ITERATE // for (each of subject) body; | 697 ITERATE, // for (each of subject) body; |
| 698 ASYNC_ITERATE, // for await (each of subject) body; |
698 }; | 699 }; |
699 | 700 |
700 using IterationStatement::Initialize; | 701 using IterationStatement::Initialize; |
701 | 702 |
702 static const char* VisitModeString(VisitMode mode) { | 703 static const char* VisitModeString(VisitMode mode) { |
703 return mode == ITERATE ? "for-of" : "for-in"; | 704 static const char* kModeStrings[] = {"for-in", "for-of", "for-await-of"}; |
| 705 DCHECK(mode >= ENUMERATE && mode <= ASYNC_ITERATE); |
| 706 return kModeStrings[mode]; |
704 } | 707 } |
705 | 708 |
706 protected: | 709 protected: |
707 ForEachStatement(ZoneList<const AstRawString*>* labels, int pos, | 710 ForEachStatement(ZoneList<const AstRawString*>* labels, int pos, |
708 NodeType type) | 711 NodeType type) |
709 : IterationStatement(labels, pos, type) {} | 712 : IterationStatement(labels, pos, type) {} |
710 }; | 713 }; |
711 | 714 |
712 | 715 |
713 class ForInStatement final : public ForEachStatement { | 716 class ForInStatement final : public ForEachStatement { |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 result_done_(NULL), | 832 result_done_(NULL), |
830 assign_each_(NULL) {} | 833 assign_each_(NULL) {} |
831 | 834 |
832 Variable* iterator_; | 835 Variable* iterator_; |
833 Expression* assign_iterator_; | 836 Expression* assign_iterator_; |
834 Expression* next_result_; | 837 Expression* next_result_; |
835 Expression* result_done_; | 838 Expression* result_done_; |
836 Expression* assign_each_; | 839 Expression* assign_each_; |
837 }; | 840 }; |
838 | 841 |
839 | |
840 class ExpressionStatement final : public Statement { | 842 class ExpressionStatement final : public Statement { |
841 public: | 843 public: |
842 void set_expression(Expression* e) { expression_ = e; } | 844 void set_expression(Expression* e) { expression_ = e; } |
843 Expression* expression() const { return expression_; } | 845 Expression* expression() const { return expression_; } |
844 bool IsJump() const { return expression_->IsThrow(); } | 846 bool IsJump() const { return expression_->IsThrow(); } |
845 | 847 |
846 private: | 848 private: |
847 friend class AstNodeFactory; | 849 friend class AstNodeFactory; |
848 | 850 |
849 ExpressionStatement(Expression* expression, int pos) | 851 ExpressionStatement(Expression* expression, int pos) |
(...skipping 1625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2475 class IsRewrittenField | 2477 class IsRewrittenField |
2476 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; | 2478 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
2477 }; | 2479 }; |
2478 | 2480 |
2479 // Our Yield is different from the JS yield in that it "returns" its argument as | 2481 // Our Yield is different from the JS yield in that it "returns" its argument as |
2480 // is, without wrapping it in an iterator result object. Such wrapping, if | 2482 // is, without wrapping it in an iterator result object. Such wrapping, if |
2481 // desired, must be done beforehand (see the parser). | 2483 // desired, must be done beforehand (see the parser). |
2482 class Yield final : public Expression { | 2484 class Yield final : public Expression { |
2483 public: | 2485 public: |
2484 enum OnException { kOnExceptionThrow, kOnExceptionRethrow }; | 2486 enum OnException { kOnExceptionThrow, kOnExceptionRethrow }; |
| 2487 enum YieldType { kNormal, kAwait }; |
2485 | 2488 |
2486 Expression* generator_object() const { return generator_object_; } | 2489 Expression* generator_object() const { return generator_object_; } |
2487 Expression* expression() const { return expression_; } | 2490 Expression* expression() const { return expression_; } |
2488 OnException on_exception() const { | 2491 OnException on_exception() const { |
2489 return OnExceptionField::decode(bit_field_); | 2492 return OnExceptionField::decode(bit_field_); |
2490 } | 2493 } |
2491 bool rethrow_on_exception() const { | 2494 bool rethrow_on_exception() const { |
2492 return on_exception() == kOnExceptionRethrow; | 2495 return on_exception() == kOnExceptionRethrow; |
2493 } | 2496 } |
2494 int yield_id() const { return yield_id_; } | 2497 int yield_id() const { return yield_id_; } |
| 2498 YieldType yield_type() const { return YieldTypeField::decode(bit_field_); } |
2495 | 2499 |
2496 void set_generator_object(Expression* e) { generator_object_ = e; } | 2500 void set_generator_object(Expression* e) { generator_object_ = e; } |
2497 void set_expression(Expression* e) { expression_ = e; } | 2501 void set_expression(Expression* e) { expression_ = e; } |
2498 void set_yield_id(int yield_id) { yield_id_ = yield_id; } | 2502 void set_yield_id(int yield_id) { yield_id_ = yield_id; } |
| 2503 void set_yield_type(YieldType type) { |
| 2504 bit_field_ = YieldTypeField::update(bit_field_, type); |
| 2505 } |
2499 | 2506 |
2500 private: | 2507 private: |
2501 friend class AstNodeFactory; | 2508 friend class AstNodeFactory; |
2502 | 2509 |
2503 Yield(Expression* generator_object, Expression* expression, int pos, | 2510 Yield(Expression* generator_object, Expression* expression, int pos, |
2504 OnException on_exception) | 2511 OnException on_exception, YieldType yield_type = kNormal) |
2505 : Expression(pos, kYield), | 2512 : Expression(pos, kYield), |
2506 yield_id_(-1), | 2513 yield_id_(-1), |
2507 generator_object_(generator_object), | 2514 generator_object_(generator_object), |
2508 expression_(expression) { | 2515 expression_(expression) { |
2509 bit_field_ |= OnExceptionField::encode(on_exception); | 2516 bit_field_ |= OnExceptionField::encode(on_exception) | |
| 2517 YieldTypeField::encode(yield_type); |
2510 } | 2518 } |
2511 | 2519 |
2512 int yield_id_; | 2520 int yield_id_; |
2513 Expression* generator_object_; | 2521 Expression* generator_object_; |
2514 Expression* expression_; | 2522 Expression* expression_; |
2515 | 2523 |
2516 class OnExceptionField | 2524 class OnExceptionField |
2517 : public BitField<OnException, Expression::kNextBitFieldIndex, 1> {}; | 2525 : public BitField<OnException, Expression::kNextBitFieldIndex, 1> {}; |
| 2526 class YieldTypeField |
| 2527 : public BitField<YieldType, OnExceptionField::kNext, 1> {}; |
2518 }; | 2528 }; |
2519 | 2529 |
2520 | 2530 |
2521 class Throw final : public Expression { | 2531 class Throw final : public Expression { |
2522 public: | 2532 public: |
2523 Expression* exception() const { return exception_; } | 2533 Expression* exception() const { return exception_; } |
2524 void set_exception(Expression* e) { exception_ = e; } | 2534 void set_exception(Expression* e) { exception_ = e; } |
2525 | 2535 |
2526 private: | 2536 private: |
2527 friend class AstNodeFactory; | 2537 friend class AstNodeFactory; |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2907 | 2917 |
2908 explicit EmptyParentheses(int pos) : Expression(pos, kEmptyParentheses) {} | 2918 explicit EmptyParentheses(int pos) : Expression(pos, kEmptyParentheses) {} |
2909 }; | 2919 }; |
2910 | 2920 |
2911 // Represents the spec operation `GetIterator()` | 2921 // Represents the spec operation `GetIterator()` |
2912 // (defined at https://tc39.github.io/ecma262/#sec-getiterator). Ignition | 2922 // (defined at https://tc39.github.io/ecma262/#sec-getiterator). Ignition |
2913 // desugars this into a LoadIC / JSLoadNamed, CallIC, and a type-check to | 2923 // desugars this into a LoadIC / JSLoadNamed, CallIC, and a type-check to |
2914 // validate return value of the Symbol.iterator() call. | 2924 // validate return value of the Symbol.iterator() call. |
2915 class GetIterator final : public Expression { | 2925 class GetIterator final : public Expression { |
2916 public: | 2926 public: |
| 2927 enum Hint { kNormal, kAsync }; |
| 2928 |
| 2929 Hint hint() const { return hint_; } |
| 2930 |
2917 Expression* iterable() const { return iterable_; } | 2931 Expression* iterable() const { return iterable_; } |
2918 void set_iterable(Expression* iterable) { iterable_ = iterable; } | 2932 void set_iterable(Expression* iterable) { iterable_ = iterable; } |
2919 | 2933 |
2920 static int num_ids() { return parent_num_ids(); } | 2934 static int num_ids() { return parent_num_ids(); } |
2921 | 2935 |
2922 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2936 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
2923 FeedbackVectorSlotCache* cache) { | 2937 FeedbackVectorSlotCache* cache) { |
2924 iterator_property_feedback_slot_ = | 2938 iterator_property_feedback_slot_ = |
2925 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); | 2939 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
2926 iterator_call_feedback_slot_ = | 2940 iterator_call_feedback_slot_ = |
2927 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); | 2941 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); |
| 2942 if (hint() == kAsync) { |
| 2943 // Can we just re-use the other slots? |
| 2944 async_iterator_property_feedback_slot_ = |
| 2945 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
| 2946 async_iterator_call_feedback_slot_ = |
| 2947 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); |
| 2948 } |
2928 } | 2949 } |
2929 | 2950 |
2930 FeedbackVectorSlot IteratorPropertyFeedbackSlot() const { | 2951 FeedbackVectorSlot IteratorPropertyFeedbackSlot() const { |
2931 return iterator_property_feedback_slot_; | 2952 return iterator_property_feedback_slot_; |
2932 } | 2953 } |
2933 | 2954 |
2934 FeedbackVectorSlot IteratorCallFeedbackSlot() const { | 2955 FeedbackVectorSlot IteratorCallFeedbackSlot() const { |
2935 return iterator_call_feedback_slot_; | 2956 return iterator_call_feedback_slot_; |
2936 } | 2957 } |
2937 | 2958 |
| 2959 FeedbackVectorSlot AsyncIteratorPropertyFeedbackSlot() const { |
| 2960 return async_iterator_property_feedback_slot_; |
| 2961 } |
| 2962 |
| 2963 FeedbackVectorSlot AsyncIteratorCallFeedbackSlot() const { |
| 2964 return async_iterator_call_feedback_slot_; |
| 2965 } |
| 2966 |
2938 private: | 2967 private: |
2939 friend class AstNodeFactory; | 2968 friend class AstNodeFactory; |
2940 | 2969 |
2941 explicit GetIterator(Expression* iterable, int pos) | 2970 explicit GetIterator(Expression* iterable, int pos) |
2942 : Expression(pos, kGetIterator), iterable_(iterable) {} | 2971 : Expression(pos, kGetIterator), iterable_(iterable), hint_(kNormal) {} |
| 2972 |
| 2973 explicit GetIterator(Expression* iterable, Hint hint, int pos) |
| 2974 : Expression(pos, kGetIterator), iterable_(iterable), hint_(hint) {} |
2943 | 2975 |
2944 Expression* iterable_; | 2976 Expression* iterable_; |
| 2977 Hint hint_; |
2945 FeedbackVectorSlot iterator_property_feedback_slot_; | 2978 FeedbackVectorSlot iterator_property_feedback_slot_; |
2946 FeedbackVectorSlot iterator_call_feedback_slot_; | 2979 FeedbackVectorSlot iterator_call_feedback_slot_; |
| 2980 FeedbackVectorSlot async_iterator_property_feedback_slot_; |
| 2981 FeedbackVectorSlot async_iterator_call_feedback_slot_; |
2947 }; | 2982 }; |
2948 | 2983 |
2949 // ---------------------------------------------------------------------------- | 2984 // ---------------------------------------------------------------------------- |
2950 // Basic visitor | 2985 // Basic visitor |
2951 // Sub-class should parametrize AstVisitor with itself, e.g.: | 2986 // Sub-class should parametrize AstVisitor with itself, e.g.: |
2952 // class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } | 2987 // class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } |
2953 | 2988 |
2954 template <class Subclass> | 2989 template <class Subclass> |
2955 class AstVisitor BASE_EMBEDDED { | 2990 class AstVisitor BASE_EMBEDDED { |
2956 public: | 2991 public: |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3144 STATEMENT_WITH_LABELS(SwitchStatement) | 3179 STATEMENT_WITH_LABELS(SwitchStatement) |
3145 #undef STATEMENT_WITH_LABELS | 3180 #undef STATEMENT_WITH_LABELS |
3146 | 3181 |
3147 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, | 3182 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, |
3148 ZoneList<const AstRawString*>* labels, | 3183 ZoneList<const AstRawString*>* labels, |
3149 int pos) { | 3184 int pos) { |
3150 switch (visit_mode) { | 3185 switch (visit_mode) { |
3151 case ForEachStatement::ENUMERATE: { | 3186 case ForEachStatement::ENUMERATE: { |
3152 return new (zone_) ForInStatement(labels, pos); | 3187 return new (zone_) ForInStatement(labels, pos); |
3153 } | 3188 } |
3154 case ForEachStatement::ITERATE: { | 3189 case ForEachStatement::ITERATE: |
| 3190 case ForEachStatement::ASYNC_ITERATE: { |
3155 return new (zone_) ForOfStatement(labels, pos); | 3191 return new (zone_) ForOfStatement(labels, pos); |
3156 } | 3192 } |
3157 } | 3193 } |
3158 UNREACHABLE(); | 3194 UNREACHABLE(); |
3159 return NULL; | 3195 return NULL; |
3160 } | 3196 } |
3161 | 3197 |
3162 ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) { | 3198 ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) { |
3163 return new (zone_) ExpressionStatement(expression, pos); | 3199 return new (zone_) ExpressionStatement(expression, pos); |
3164 } | 3200 } |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3424 | 3460 |
3425 Assignment* assign = new (zone_) Assignment(op, target, value, pos); | 3461 Assignment* assign = new (zone_) Assignment(op, target, value, pos); |
3426 if (assign->is_compound()) { | 3462 if (assign->is_compound()) { |
3427 assign->binary_operation_ = | 3463 assign->binary_operation_ = |
3428 NewBinaryOperation(assign->binary_op(), target, value, pos + 1); | 3464 NewBinaryOperation(assign->binary_op(), target, value, pos + 1); |
3429 } | 3465 } |
3430 return assign; | 3466 return assign; |
3431 } | 3467 } |
3432 | 3468 |
3433 Yield* NewYield(Expression* generator_object, Expression* expression, int pos, | 3469 Yield* NewYield(Expression* generator_object, Expression* expression, int pos, |
3434 Yield::OnException on_exception) { | 3470 Yield::OnException on_exception, |
| 3471 Yield::YieldType type = Yield::kNormal) { |
3435 if (!expression) expression = NewUndefinedLiteral(pos); | 3472 if (!expression) expression = NewUndefinedLiteral(pos); |
3436 return new (zone_) Yield(generator_object, expression, pos, on_exception); | 3473 return new (zone_) |
| 3474 Yield(generator_object, expression, pos, on_exception, type); |
3437 } | 3475 } |
3438 | 3476 |
3439 Throw* NewThrow(Expression* exception, int pos) { | 3477 Throw* NewThrow(Expression* exception, int pos) { |
3440 return new (zone_) Throw(exception, pos); | 3478 return new (zone_) Throw(exception, pos); |
3441 } | 3479 } |
3442 | 3480 |
3443 FunctionLiteral* NewFunctionLiteral( | 3481 FunctionLiteral* NewFunctionLiteral( |
3444 const AstRawString* name, DeclarationScope* scope, | 3482 const AstRawString* name, DeclarationScope* scope, |
3445 ZoneList<Statement*>* body, int materialized_literal_count, | 3483 ZoneList<Statement*>* body, int materialized_literal_count, |
3446 int expected_property_count, int parameter_count, int function_length, | 3484 int expected_property_count, int parameter_count, int function_length, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3519 } | 3557 } |
3520 | 3558 |
3521 EmptyParentheses* NewEmptyParentheses(int pos) { | 3559 EmptyParentheses* NewEmptyParentheses(int pos) { |
3522 return new (zone_) EmptyParentheses(pos); | 3560 return new (zone_) EmptyParentheses(pos); |
3523 } | 3561 } |
3524 | 3562 |
3525 GetIterator* NewGetIterator(Expression* iterable, int pos) { | 3563 GetIterator* NewGetIterator(Expression* iterable, int pos) { |
3526 return new (zone_) GetIterator(iterable, pos); | 3564 return new (zone_) GetIterator(iterable, pos); |
3527 } | 3565 } |
3528 | 3566 |
| 3567 GetIterator* NewGetIterator(Expression* iterable, GetIterator::Hint hint, |
| 3568 int pos) { |
| 3569 return new (zone_) GetIterator(iterable, hint, pos); |
| 3570 } |
| 3571 |
3529 Zone* zone() const { return zone_; } | 3572 Zone* zone() const { return zone_; } |
3530 void set_zone(Zone* zone) { zone_ = zone; } | 3573 void set_zone(Zone* zone) { zone_ = zone; } |
3531 | 3574 |
3532 // Handles use of temporary zones when parsing inner function bodies. | 3575 // Handles use of temporary zones when parsing inner function bodies. |
3533 class BodyScope { | 3576 class BodyScope { |
3534 public: | 3577 public: |
3535 BodyScope(AstNodeFactory* factory, Zone* temp_zone, bool use_temp_zone) | 3578 BodyScope(AstNodeFactory* factory, Zone* temp_zone, bool use_temp_zone) |
3536 : factory_(factory), prev_zone_(factory->zone_) { | 3579 : factory_(factory), prev_zone_(factory->zone_) { |
3537 if (use_temp_zone) { | 3580 if (use_temp_zone) { |
3538 factory->zone_ = temp_zone; | 3581 factory->zone_ = temp_zone; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3594 : NULL; \ | 3637 : NULL; \ |
3595 } | 3638 } |
3596 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3639 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
3597 #undef DECLARE_NODE_FUNCTIONS | 3640 #undef DECLARE_NODE_FUNCTIONS |
3598 | 3641 |
3599 | 3642 |
3600 } // namespace internal | 3643 } // namespace internal |
3601 } // namespace v8 | 3644 } // namespace v8 |
3602 | 3645 |
3603 #endif // V8_AST_AST_H_ | 3646 #endif // V8_AST_AST_H_ |
OLD | NEW |