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

Unified Diff: src/ast.cc

Issue 919703003: WIP: Implement ES6 Spread-calls (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: AssignmentExpressions are not spreadable, add cctests for parsing Created 5 years, 10 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
Index: src/ast.cc
diff --git a/src/ast.cc b/src/ast.cc
index 9ef8af411cbd158226f9097359ac235dcf849b54..6d69246de10bf3bfc98a3476553581f1044add15 100644
--- a/src/ast.cc
+++ b/src/ast.cc
@@ -544,6 +544,56 @@ bool FunctionDeclaration::IsInlineable() const {
}
+SpreadOperation::SpreadOperation(Zone* zone, AstNodeFactory* factory,
+ AstValueFactory* value_factory, Scope* scope,
+ Expression* expression, int pos) :
+ Expression(zone, pos), expression_(expression) {
+ Variable* iterator = scope->DeclarationScope()->NewTemporary(
+ value_factory->dot_iterator_string());
+ Variable* result = scope->DeclarationScope()->NewTemporary(
+ value_factory->dot_result_string());
+
+ // var iterator = subject[Symbol.iterator]();
+ assign_iterator_ = factory->NewAssignment(
+ Token::ASSIGN, factory->NewVariableProxy(iterator),
+ factory->GetIterator(expression), pos);
+
+ // var result = iterator.next();
+ {
+ Expression* iterator_proxy = factory->NewVariableProxy(iterator);
+ Expression* next_literal = factory->NewStringLiteral(
+ value_factory->next_string(), RelocInfo::kNoPosition);
+ Expression* next_property = factory->NewProperty(
+ iterator_proxy, next_literal, RelocInfo::kNoPosition);
+ ZoneList<Expression*>* next_arguments =
+ new(zone) ZoneList<Expression*>(0, zone);
+ Expression* next_call = factory->NewCall(next_property, next_arguments,
+ pos);
+ Expression* result_proxy = factory->NewVariableProxy(result);
+ next_result_ = factory->NewAssignment(Token::ASSIGN, result_proxy,
+ next_call, pos);
+ }
+
+ // result.done
+ {
+ Expression* done_literal = factory->NewStringLiteral(
+ value_factory->done_string(), RelocInfo::kNoPosition);
+ Expression* result_proxy = factory->NewVariableProxy(result);
+ result_done_ = factory->NewProperty(
+ result_proxy, done_literal, RelocInfo::kNoPosition);
+ }
+
+ // result.value
+ {
+ Expression* value_literal = factory->NewStringLiteral(
+ value_factory->value_string(), RelocInfo::kNoPosition);
+ Expression* result_proxy = factory->NewVariableProxy(result);
+ result_value_ = factory->NewProperty(result_proxy, value_literal,
+ RelocInfo::kNoPosition);
+ }
+}
+
+
// ----------------------------------------------------------------------------
// Recording of type feedback

Powered by Google App Engine
This is Rietveld 408576698