| Index: src/ast.h
|
| diff --git a/src/ast.h b/src/ast.h
|
| index e457e66a215f1aed49d48e5c54ffed107b29cca9..6b11e2ee6e51f84663b4455ebecccacaf1507c55 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,14 @@ class Call FINAL : public Expression {
|
| bool return_is_recorded_;
|
| #endif
|
|
|
| + inline void MarkSpreadCall() {
|
| + bit_field_ |= HasSpreadArgumentsField::encode(true);
|
| + }
|
| +
|
| + inline bool HasSpreadArguments() const {
|
| + return HasSpreadArgumentsField::decode(bit_field_);
|
| + }
|
| +
|
| protected:
|
| Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
|
| int pos)
|
| @@ -1898,7 +1910,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(false)) {
|
| if (expression->IsProperty()) {
|
| expression->AsProperty()->mark_for_call();
|
| }
|
| @@ -1917,6 +1931,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 +2258,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 +3507,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 +3588,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_;
|
|
|