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

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: Flag calls as spread calls in parser, error on spread intrinsics/construct calls 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/compiler/ast-graph-builder.cc » ('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 inline void MarkSpreadCall() {
1899 bit_field_ |= HasSpreadArgumentsField::encode(true);
1900 }
1901
1902 inline bool HasSpreadArguments() const {
1903 return HasSpreadArgumentsField::decode(bit_field_);
1904 }
1905
1894 protected: 1906 protected:
1895 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1907 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1896 int pos) 1908 int pos)
1897 : Expression(zone, pos), 1909 : Expression(zone, pos),
1898 ic_slot_or_slot_(FeedbackVectorICSlot::Invalid().ToInt()), 1910 ic_slot_or_slot_(FeedbackVectorICSlot::Invalid().ToInt()),
1899 expression_(expression), 1911 expression_(expression),
1900 arguments_(arguments), 1912 arguments_(arguments),
1901 bit_field_(IsUninitializedField::encode(false)) { 1913 bit_field_(
1914 IsUninitializedField::encode(false) |
1915 HasSpreadArgumentsField::encode(false)) {
1902 if (expression->IsProperty()) { 1916 if (expression->IsProperty()) {
1903 expression->AsProperty()->mark_for_call(); 1917 expression->AsProperty()->mark_for_call();
1904 } 1918 }
1905 } 1919 }
1906 static int parent_num_ids() { return Expression::num_ids(); } 1920 static int parent_num_ids() { return Expression::num_ids(); }
1907 1921
1908 private: 1922 private:
1909 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1923 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1910 1924
1911 // We store this as an integer because we don't know if we have a slot or 1925 // We store this as an integer because we don't know if we have a slot or
1912 // an ic slot until scoping time. 1926 // an ic slot until scoping time.
1913 int ic_slot_or_slot_; 1927 int ic_slot_or_slot_;
1914 Expression* expression_; 1928 Expression* expression_;
1915 ZoneList<Expression*>* arguments_; 1929 ZoneList<Expression*>* arguments_;
1916 Handle<JSFunction> target_; 1930 Handle<JSFunction> target_;
1917 Handle<Cell> cell_; 1931 Handle<Cell> cell_;
1918 Handle<AllocationSite> allocation_site_; 1932 Handle<AllocationSite> allocation_site_;
1919 class IsUninitializedField : public BitField8<bool, 0, 1> {}; 1933 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1934 class HasSpreadArgumentsField : public BitField8<bool, 1, 1> {};
1920 uint8_t bit_field_; 1935 uint8_t bit_field_;
1921 }; 1936 };
1922 1937
1923 1938
1924 class CallNew FINAL : public Expression { 1939 class CallNew FINAL : public Expression {
1925 public: 1940 public:
1926 DECLARE_NODE_TYPE(CallNew) 1941 DECLARE_NODE_TYPE(CallNew)
1927 1942
1928 Expression* expression() const { return expression_; } 1943 Expression* expression() const { return expression_; }
1929 ZoneList<Expression*>* arguments() const { return arguments_; } 1944 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; } 2251 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2237 2252
2238 Token::Value op_; 2253 Token::Value op_;
2239 Expression* left_; 2254 Expression* left_;
2240 Expression* right_; 2255 Expression* right_;
2241 2256
2242 Type* combined_type_; 2257 Type* combined_type_;
2243 }; 2258 };
2244 2259
2245 2260
2261 class SpreadOperation FINAL : public Expression {
2262 public:
2263 DECLARE_NODE_TYPE(SpreadOperation)
2264
2265 Expression* expression() const { return expression_; }
2266 Expression* assign_iterator() const { return assign_iterator_; }
2267 Expression* next_result() const { return next_result_; }
2268 Expression* result_done() const { return result_done_; }
2269 Expression* result_value() const { return result_value_; }
2270
2271 static int num_ids() { return parent_num_ids(); }
2272
2273 protected:
2274 SpreadOperation(Zone* zone, AstNodeFactory* factory,
2275 AstValueFactory* value_factory, Scope* scope,
2276 Expression* expression, int pos);
2277 static int parent_num_ids() { return Expression::num_ids(); }
2278
2279 private:
2280 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2281
2282 Expression* expression_;
2283 Expression* assign_iterator_;
2284 Expression* next_result_;
2285 Expression* result_done_;
2286 Expression* result_value_;
2287 };
2288
2289
2246 class Conditional FINAL : public Expression { 2290 class Conditional FINAL : public Expression {
2247 public: 2291 public:
2248 DECLARE_NODE_TYPE(Conditional) 2292 DECLARE_NODE_TYPE(Conditional)
2249 2293
2250 Expression* condition() const { return condition_; } 2294 Expression* condition() const { return condition_; }
2251 Expression* then_expression() const { return then_expression_; } 2295 Expression* then_expression() const { return then_expression_; }
2252 Expression* else_expression() const { return else_expression_; } 2296 Expression* else_expression() const { return else_expression_; }
2253 2297
2254 static int num_ids() { return parent_num_ids() + 2; } 2298 static int num_ids() { return parent_num_ids() + 2; }
2255 BailoutId ThenId() const { return BailoutId(local_id(0)); } 2299 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); 3500 return new (zone_) CountOperation(zone_, op, is_prefix, expr, pos);
3457 } 3501 }
3458 3502
3459 CompareOperation* NewCompareOperation(Token::Value op, 3503 CompareOperation* NewCompareOperation(Token::Value op,
3460 Expression* left, 3504 Expression* left,
3461 Expression* right, 3505 Expression* right,
3462 int pos) { 3506 int pos) {
3463 return new (zone_) CompareOperation(zone_, op, left, right, pos); 3507 return new (zone_) CompareOperation(zone_, op, left, right, pos);
3464 } 3508 }
3465 3509
3510 SpreadOperation* NewSpreadOperation(Scope* scope, Expression* expression,
3511 int pos) {
3512 return new (zone_) SpreadOperation(zone_, this, ast_value_factory_, scope,
3513 expression, pos);
3514 }
3515
3466 Conditional* NewConditional(Expression* condition, 3516 Conditional* NewConditional(Expression* condition,
3467 Expression* then_expression, 3517 Expression* then_expression,
3468 Expression* else_expression, 3518 Expression* else_expression,
3469 int position) { 3519 int position) {
3470 return new (zone_) Conditional(zone_, condition, then_expression, 3520 return new (zone_) Conditional(zone_, condition, then_expression,
3471 else_expression, position); 3521 else_expression, position);
3472 } 3522 }
3473 3523
3474 Assignment* NewAssignment(Token::Value op, 3524 Assignment* NewAssignment(Token::Value op,
3475 Expression* target, 3525 Expression* target,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3531 } 3581 }
3532 3582
3533 ThisFunction* NewThisFunction(int pos) { 3583 ThisFunction* NewThisFunction(int pos) {
3534 return new (zone_) ThisFunction(zone_, pos); 3584 return new (zone_) ThisFunction(zone_, pos);
3535 } 3585 }
3536 3586
3537 SuperReference* NewSuperReference(VariableProxy* this_var, int pos) { 3587 SuperReference* NewSuperReference(VariableProxy* this_var, int pos) {
3538 return new (zone_) SuperReference(zone_, this_var, pos); 3588 return new (zone_) SuperReference(zone_, this_var, pos);
3539 } 3589 }
3540 3590
3591 // Utilities
3592 Expression* GetIterator(Expression* iterable) {
3593 Expression* iterator_symbol_literal =
3594 NewSymbolLiteral("iterator_symbol", RelocInfo::kNoPosition);
3595 int pos = iterable->position();
3596 Expression* prop = NewProperty(iterable, iterator_symbol_literal, pos);
3597 ZoneList<Expression*>* args = new (zone_) ZoneList<Expression*>(0, zone_);
3598 return NewCall(prop, args, pos);
3599 }
3600
3541 private: 3601 private:
3542 Zone* zone_; 3602 Zone* zone_;
3543 AstValueFactory* ast_value_factory_; 3603 AstValueFactory* ast_value_factory_;
3544 }; 3604 };
3545 3605
3546 3606
3547 } } // namespace v8::internal 3607 } } // namespace v8::internal
3548 3608
3549 #endif // V8_AST_H_ 3609 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/compiler/ast-graph-builder.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698