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

Side by Side Diff: src/ast.h

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 unified diff | Download patch
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/preparser.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_AST_H_ 5 #ifndef V8_AST_H_
6 #define V8_AST_H_ 6 #define V8_AST_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/assembler.h" 10 #include "src/assembler.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 V(Yield) \ 86 V(Yield) \
87 V(Throw) \ 87 V(Throw) \
88 V(Property) \ 88 V(Property) \
89 V(Call) \ 89 V(Call) \
90 V(CallNew) \ 90 V(CallNew) \
91 V(CallRuntime) \ 91 V(CallRuntime) \
92 V(UnaryOperation) \ 92 V(UnaryOperation) \
93 V(CountOperation) \ 93 V(CountOperation) \
94 V(BinaryOperation) \ 94 V(BinaryOperation) \
95 V(CompareOperation) \ 95 V(CompareOperation) \
96 V(SpreadOperation) \
96 V(ThisFunction) \ 97 V(ThisFunction) \
97 V(SuperReference) \ 98 V(SuperReference) \
98 V(CaseClause) 99 V(CaseClause)
99 100
100 #define AST_NODE_LIST(V) \ 101 #define AST_NODE_LIST(V) \
101 DECLARATION_NODE_LIST(V) \ 102 DECLARATION_NODE_LIST(V) \
102 MODULE_NODE_LIST(V) \ 103 MODULE_NODE_LIST(V) \
103 STATEMENT_NODE_LIST(V) \ 104 STATEMENT_NODE_LIST(V) \
104 EXPRESSION_NODE_LIST(V) 105 EXPRESSION_NODE_LIST(V)
105 106
(...skipping 15 matching lines...) Expand all
121 class RegExpBackReference; 122 class RegExpBackReference;
122 class RegExpCapture; 123 class RegExpCapture;
123 class RegExpCharacterClass; 124 class RegExpCharacterClass;
124 class RegExpCompiler; 125 class RegExpCompiler;
125 class RegExpDisjunction; 126 class RegExpDisjunction;
126 class RegExpEmpty; 127 class RegExpEmpty;
127 class RegExpLookahead; 128 class RegExpLookahead;
128 class RegExpQuantifier; 129 class RegExpQuantifier;
129 class RegExpText; 130 class RegExpText;
130 131
132 // Other forward declarations
133 class Scope;
134
131 #define DEF_FORWARD_DECLARATION(type) class type; 135 #define DEF_FORWARD_DECLARATION(type) class type;
132 AST_NODE_LIST(DEF_FORWARD_DECLARATION) 136 AST_NODE_LIST(DEF_FORWARD_DECLARATION)
133 #undef DEF_FORWARD_DECLARATION 137 #undef DEF_FORWARD_DECLARATION
134 138
135 139
136 // Typedef only introduced to avoid unreadable code. 140 // Typedef only introduced to avoid unreadable code.
137 // Please do appreciate the required space in "> >". 141 // Please do appreciate the required space in "> >".
138 typedef ZoneList<Handle<String> > ZoneStringList; 142 typedef ZoneList<Handle<String> > ZoneStringList;
139 typedef ZoneList<Handle<Object> > ZoneObjectList; 143 typedef ZoneList<Handle<Object> > ZoneObjectList;
140 144
(...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 // Helpers to determine how to handle the call. 1888 // Helpers to determine how to handle the call.
1885 CallType GetCallType(Isolate* isolate) const; 1889 CallType GetCallType(Isolate* isolate) const;
1886 bool IsUsingCallFeedbackSlot(Isolate* isolate) const; 1890 bool IsUsingCallFeedbackSlot(Isolate* isolate) const;
1887 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const; 1891 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const;
1888 1892
1889 #ifdef DEBUG 1893 #ifdef DEBUG
1890 // Used to assert that the FullCodeGenerator records the return site. 1894 // Used to assert that the FullCodeGenerator records the return site.
1891 bool return_is_recorded_; 1895 bool return_is_recorded_;
1892 #endif 1896 #endif
1893 1897
1898 static bool HasSpreadArguments(ZoneList<Expression*>* arguments) {
1899 ZoneList<Expression*>::iterator it;
1900 for (it = arguments->begin(); it != arguments->end(); ++it) {
1901 if ((*it)->IsSpreadOperation()) {
1902 return true;
1903 }
1904 }
1905 return false;
1906 }
1907
1908 inline bool HasSpreadArguments() const {
1909 return HasSpreadArgumentsField::decode(bit_field_);
1910 }
1911
1894 protected: 1912 protected:
1895 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1913 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1896 int pos) 1914 int pos)
1897 : Expression(zone, pos), 1915 : Expression(zone, pos),
1898 ic_slot_or_slot_(FeedbackVectorICSlot::Invalid().ToInt()), 1916 ic_slot_or_slot_(FeedbackVectorICSlot::Invalid().ToInt()),
1899 expression_(expression), 1917 expression_(expression),
1900 arguments_(arguments), 1918 arguments_(arguments),
1901 bit_field_(IsUninitializedField::encode(false)) { 1919 bit_field_(
1920 IsUninitializedField::encode(false) |
1921 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
1902 if (expression->IsProperty()) { 1922 if (expression->IsProperty()) {
1903 expression->AsProperty()->mark_for_call(); 1923 expression->AsProperty()->mark_for_call();
1904 } 1924 }
1905 } 1925 }
1906 static int parent_num_ids() { return Expression::num_ids(); } 1926 static int parent_num_ids() { return Expression::num_ids(); }
1907 1927
1908 private: 1928 private:
1909 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1929 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1910 1930
1911 // We store this as an integer because we don't know if we have a slot or 1931 // We store this as an integer because we don't know if we have a slot or
1912 // an ic slot until scoping time. 1932 // an ic slot until scoping time.
1913 int ic_slot_or_slot_; 1933 int ic_slot_or_slot_;
1914 Expression* expression_; 1934 Expression* expression_;
1915 ZoneList<Expression*>* arguments_; 1935 ZoneList<Expression*>* arguments_;
1916 Handle<JSFunction> target_; 1936 Handle<JSFunction> target_;
1917 Handle<Cell> cell_; 1937 Handle<Cell> cell_;
1918 Handle<AllocationSite> allocation_site_; 1938 Handle<AllocationSite> allocation_site_;
1919 class IsUninitializedField : public BitField8<bool, 0, 1> {}; 1939 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1940 class HasSpreadArgumentsField : public BitField8<bool, 1, 1> {};
1920 uint8_t bit_field_; 1941 uint8_t bit_field_;
1921 }; 1942 };
1922 1943
1923 1944
1924 class CallNew FINAL : public Expression { 1945 class CallNew FINAL : public Expression {
1925 public: 1946 public:
1926 DECLARE_NODE_TYPE(CallNew) 1947 DECLARE_NODE_TYPE(CallNew)
1927 1948
1928 Expression* expression() const { return expression_; } 1949 Expression* expression() const { return expression_; }
1929 ZoneList<Expression*>* arguments() const { return arguments_; } 1950 ZoneList<Expression*>* arguments() const { return arguments_; }
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
2236 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2257 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2237 2258
2238 Token::Value op_; 2259 Token::Value op_;
2239 Expression* left_; 2260 Expression* left_;
2240 Expression* right_; 2261 Expression* right_;
2241 2262
2242 Type* combined_type_; 2263 Type* combined_type_;
2243 }; 2264 };
2244 2265
2245 2266
2267 class SpreadOperation FINAL : public Expression {
2268 public:
2269 DECLARE_NODE_TYPE(SpreadOperation)
2270
2271 Expression* expression() const { return expression_; }
2272 Expression* assign_iterator() const { return assign_iterator_; }
2273 Expression* next_result() const { return next_result_; }
2274 Expression* result_done() const { return result_done_; }
2275 Expression* result_value() const { return result_value_; }
2276
2277 static int num_ids() { return parent_num_ids(); }
2278
2279 protected:
2280 SpreadOperation(Zone* zone, AstNodeFactory* factory,
2281 AstValueFactory* value_factory, Scope* scope,
2282 Expression* expression, int pos);
2283 static int parent_num_ids() { return Expression::num_ids(); }
2284
2285 private:
2286 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2287
2288 Expression* expression_;
2289 Expression* assign_iterator_;
2290 Expression* next_result_;
2291 Expression* result_done_;
2292 Expression* result_value_;
2293 };
2294
2295
2246 class Conditional FINAL : public Expression { 2296 class Conditional FINAL : public Expression {
2247 public: 2297 public:
2248 DECLARE_NODE_TYPE(Conditional) 2298 DECLARE_NODE_TYPE(Conditional)
2249 2299
2250 Expression* condition() const { return condition_; } 2300 Expression* condition() const { return condition_; }
2251 Expression* then_expression() const { return then_expression_; } 2301 Expression* then_expression() const { return then_expression_; }
2252 Expression* else_expression() const { return else_expression_; } 2302 Expression* else_expression() const { return else_expression_; }
2253 2303
2254 static int num_ids() { return parent_num_ids() + 2; } 2304 static int num_ids() { return parent_num_ids() + 2; }
2255 BailoutId ThenId() const { return BailoutId(local_id(0)); } 2305 BailoutId ThenId() const { return BailoutId(local_id(0)); }
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after
3456 return new (zone_) CountOperation(zone_, op, is_prefix, expr, pos); 3506 return new (zone_) CountOperation(zone_, op, is_prefix, expr, pos);
3457 } 3507 }
3458 3508
3459 CompareOperation* NewCompareOperation(Token::Value op, 3509 CompareOperation* NewCompareOperation(Token::Value op,
3460 Expression* left, 3510 Expression* left,
3461 Expression* right, 3511 Expression* right,
3462 int pos) { 3512 int pos) {
3463 return new (zone_) CompareOperation(zone_, op, left, right, pos); 3513 return new (zone_) CompareOperation(zone_, op, left, right, pos);
3464 } 3514 }
3465 3515
3516 SpreadOperation* NewSpreadOperation(Scope* scope, Expression* expression,
3517 int pos) {
3518 return new (zone_) SpreadOperation(zone_, this, ast_value_factory_, scope,
3519 expression, pos);
3520 }
3521
3466 Conditional* NewConditional(Expression* condition, 3522 Conditional* NewConditional(Expression* condition,
3467 Expression* then_expression, 3523 Expression* then_expression,
3468 Expression* else_expression, 3524 Expression* else_expression,
3469 int position) { 3525 int position) {
3470 return new (zone_) Conditional(zone_, condition, then_expression, 3526 return new (zone_) Conditional(zone_, condition, then_expression,
3471 else_expression, position); 3527 else_expression, position);
3472 } 3528 }
3473 3529
3474 Assignment* NewAssignment(Token::Value op, 3530 Assignment* NewAssignment(Token::Value op,
3475 Expression* target, 3531 Expression* target,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3531 } 3587 }
3532 3588
3533 ThisFunction* NewThisFunction(int pos) { 3589 ThisFunction* NewThisFunction(int pos) {
3534 return new (zone_) ThisFunction(zone_, pos); 3590 return new (zone_) ThisFunction(zone_, pos);
3535 } 3591 }
3536 3592
3537 SuperReference* NewSuperReference(VariableProxy* this_var, int pos) { 3593 SuperReference* NewSuperReference(VariableProxy* this_var, int pos) {
3538 return new (zone_) SuperReference(zone_, this_var, pos); 3594 return new (zone_) SuperReference(zone_, this_var, pos);
3539 } 3595 }
3540 3596
3597 // Utilities
3598 Expression* GetIterator(Expression* iterable) {
3599 Expression* iterator_symbol_literal =
3600 NewSymbolLiteral("iterator_symbol", RelocInfo::kNoPosition);
3601 int pos = iterable->position();
3602 Expression* prop = NewProperty(iterable, iterator_symbol_literal, pos);
3603 ZoneList<Expression*>* args = new (zone_) ZoneList<Expression*>(0, zone_);
3604 return NewCall(prop, args, pos);
3605 }
3606
3541 private: 3607 private:
3542 Zone* zone_; 3608 Zone* zone_;
3543 AstValueFactory* ast_value_factory_; 3609 AstValueFactory* ast_value_factory_;
3544 }; 3610 };
3545 3611
3546 3612
3547 } } // namespace v8::internal 3613 } } // namespace v8::internal
3548 3614
3549 #endif // V8_AST_H_ 3615 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/preparser.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698