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 |