Index: src/ast/ast.h |
diff --git a/src/ast/ast.h b/src/ast/ast.h |
index 9a87328a7b98ad1cb1fc62a9da26d03d1fdfc5cd..553725c8a5a38372e7aa26ff48cc29a89efa47fa 100644 |
--- a/src/ast/ast.h |
+++ b/src/ast/ast.h |
@@ -2965,8 +2965,13 @@ class EmptyParentheses final : public Expression { |
// (defined at https://tc39.github.io/ecma262/#sec-getiterator). Ignition |
// desugars this into a LoadIC / JSLoadNamed, CallIC, and a type-check to |
// validate return value of the Symbol.iterator() call. |
+enum class IteratorType { kNormal, kAsync }; |
class GetIterator final : public Expression { |
public: |
+ using Hint = IteratorType; |
+ |
+ Hint hint() const { return hint_; } |
+ |
Expression* iterable() const { return iterable_; } |
void set_iterable(Expression* iterable) { iterable_ = iterable; } |
@@ -2978,6 +2983,14 @@ class GetIterator final : public Expression { |
spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
iterator_call_feedback_slot_ = |
spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); |
+ |
+ if (hint() == 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 +3001,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 +3600,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_; } |