Index: src/ast/ast.h |
diff --git a/src/ast/ast.h b/src/ast/ast.h |
index 9a87328a7b98ad1cb1fc62a9da26d03d1fdfc5cd..9da5d0dd1ef4e0915c635aeddb2ae83314521200 100644 |
--- a/src/ast/ast.h |
+++ b/src/ast/ast.h |
@@ -2967,6 +2967,10 @@ class EmptyParentheses final : public Expression { |
// validate return value of the Symbol.iterator() call. |
class GetIterator final : public Expression { |
public: |
+ enum Hint { kNormal, kAsync }; |
neis
2017/01/20 14:38:15
Can you instead use the IteratorType enum that you
|
+ |
+ Hint hint() const { return hint_; } |
+ |
Expression* iterable() const { return iterable_; } |
void set_iterable(Expression* iterable) { iterable_ = iterable; } |
@@ -2978,6 +2982,14 @@ class GetIterator final : public Expression { |
spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
iterator_call_feedback_slot_ = |
spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); |
+ |
+ if (hint() == kAsync) { |
+ // Can we just re-use the other slots? |
+ async_iterator_property_feedback_slot_ = |
+ spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
+ async_iterator_call_feedback_slot_ = |
+ spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); |
+ } |
} |
FeedbackVectorSlot IteratorPropertyFeedbackSlot() const { |
@@ -2988,15 +3000,26 @@ class GetIterator final : public Expression { |
return iterator_call_feedback_slot_; |
} |
+ FeedbackVectorSlot AsyncIteratorPropertyFeedbackSlot() const { |
+ return async_iterator_property_feedback_slot_; |
+ } |
+ |
+ FeedbackVectorSlot AsyncIteratorCallFeedbackSlot() const { |
+ return async_iterator_call_feedback_slot_; |
+ } |
+ |
private: |
friend class AstNodeFactory; |
- explicit GetIterator(Expression* iterable, int pos) |
- : Expression(pos, kGetIterator), iterable_(iterable) {} |
+ explicit GetIterator(Expression* iterable, Hint hint, int pos) |
+ : Expression(pos, kGetIterator), hint_(hint), iterable_(iterable) {} |
+ Hint hint_; |
Expression* iterable_; |
FeedbackVectorSlot iterator_property_feedback_slot_; |
FeedbackVectorSlot iterator_call_feedback_slot_; |
+ FeedbackVectorSlot async_iterator_property_feedback_slot_; |
+ FeedbackVectorSlot async_iterator_call_feedback_slot_; |
}; |
// ---------------------------------------------------------------------------- |
@@ -3576,8 +3599,9 @@ class AstNodeFactory final BASE_EMBEDDED { |
return new (zone_) EmptyParentheses(pos); |
} |
- GetIterator* NewGetIterator(Expression* iterable, int pos) { |
- return new (zone_) GetIterator(iterable, pos); |
+ GetIterator* NewGetIterator(Expression* iterable, GetIterator::Hint hint, |
+ int pos) { |
+ return new (zone_) GetIterator(iterable, hint, pos); |
} |
Zone* zone() const { return zone_; } |