Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Unified Diff: src/ast/ast.h

Issue 2622833002: WIP [esnext] implement async iteration proposal (Closed)
Patch Set: simplify AsyncIteratorValueUnwrap Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm64/macro-assembler-arm64.cc ('k') | src/ast/ast-numbering.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ast/ast.h
diff --git a/src/ast/ast.h b/src/ast/ast.h
index 12e8de97158c3d44c8b6c28f469aec59b3642461..bdc1914f618d4428d3e5c59fd90375fadaf9afec 100644
--- a/src/ast/ast.h
+++ b/src/ast/ast.h
@@ -693,14 +693,17 @@ class ForStatement final : public IterationStatement {
class ForEachStatement : public IterationStatement {
public:
enum VisitMode {
- ENUMERATE, // for (each in subject) body;
- ITERATE // for (each of subject) body;
+ ENUMERATE, // for (each in subject) body;
+ ITERATE, // for (each of subject) body;
+ ASYNC_ITERATE, // for await (each of subject) body;
};
using IterationStatement::Initialize;
static const char* VisitModeString(VisitMode mode) {
- return mode == ITERATE ? "for-of" : "for-in";
+ static const char* kModeStrings[] = {"for-in", "for-of", "for-await-of"};
+ DCHECK(mode >= ENUMERATE && mode <= ASYNC_ITERATE);
+ return kModeStrings[mode];
}
protected:
@@ -836,7 +839,6 @@ class ForOfStatement final : public ForEachStatement {
Expression* assign_each_;
};
-
class ExpressionStatement final : public Statement {
public:
void set_expression(Expression* e) { expression_ = e; }
@@ -2482,6 +2484,7 @@ class RewritableExpression final : public Expression {
class Yield final : public Expression {
public:
enum OnException { kOnExceptionThrow, kOnExceptionRethrow };
+ enum YieldType { kNormal, kAwait, kDelegate };
Expression* generator_object() const { return generator_object_; }
Expression* expression() const { return expression_; }
@@ -2492,21 +2495,26 @@ class Yield final : public Expression {
return on_exception() == kOnExceptionRethrow;
}
int yield_id() const { return yield_id_; }
+ YieldType yield_type() const { return YieldTypeField::decode(bit_field_); }
void set_generator_object(Expression* e) { generator_object_ = e; }
void set_expression(Expression* e) { expression_ = e; }
void set_yield_id(int yield_id) { yield_id_ = yield_id; }
+ void set_yield_type(YieldType type) {
+ bit_field_ = YieldTypeField::update(bit_field_, type);
+ }
private:
friend class AstNodeFactory;
Yield(Expression* generator_object, Expression* expression, int pos,
- OnException on_exception)
+ OnException on_exception, YieldType yield_type = kNormal)
: Expression(pos, kYield),
yield_id_(-1),
generator_object_(generator_object),
expression_(expression) {
- bit_field_ |= OnExceptionField::encode(on_exception);
+ bit_field_ |= OnExceptionField::encode(on_exception) |
+ YieldTypeField::encode(yield_type);
}
int yield_id_;
@@ -2515,6 +2523,8 @@ class Yield final : public Expression {
class OnExceptionField
: public BitField<OnException, Expression::kNextBitFieldIndex, 1> {};
+ class YieldTypeField
+ : public BitField<YieldType, OnExceptionField::kNext, 2> {};
};
@@ -2941,6 +2951,10 @@ class EmptyParentheses final : public Expression {
// validate return value of the Symbol.iterator() call.
class GetIterator final : public Expression {
public:
+ enum Hint { kNormal, kAsync };
+
+ Hint hint() const { return hint_; }
+
Expression* iterable() const { return iterable_; }
void set_iterable(Expression* iterable) { iterable_ = iterable; }
@@ -2952,6 +2966,13 @@ 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 {
@@ -2962,15 +2983,29 @@ 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) {}
+ : Expression(pos, kGetIterator), iterable_(iterable), hint_(kNormal) {}
+
+ explicit GetIterator(Expression* iterable, Hint hint, int pos)
+ : Expression(pos, kGetIterator), iterable_(iterable), hint_(hint) {}
Expression* iterable_;
+ Hint hint_;
FeedbackVectorSlot iterator_property_feedback_slot_;
FeedbackVectorSlot iterator_call_feedback_slot_;
+ FeedbackVectorSlot async_iterator_property_feedback_slot_;
+ FeedbackVectorSlot async_iterator_call_feedback_slot_;
};
// ----------------------------------------------------------------------------
@@ -3178,7 +3213,8 @@ class AstNodeFactory final BASE_EMBEDDED {
case ForEachStatement::ENUMERATE: {
return new (zone_) ForInStatement(labels, pos);
}
- case ForEachStatement::ITERATE: {
+ case ForEachStatement::ITERATE:
+ case ForEachStatement::ASYNC_ITERATE: {
return new (zone_) ForOfStatement(labels, pos);
}
}
@@ -3458,9 +3494,11 @@ class AstNodeFactory final BASE_EMBEDDED {
}
Yield* NewYield(Expression* generator_object, Expression* expression, int pos,
- Yield::OnException on_exception) {
+ Yield::OnException on_exception,
+ Yield::YieldType type = Yield::kNormal) {
if (!expression) expression = NewUndefinedLiteral(pos);
- return new (zone_) Yield(generator_object, expression, pos, on_exception);
+ return new (zone_)
+ Yield(generator_object, expression, pos, on_exception, type);
}
Throw* NewThrow(Expression* exception, int pos) {
@@ -3553,6 +3591,11 @@ class AstNodeFactory final BASE_EMBEDDED {
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_; }
void set_zone(Zone* zone) { zone_ = zone; }
« no previous file with comments | « src/arm64/macro-assembler-arm64.cc ('k') | src/ast/ast-numbering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698