Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index e457e66a215f1aed49d48e5c54ffed107b29cca9..19c51fdf552fc6ab1a045172089d9c09fd477655 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -93,6 +93,7 @@ namespace internal { |
V(CountOperation) \ |
V(BinaryOperation) \ |
V(CompareOperation) \ |
+ V(SpreadOperation) \ |
V(ThisFunction) \ |
V(SuperReference) \ |
V(CaseClause) |
@@ -128,6 +129,9 @@ class RegExpLookahead; |
class RegExpQuantifier; |
class RegExpText; |
+// Other forward declarations |
+class Scope; |
+ |
#define DEF_FORWARD_DECLARATION(type) class type; |
AST_NODE_LIST(DEF_FORWARD_DECLARATION) |
#undef DEF_FORWARD_DECLARATION |
@@ -1891,6 +1895,20 @@ class Call FINAL : public Expression { |
bool return_is_recorded_; |
#endif |
+ static bool HasSpreadArguments(ZoneList<Expression*>* arguments) { |
+ ZoneList<Expression*>::iterator it; |
+ for (it = arguments->begin(); it != arguments->end(); ++it) { |
+ if ((*it)->IsSpreadOperation()) { |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ inline bool HasSpreadArguments() const { |
+ return HasSpreadArgumentsField::decode(bit_field_); |
+ } |
+ |
protected: |
Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
int pos) |
@@ -1898,7 +1916,9 @@ class Call FINAL : public Expression { |
ic_slot_or_slot_(FeedbackVectorICSlot::Invalid().ToInt()), |
expression_(expression), |
arguments_(arguments), |
- bit_field_(IsUninitializedField::encode(false)) { |
+ bit_field_( |
+ IsUninitializedField::encode(false) | |
+ HasSpreadArgumentsField::encode(HasSpreadArguments(arguments))) { |
arv (Not doing code reviews)
2015/02/12 21:41:34
Maybe have the parser keep track of this and set t
|
if (expression->IsProperty()) { |
expression->AsProperty()->mark_for_call(); |
} |
@@ -1917,6 +1937,7 @@ class Call FINAL : public Expression { |
Handle<Cell> cell_; |
Handle<AllocationSite> allocation_site_; |
class IsUninitializedField : public BitField8<bool, 0, 1> {}; |
+ class HasSpreadArgumentsField : public BitField8<bool, 1, 1> {}; |
uint8_t bit_field_; |
}; |
@@ -2243,6 +2264,35 @@ class CompareOperation FINAL : public Expression { |
}; |
+class SpreadOperation FINAL : public Expression { |
+ public: |
+ DECLARE_NODE_TYPE(SpreadOperation) |
+ |
+ Expression* expression() const { return expression_; } |
+ Expression* assign_iterator() const { return assign_iterator_; } |
+ Expression* next_result() const { return next_result_; } |
+ Expression* result_done() const { return result_done_; } |
+ Expression* result_value() const { return result_value_; } |
+ |
+ static int num_ids() { return parent_num_ids(); } |
+ |
+ protected: |
+ SpreadOperation(Zone* zone, AstNodeFactory* factory, |
+ AstValueFactory* value_factory, Scope* scope, |
+ Expression* expression, int pos); |
+ static int parent_num_ids() { return Expression::num_ids(); } |
+ |
+ private: |
+ int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
+ |
+ Expression* expression_; |
+ Expression* assign_iterator_; |
+ Expression* next_result_; |
+ Expression* result_done_; |
+ Expression* result_value_; |
+}; |
+ |
+ |
class Conditional FINAL : public Expression { |
public: |
DECLARE_NODE_TYPE(Conditional) |
@@ -3463,6 +3513,12 @@ class AstNodeFactory FINAL BASE_EMBEDDED { |
return new (zone_) CompareOperation(zone_, op, left, right, pos); |
} |
+ SpreadOperation* NewSpreadOperation(Scope* scope, Expression* expression, |
+ int pos) { |
+ return new (zone_) SpreadOperation(zone_, this, ast_value_factory_, scope, |
+ expression, pos); |
+ } |
+ |
Conditional* NewConditional(Expression* condition, |
Expression* then_expression, |
Expression* else_expression, |
@@ -3538,6 +3594,16 @@ class AstNodeFactory FINAL BASE_EMBEDDED { |
return new (zone_) SuperReference(zone_, this_var, pos); |
} |
+ // Utilities |
+ Expression* GetIterator(Expression* iterable) { |
+ Expression* iterator_symbol_literal = |
+ NewSymbolLiteral("iterator_symbol", RelocInfo::kNoPosition); |
+ int pos = iterable->position(); |
+ Expression* prop = NewProperty(iterable, iterator_symbol_literal, pos); |
+ ZoneList<Expression*>* args = new (zone_) ZoneList<Expression*>(0, zone_); |
+ return NewCall(prop, args, pos); |
+ } |
+ |
private: |
Zone* zone_; |
AstValueFactory* ast_value_factory_; |