| 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, kDelegate }; |
| 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, 2> {}; |
| 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 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2934 | 2944 |
| 2935 explicit EmptyParentheses(int pos) : Expression(pos, kEmptyParentheses) {} | 2945 explicit EmptyParentheses(int pos) : Expression(pos, kEmptyParentheses) {} |
| 2936 }; | 2946 }; |
| 2937 | 2947 |
| 2938 // Represents the spec operation `GetIterator()` | 2948 // Represents the spec operation `GetIterator()` |
| 2939 // (defined at https://tc39.github.io/ecma262/#sec-getiterator). Ignition | 2949 // (defined at https://tc39.github.io/ecma262/#sec-getiterator). Ignition |
| 2940 // desugars this into a LoadIC / JSLoadNamed, CallIC, and a type-check to | 2950 // desugars this into a LoadIC / JSLoadNamed, CallIC, and a type-check to |
| 2941 // validate return value of the Symbol.iterator() call. | 2951 // validate return value of the Symbol.iterator() call. |
| 2942 class GetIterator final : public Expression { | 2952 class GetIterator final : public Expression { |
| 2943 public: | 2953 public: |
| 2954 enum Hint { kNormal, kAsync }; |
| 2955 |
| 2956 Hint hint() const { return hint_; } |
| 2957 |
| 2944 Expression* iterable() const { return iterable_; } | 2958 Expression* iterable() const { return iterable_; } |
| 2945 void set_iterable(Expression* iterable) { iterable_ = iterable; } | 2959 void set_iterable(Expression* iterable) { iterable_ = iterable; } |
| 2946 | 2960 |
| 2947 static int num_ids() { return parent_num_ids(); } | 2961 static int num_ids() { return parent_num_ids(); } |
| 2948 | 2962 |
| 2949 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2963 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 2950 FeedbackVectorSlotCache* cache) { | 2964 FeedbackVectorSlotCache* cache) { |
| 2951 iterator_property_feedback_slot_ = | 2965 iterator_property_feedback_slot_ = |
| 2952 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); | 2966 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
| 2953 iterator_call_feedback_slot_ = | 2967 iterator_call_feedback_slot_ = |
| 2954 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); | 2968 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); |
| 2969 if (hint() == kAsync) { |
| 2970 // Can we just re-use the other slots? |
| 2971 async_iterator_property_feedback_slot_ = |
| 2972 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
| 2973 async_iterator_call_feedback_slot_ = |
| 2974 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); |
| 2975 } |
| 2955 } | 2976 } |
| 2956 | 2977 |
| 2957 FeedbackVectorSlot IteratorPropertyFeedbackSlot() const { | 2978 FeedbackVectorSlot IteratorPropertyFeedbackSlot() const { |
| 2958 return iterator_property_feedback_slot_; | 2979 return iterator_property_feedback_slot_; |
| 2959 } | 2980 } |
| 2960 | 2981 |
| 2961 FeedbackVectorSlot IteratorCallFeedbackSlot() const { | 2982 FeedbackVectorSlot IteratorCallFeedbackSlot() const { |
| 2962 return iterator_call_feedback_slot_; | 2983 return iterator_call_feedback_slot_; |
| 2963 } | 2984 } |
| 2964 | 2985 |
| 2986 FeedbackVectorSlot AsyncIteratorPropertyFeedbackSlot() const { |
| 2987 return async_iterator_property_feedback_slot_; |
| 2988 } |
| 2989 |
| 2990 FeedbackVectorSlot AsyncIteratorCallFeedbackSlot() const { |
| 2991 return async_iterator_call_feedback_slot_; |
| 2992 } |
| 2993 |
| 2965 private: | 2994 private: |
| 2966 friend class AstNodeFactory; | 2995 friend class AstNodeFactory; |
| 2967 | 2996 |
| 2968 explicit GetIterator(Expression* iterable, int pos) | 2997 explicit GetIterator(Expression* iterable, int pos) |
| 2969 : Expression(pos, kGetIterator), iterable_(iterable) {} | 2998 : Expression(pos, kGetIterator), iterable_(iterable), hint_(kNormal) {} |
| 2999 |
| 3000 explicit GetIterator(Expression* iterable, Hint hint, int pos) |
| 3001 : Expression(pos, kGetIterator), iterable_(iterable), hint_(hint) {} |
| 2970 | 3002 |
| 2971 Expression* iterable_; | 3003 Expression* iterable_; |
| 3004 Hint hint_; |
| 2972 FeedbackVectorSlot iterator_property_feedback_slot_; | 3005 FeedbackVectorSlot iterator_property_feedback_slot_; |
| 2973 FeedbackVectorSlot iterator_call_feedback_slot_; | 3006 FeedbackVectorSlot iterator_call_feedback_slot_; |
| 3007 FeedbackVectorSlot async_iterator_property_feedback_slot_; |
| 3008 FeedbackVectorSlot async_iterator_call_feedback_slot_; |
| 2974 }; | 3009 }; |
| 2975 | 3010 |
| 2976 // ---------------------------------------------------------------------------- | 3011 // ---------------------------------------------------------------------------- |
| 2977 // Basic visitor | 3012 // Basic visitor |
| 2978 // Sub-class should parametrize AstVisitor with itself, e.g.: | 3013 // Sub-class should parametrize AstVisitor with itself, e.g.: |
| 2979 // class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } | 3014 // class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } |
| 2980 | 3015 |
| 2981 template <class Subclass> | 3016 template <class Subclass> |
| 2982 class AstVisitor BASE_EMBEDDED { | 3017 class AstVisitor BASE_EMBEDDED { |
| 2983 public: | 3018 public: |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3171 STATEMENT_WITH_LABELS(SwitchStatement) | 3206 STATEMENT_WITH_LABELS(SwitchStatement) |
| 3172 #undef STATEMENT_WITH_LABELS | 3207 #undef STATEMENT_WITH_LABELS |
| 3173 | 3208 |
| 3174 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, | 3209 ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, |
| 3175 ZoneList<const AstRawString*>* labels, | 3210 ZoneList<const AstRawString*>* labels, |
| 3176 int pos) { | 3211 int pos) { |
| 3177 switch (visit_mode) { | 3212 switch (visit_mode) { |
| 3178 case ForEachStatement::ENUMERATE: { | 3213 case ForEachStatement::ENUMERATE: { |
| 3179 return new (zone_) ForInStatement(labels, pos); | 3214 return new (zone_) ForInStatement(labels, pos); |
| 3180 } | 3215 } |
| 3181 case ForEachStatement::ITERATE: { | 3216 case ForEachStatement::ITERATE: |
| 3217 case ForEachStatement::ASYNC_ITERATE: { |
| 3182 return new (zone_) ForOfStatement(labels, pos); | 3218 return new (zone_) ForOfStatement(labels, pos); |
| 3183 } | 3219 } |
| 3184 } | 3220 } |
| 3185 UNREACHABLE(); | 3221 UNREACHABLE(); |
| 3186 return NULL; | 3222 return NULL; |
| 3187 } | 3223 } |
| 3188 | 3224 |
| 3189 ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) { | 3225 ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) { |
| 3190 return new (zone_) ExpressionStatement(expression, pos); | 3226 return new (zone_) ExpressionStatement(expression, pos); |
| 3191 } | 3227 } |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3451 | 3487 |
| 3452 Assignment* assign = new (zone_) Assignment(op, target, value, pos); | 3488 Assignment* assign = new (zone_) Assignment(op, target, value, pos); |
| 3453 if (assign->is_compound()) { | 3489 if (assign->is_compound()) { |
| 3454 assign->binary_operation_ = | 3490 assign->binary_operation_ = |
| 3455 NewBinaryOperation(assign->binary_op(), target, value, pos + 1); | 3491 NewBinaryOperation(assign->binary_op(), target, value, pos + 1); |
| 3456 } | 3492 } |
| 3457 return assign; | 3493 return assign; |
| 3458 } | 3494 } |
| 3459 | 3495 |
| 3460 Yield* NewYield(Expression* generator_object, Expression* expression, int pos, | 3496 Yield* NewYield(Expression* generator_object, Expression* expression, int pos, |
| 3461 Yield::OnException on_exception) { | 3497 Yield::OnException on_exception, |
| 3498 Yield::YieldType type = Yield::kNormal) { |
| 3462 if (!expression) expression = NewUndefinedLiteral(pos); | 3499 if (!expression) expression = NewUndefinedLiteral(pos); |
| 3463 return new (zone_) Yield(generator_object, expression, pos, on_exception); | 3500 return new (zone_) |
| 3501 Yield(generator_object, expression, pos, on_exception, type); |
| 3464 } | 3502 } |
| 3465 | 3503 |
| 3466 Throw* NewThrow(Expression* exception, int pos) { | 3504 Throw* NewThrow(Expression* exception, int pos) { |
| 3467 return new (zone_) Throw(exception, pos); | 3505 return new (zone_) Throw(exception, pos); |
| 3468 } | 3506 } |
| 3469 | 3507 |
| 3470 FunctionLiteral* NewFunctionLiteral( | 3508 FunctionLiteral* NewFunctionLiteral( |
| 3471 const AstRawString* name, DeclarationScope* scope, | 3509 const AstRawString* name, DeclarationScope* scope, |
| 3472 ZoneList<Statement*>* body, int materialized_literal_count, | 3510 ZoneList<Statement*>* body, int materialized_literal_count, |
| 3473 int expected_property_count, int parameter_count, int function_length, | 3511 int expected_property_count, int parameter_count, int function_length, |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3546 } | 3584 } |
| 3547 | 3585 |
| 3548 EmptyParentheses* NewEmptyParentheses(int pos) { | 3586 EmptyParentheses* NewEmptyParentheses(int pos) { |
| 3549 return new (zone_) EmptyParentheses(pos); | 3587 return new (zone_) EmptyParentheses(pos); |
| 3550 } | 3588 } |
| 3551 | 3589 |
| 3552 GetIterator* NewGetIterator(Expression* iterable, int pos) { | 3590 GetIterator* NewGetIterator(Expression* iterable, int pos) { |
| 3553 return new (zone_) GetIterator(iterable, pos); | 3591 return new (zone_) GetIterator(iterable, pos); |
| 3554 } | 3592 } |
| 3555 | 3593 |
| 3594 GetIterator* NewGetIterator(Expression* iterable, GetIterator::Hint hint, |
| 3595 int pos) { |
| 3596 return new (zone_) GetIterator(iterable, hint, pos); |
| 3597 } |
| 3598 |
| 3556 Zone* zone() const { return zone_; } | 3599 Zone* zone() const { return zone_; } |
| 3557 void set_zone(Zone* zone) { zone_ = zone; } | 3600 void set_zone(Zone* zone) { zone_ = zone; } |
| 3558 | 3601 |
| 3559 // Handles use of temporary zones when parsing inner function bodies. | 3602 // Handles use of temporary zones when parsing inner function bodies. |
| 3560 class BodyScope { | 3603 class BodyScope { |
| 3561 public: | 3604 public: |
| 3562 BodyScope(AstNodeFactory* factory, Zone* temp_zone, bool use_temp_zone) | 3605 BodyScope(AstNodeFactory* factory, Zone* temp_zone, bool use_temp_zone) |
| 3563 : factory_(factory), prev_zone_(factory->zone_) { | 3606 : factory_(factory), prev_zone_(factory->zone_) { |
| 3564 if (use_temp_zone) { | 3607 if (use_temp_zone) { |
| 3565 factory->zone_ = temp_zone; | 3608 factory->zone_ = temp_zone; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3621 : NULL; \ | 3664 : NULL; \ |
| 3622 } | 3665 } |
| 3623 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3666 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 3624 #undef DECLARE_NODE_FUNCTIONS | 3667 #undef DECLARE_NODE_FUNCTIONS |
| 3625 | 3668 |
| 3626 | 3669 |
| 3627 } // namespace internal | 3670 } // namespace internal |
| 3628 } // namespace v8 | 3671 } // namespace v8 |
| 3629 | 3672 |
| 3630 #endif // V8_AST_AST_H_ | 3673 #endif // V8_AST_AST_H_ |
| OLD | NEW |