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

Side by Side Diff: src/ast/ast.h

Issue 2126233002: Devirtualize AstNode and subclasses, except for visiting-related methods. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: remove static assert again Created 4 years, 5 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/ast.cc » ('j') | no next file with comments »
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_AST_H_ 5 #ifndef V8_AST_AST_H_
6 #define V8_AST_AST_H_ 6 #define V8_AST_AST_H_
7 7
8 #include "src/ast/ast-value-factory.h" 8 #include "src/ast/ast-value-factory.h"
9 #include "src/ast/modules.h" 9 #include "src/ast/modules.h"
10 #include "src/ast/variables.h" 10 #include "src/ast/variables.h"
(...skipping 24 matching lines...) Expand all
35 35
36 // ---------------------------------------------------------------------------- 36 // ----------------------------------------------------------------------------
37 // Nodes of the abstract syntax tree. Only concrete classes are 37 // Nodes of the abstract syntax tree. Only concrete classes are
38 // enumerated here. 38 // enumerated here.
39 39
40 #define DECLARATION_NODE_LIST(V) \ 40 #define DECLARATION_NODE_LIST(V) \
41 V(VariableDeclaration) \ 41 V(VariableDeclaration) \
42 V(FunctionDeclaration) \ 42 V(FunctionDeclaration) \
43 V(ImportDeclaration) 43 V(ImportDeclaration)
44 44
45 #define ITERATION_NODE_LIST(V) \
46 V(DoWhileStatement) \
47 V(WhileStatement) \
48 V(ForStatement) \
49 V(ForInStatement) \
50 V(ForOfStatement)
51
52 #define BREAKABLE_NODE_LIST(V) \
53 V(Block) \
54 V(SwitchStatement)
55
45 #define STATEMENT_NODE_LIST(V) \ 56 #define STATEMENT_NODE_LIST(V) \
46 V(Block) \ 57 ITERATION_NODE_LIST(V) \
58 BREAKABLE_NODE_LIST(V) \
47 V(ExpressionStatement) \ 59 V(ExpressionStatement) \
48 V(EmptyStatement) \ 60 V(EmptyStatement) \
49 V(SloppyBlockFunctionStatement) \ 61 V(SloppyBlockFunctionStatement) \
50 V(IfStatement) \ 62 V(IfStatement) \
51 V(ContinueStatement) \ 63 V(ContinueStatement) \
52 V(BreakStatement) \ 64 V(BreakStatement) \
53 V(ReturnStatement) \ 65 V(ReturnStatement) \
54 V(WithStatement) \ 66 V(WithStatement) \
55 V(SwitchStatement) \
56 V(DoWhileStatement) \
57 V(WhileStatement) \
58 V(ForStatement) \
59 V(ForInStatement) \
60 V(ForOfStatement) \
61 V(TryCatchStatement) \ 67 V(TryCatchStatement) \
62 V(TryFinallyStatement) \ 68 V(TryFinallyStatement) \
63 V(DebuggerStatement) 69 V(DebuggerStatement)
64 70
71 #define LITERAL_NODE_LIST(V) \
72 V(RegExpLiteral) \
73 V(ObjectLiteral) \
74 V(ArrayLiteral)
75
76 #define PROPERTY_NODE_LIST(V) \
77 V(Assignment) \
78 V(CountOperation) \
79 V(Property)
80
81 #define CALL_NODE_LIST(V) \
82 V(Call) \
83 V(CallNew)
84
65 #define EXPRESSION_NODE_LIST(V) \ 85 #define EXPRESSION_NODE_LIST(V) \
86 LITERAL_NODE_LIST(V) \
87 PROPERTY_NODE_LIST(V) \
88 CALL_NODE_LIST(V) \
66 V(FunctionLiteral) \ 89 V(FunctionLiteral) \
67 V(ClassLiteral) \ 90 V(ClassLiteral) \
68 V(NativeFunctionLiteral) \ 91 V(NativeFunctionLiteral) \
69 V(Conditional) \ 92 V(Conditional) \
70 V(VariableProxy) \ 93 V(VariableProxy) \
71 V(Literal) \ 94 V(Literal) \
72 V(RegExpLiteral) \
73 V(ObjectLiteral) \
74 V(ArrayLiteral) \
75 V(Assignment) \
76 V(Yield) \ 95 V(Yield) \
77 V(Throw) \ 96 V(Throw) \
78 V(Property) \
79 V(Call) \
80 V(CallNew) \
81 V(CallRuntime) \ 97 V(CallRuntime) \
82 V(UnaryOperation) \ 98 V(UnaryOperation) \
83 V(CountOperation) \
84 V(BinaryOperation) \ 99 V(BinaryOperation) \
85 V(CompareOperation) \ 100 V(CompareOperation) \
86 V(Spread) \ 101 V(Spread) \
87 V(ThisFunction) \ 102 V(ThisFunction) \
88 V(SuperPropertyReference) \ 103 V(SuperPropertyReference) \
89 V(SuperCallReference) \ 104 V(SuperCallReference) \
90 V(CaseClause) \ 105 V(CaseClause) \
91 V(EmptyParentheses) \ 106 V(EmptyParentheses) \
92 V(DoExpression) \ 107 V(DoExpression) \
93 V(RewritableExpression) 108 V(RewritableExpression)
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 #endif // DEBUG 216 #endif // DEBUG
202 217
203 // Type testing & conversion functions overridden by concrete subclasses. 218 // Type testing & conversion functions overridden by concrete subclasses.
204 #define DECLARE_NODE_FUNCTIONS(type) \ 219 #define DECLARE_NODE_FUNCTIONS(type) \
205 V8_INLINE bool Is##type() const; \ 220 V8_INLINE bool Is##type() const; \
206 V8_INLINE type* As##type(); \ 221 V8_INLINE type* As##type(); \
207 V8_INLINE const type* As##type() const; 222 V8_INLINE const type* As##type() const;
208 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 223 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
209 #undef DECLARE_NODE_FUNCTIONS 224 #undef DECLARE_NODE_FUNCTIONS
210 225
211 virtual BreakableStatement* AsBreakableStatement() { return NULL; } 226 BreakableStatement* AsBreakableStatement();
212 virtual IterationStatement* AsIterationStatement() { return NULL; } 227 IterationStatement* AsIterationStatement();
213 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 228 MaterializedLiteral* AsMaterializedLiteral();
214 229
215 private: 230 private:
216 // Hidden to prevent accidental usage. It would have to load the 231 // Hidden to prevent accidental usage. It would have to load the
217 // current zone from the TLS. 232 // current zone from the TLS.
218 void* operator new(size_t size); 233 void* operator new(size_t size);
219 234
220 friend class CaseClause; // Generates AST IDs. 235 friend class CaseClause; // Generates AST IDs.
221 236
222 int position_; 237 int position_;
223 }; 238 };
224 239
225 240
226 class Statement : public AstNode { 241 class Statement : public AstNode {
227 public: 242 public:
228 explicit Statement(Zone* zone, int position) : AstNode(position) {} 243 explicit Statement(Zone* zone, int position) : AstNode(position) {}
229 244
230 bool IsEmpty() { return AsEmptyStatement() != NULL; } 245 bool IsEmpty() { return AsEmptyStatement() != NULL; }
231 virtual bool IsJump() const { return false; } 246 bool IsJump() const;
232 }; 247 };
233 248
234 249
235 class SmallMapList final { 250 class SmallMapList final {
236 public: 251 public:
237 SmallMapList() {} 252 SmallMapList() {}
238 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} 253 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {}
239 254
240 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } 255 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); }
241 void Clear() { list_.Clear(); } 256 void Clear() { list_.Clear(); }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 kUninitialized, 302 kUninitialized,
288 // Evaluated for its side effects. 303 // Evaluated for its side effects.
289 kEffect, 304 kEffect,
290 // Evaluated for its value (and side effects). 305 // Evaluated for its value (and side effects).
291 kValue, 306 kValue,
292 // Evaluated for control flow (and side effects). 307 // Evaluated for control flow (and side effects).
293 kTest 308 kTest
294 }; 309 };
295 310
296 // Mark this expression as being in tail position. 311 // Mark this expression as being in tail position.
297 virtual void MarkTail() {} 312 void MarkTail();
298 313
299 // True iff the expression is a valid reference expression. 314 // True iff the expression is a valid reference expression.
300 virtual bool IsValidReferenceExpression() const { return false; } 315 bool IsValidReferenceExpression() const;
301 316
302 // Helpers for ToBoolean conversion. 317 // Helpers for ToBoolean conversion.
303 virtual bool ToBooleanIsTrue() const { return false; } 318 bool ToBooleanIsTrue() const;
304 virtual bool ToBooleanIsFalse() const { return false; } 319 bool ToBooleanIsFalse() const;
305 320
306 // Symbols that cannot be parsed as array indices are considered property 321 // Symbols that cannot be parsed as array indices are considered property
307 // names. We do not treat symbols that can be array indexes as property 322 // names. We do not treat symbols that can be array indexes as property
308 // names because [] for string objects is handled only by keyed ICs. 323 // names because [] for string objects is handled only by keyed ICs.
309 virtual bool IsPropertyName() const { return false; } 324 bool IsPropertyName() const;
310 325
311 // True iff the expression is a class or function expression without 326 // True iff the expression is a class or function expression without
312 // a syntactic name. 327 // a syntactic name.
313 virtual bool IsAnonymousFunctionDefinition() const { return false; } 328 bool IsAnonymousFunctionDefinition() const;
314 329
315 // True iff the expression is a literal represented as a smi. 330 // True iff the expression is a literal represented as a smi.
316 bool IsSmiLiteral() const; 331 bool IsSmiLiteral() const;
317 332
318 // True iff the expression is a string literal. 333 // True iff the expression is a string literal.
319 bool IsStringLiteral() const; 334 bool IsStringLiteral() const;
320 335
321 // True iff the expression is the null literal. 336 // True iff the expression is the null literal.
322 bool IsNullLiteral() const; 337 bool IsNullLiteral() const;
323 338
324 // True if we can prove that the expression is the undefined literal. Note 339 // True if we can prove that the expression is the undefined literal. Note
325 // that this also checks for loads of the global "undefined" variable. 340 // that this also checks for loads of the global "undefined" variable.
326 bool IsUndefinedLiteral() const; 341 bool IsUndefinedLiteral() const;
327 342
328 // True iff the expression is a valid target for an assignment. 343 // True iff the expression is a valid target for an assignment.
329 bool IsValidReferenceExpressionOrThis() const; 344 bool IsValidReferenceExpressionOrThis() const;
330 345
331 // Type feedback information for assignments and properties.
332 virtual bool IsMonomorphic() {
333 UNREACHABLE();
334 return false;
335 }
336 virtual SmallMapList* GetReceiverTypes() {
337 UNREACHABLE();
338 return NULL;
339 }
340 virtual KeyedAccessStoreMode GetStoreMode() const {
341 UNREACHABLE();
342 return STANDARD_STORE;
343 }
344 virtual IcCheckType GetKeyType() const {
345 UNREACHABLE();
346 return ELEMENT;
347 }
348
349 // TODO(rossberg): this should move to its own AST node eventually. 346 // TODO(rossberg): this should move to its own AST node eventually.
350 virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); 347 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle);
351 uint16_t to_boolean_types() const { 348 uint16_t to_boolean_types() const {
352 return ToBooleanTypesField::decode(bit_field_); 349 return ToBooleanTypesField::decode(bit_field_);
353 } 350 }
354 351
352 SmallMapList* GetReceiverTypes();
353 KeyedAccessStoreMode GetStoreMode() const;
354 IcCheckType GetKeyType() const;
355 bool IsMonomorphic() const;
356
355 void set_base_id(int id) { base_id_ = id; } 357 void set_base_id(int id) { base_id_ = id; }
356 static int num_ids() { return parent_num_ids() + 2; } 358 static int num_ids() { return parent_num_ids() + 2; }
357 BailoutId id() const { return BailoutId(local_id(0)); } 359 BailoutId id() const { return BailoutId(local_id(0)); }
358 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } 360 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); }
359 361
360 protected: 362 protected:
361 Expression(Zone* zone, int pos) 363 Expression(Zone* zone, int pos)
362 : AstNode(pos), 364 : AstNode(pos),
363 base_id_(BailoutId::None().ToInt()), 365 base_id_(BailoutId::None().ToInt()),
364 bit_field_(0) {} 366 bit_field_(0) {}
(...skipping 22 matching lines...) Expand all
387 public: 389 public:
388 enum BreakableType { 390 enum BreakableType {
389 TARGET_FOR_ANONYMOUS, 391 TARGET_FOR_ANONYMOUS,
390 TARGET_FOR_NAMED_ONLY 392 TARGET_FOR_NAMED_ONLY
391 }; 393 };
392 394
393 // The labels associated with this statement. May be NULL; 395 // The labels associated with this statement. May be NULL;
394 // if it is != NULL, guaranteed to contain at least one entry. 396 // if it is != NULL, guaranteed to contain at least one entry.
395 ZoneList<const AstRawString*>* labels() const { return labels_; } 397 ZoneList<const AstRawString*>* labels() const { return labels_; }
396 398
397 // Type testing & conversion.
398 BreakableStatement* AsBreakableStatement() final { return this; }
399
400 // Code generation 399 // Code generation
401 Label* break_target() { return &break_target_; } 400 Label* break_target() { return &break_target_; }
402 401
403 // Testers. 402 // Testers.
404 bool is_target_for_anonymous() const { 403 bool is_target_for_anonymous() const {
405 return breakable_type_ == TARGET_FOR_ANONYMOUS; 404 return breakable_type_ == TARGET_FOR_ANONYMOUS;
406 } 405 }
407 406
408 void set_base_id(int id) { base_id_ = id; } 407 void set_base_id(int id) { base_id_ = id; }
409 static int num_ids() { return parent_num_ids() + 2; } 408 static int num_ids() { return parent_num_ids() + 2; }
(...skipping 29 matching lines...) Expand all
439 class Block final : public BreakableStatement { 438 class Block final : public BreakableStatement {
440 public: 439 public:
441 DECLARE_NODE_TYPE(Block) 440 DECLARE_NODE_TYPE(Block)
442 441
443 ZoneList<Statement*>* statements() { return &statements_; } 442 ZoneList<Statement*>* statements() { return &statements_; }
444 bool ignore_completion_value() const { return ignore_completion_value_; } 443 bool ignore_completion_value() const { return ignore_completion_value_; }
445 444
446 static int num_ids() { return parent_num_ids() + 1; } 445 static int num_ids() { return parent_num_ids() + 1; }
447 BailoutId DeclsId() const { return BailoutId(local_id(0)); } 446 BailoutId DeclsId() const { return BailoutId(local_id(0)); }
448 447
449 bool IsJump() const override { 448 bool IsJump() const {
450 return !statements_.is_empty() && statements_.last()->IsJump() 449 return !statements_.is_empty() && statements_.last()->IsJump()
451 && labels() == NULL; // Good enough as an approximation... 450 && labels() == NULL; // Good enough as an approximation...
452 } 451 }
453 452
454 Scope* scope() const { return scope_; } 453 Scope* scope() const { return scope_; }
455 void set_scope(Scope* scope) { scope_ = scope; } 454 void set_scope(Scope* scope) { scope_ = scope; }
456 455
457 protected: 456 protected:
458 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, 457 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity,
459 bool ignore_completion_value, int pos) 458 bool ignore_completion_value, int pos)
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 Block* block_; 494 Block* block_;
496 VariableProxy* result_; 495 VariableProxy* result_;
497 }; 496 };
498 497
499 498
500 class Declaration : public AstNode { 499 class Declaration : public AstNode {
501 public: 500 public:
502 VariableProxy* proxy() const { return proxy_; } 501 VariableProxy* proxy() const { return proxy_; }
503 VariableMode mode() const { return mode_; } 502 VariableMode mode() const { return mode_; }
504 Scope* scope() const { return scope_; } 503 Scope* scope() const { return scope_; }
505 virtual InitializationFlag initialization() const = 0; 504 InitializationFlag initialization() const;
506 505
507 protected: 506 protected:
508 Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope, 507 Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope,
509 int pos) 508 int pos)
510 : AstNode(pos), mode_(mode), proxy_(proxy), scope_(scope) { 509 : AstNode(pos), mode_(mode), proxy_(proxy), scope_(scope) {
511 DCHECK(IsDeclaredVariableMode(mode)); 510 DCHECK(IsDeclaredVariableMode(mode));
512 } 511 }
513 512
514 private: 513 private:
515 VariableMode mode_; 514 VariableMode mode_;
516 VariableProxy* proxy_; 515 VariableProxy* proxy_;
517 516
518 // Nested scope from which the declaration originated. 517 // Nested scope from which the declaration originated.
519 Scope* scope_; 518 Scope* scope_;
520 }; 519 };
521 520
522 521
523 class VariableDeclaration final : public Declaration { 522 class VariableDeclaration final : public Declaration {
524 public: 523 public:
525 DECLARE_NODE_TYPE(VariableDeclaration) 524 DECLARE_NODE_TYPE(VariableDeclaration)
526 525
527 InitializationFlag initialization() const override { 526 InitializationFlag initialization() const {
528 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; 527 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization;
529 } 528 }
530 529
531 protected: 530 protected:
532 VariableDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, 531 VariableDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode,
533 Scope* scope, int pos) 532 Scope* scope, int pos)
534 : Declaration(zone, proxy, mode, scope, pos) {} 533 : Declaration(zone, proxy, mode, scope, pos) {}
535 }; 534 };
536 535
537 536
538 class FunctionDeclaration final : public Declaration { 537 class FunctionDeclaration final : public Declaration {
539 public: 538 public:
540 DECLARE_NODE_TYPE(FunctionDeclaration) 539 DECLARE_NODE_TYPE(FunctionDeclaration)
541 540
542 FunctionLiteral* fun() const { return fun_; } 541 FunctionLiteral* fun() const { return fun_; }
543 void set_fun(FunctionLiteral* f) { fun_ = f; } 542 void set_fun(FunctionLiteral* f) { fun_ = f; }
544 InitializationFlag initialization() const override { 543 InitializationFlag initialization() const { return kCreatedInitialized; }
545 return kCreatedInitialized;
546 }
547 544
548 protected: 545 protected:
549 FunctionDeclaration(Zone* zone, 546 FunctionDeclaration(Zone* zone,
550 VariableProxy* proxy, 547 VariableProxy* proxy,
551 VariableMode mode, 548 VariableMode mode,
552 FunctionLiteral* fun, 549 FunctionLiteral* fun,
553 Scope* scope, 550 Scope* scope,
554 int pos) 551 int pos)
555 : Declaration(zone, proxy, mode, scope, pos), 552 : Declaration(zone, proxy, mode, scope, pos),
556 fun_(fun) { 553 fun_(fun) {
557 DCHECK(mode == VAR || mode == LET || mode == CONST); 554 DCHECK(mode == VAR || mode == LET || mode == CONST);
558 DCHECK(fun != NULL); 555 DCHECK(fun != NULL);
559 } 556 }
560 557
561 private: 558 private:
562 FunctionLiteral* fun_; 559 FunctionLiteral* fun_;
563 }; 560 };
564 561
565 562
566 class ImportDeclaration final : public Declaration { 563 class ImportDeclaration final : public Declaration {
567 public: 564 public:
568 DECLARE_NODE_TYPE(ImportDeclaration) 565 DECLARE_NODE_TYPE(ImportDeclaration)
569 566
570 const AstRawString* import_name() const { return import_name_; } 567 const AstRawString* import_name() const { return import_name_; }
571 const AstRawString* module_specifier() const { return module_specifier_; } 568 const AstRawString* module_specifier() const { return module_specifier_; }
572 void set_module_specifier(const AstRawString* module_specifier) { 569 void set_module_specifier(const AstRawString* module_specifier) {
573 DCHECK(module_specifier_ == NULL); 570 DCHECK(module_specifier_ == NULL);
574 module_specifier_ = module_specifier; 571 module_specifier_ = module_specifier;
575 } 572 }
576 InitializationFlag initialization() const override { 573 InitializationFlag initialization() const { return kNeedsInitialization; }
577 return kNeedsInitialization;
578 }
579 574
580 protected: 575 protected:
581 ImportDeclaration(Zone* zone, VariableProxy* proxy, 576 ImportDeclaration(Zone* zone, VariableProxy* proxy,
582 const AstRawString* import_name, 577 const AstRawString* import_name,
583 const AstRawString* module_specifier, Scope* scope, int pos) 578 const AstRawString* module_specifier, Scope* scope, int pos)
584 : Declaration(zone, proxy, CONST, scope, pos), 579 : Declaration(zone, proxy, CONST, scope, pos),
585 import_name_(import_name), 580 import_name_(import_name),
586 module_specifier_(module_specifier) {} 581 module_specifier_(module_specifier) {}
587 582
588 private: 583 private:
(...skipping 14 matching lines...) Expand all
603 : AstNode(pos), descriptor_(descriptor), body_(body) {} 598 : AstNode(pos), descriptor_(descriptor), body_(body) {}
604 599
605 private: 600 private:
606 ModuleDescriptor* descriptor_; 601 ModuleDescriptor* descriptor_;
607 Block* body_; 602 Block* body_;
608 }; 603 };
609 604
610 605
611 class IterationStatement : public BreakableStatement { 606 class IterationStatement : public BreakableStatement {
612 public: 607 public:
613 // Type testing & conversion.
614 IterationStatement* AsIterationStatement() final { return this; }
615
616 Statement* body() const { return body_; } 608 Statement* body() const { return body_; }
617 void set_body(Statement* s) { body_ = s; } 609 void set_body(Statement* s) { body_ = s; }
618 610
619 int yield_count() const { return yield_count_; } 611 int yield_count() const { return yield_count_; }
620 int first_yield_id() const { return first_yield_id_; } 612 int first_yield_id() const { return first_yield_id_; }
621 void set_yield_count(int yield_count) { yield_count_ = yield_count; } 613 void set_yield_count(int yield_count) { yield_count_ = yield_count; }
622 void set_first_yield_id(int first_yield_id) { 614 void set_first_yield_id(int first_yield_id) {
623 first_yield_id_ = first_yield_id; 615 first_yield_id_ = first_yield_id;
624 } 616 }
625 617
626 static int num_ids() { return parent_num_ids() + 1; } 618 static int num_ids() { return parent_num_ids() + 1; }
627 BailoutId OsrEntryId() const { return BailoutId(local_id(0)); } 619 BailoutId OsrEntryId() const { return BailoutId(local_id(0)); }
628 virtual BailoutId ContinueId() const = 0;
629 virtual BailoutId StackCheckId() const = 0;
630 620
631 // Code generation 621 // Code generation
632 Label* continue_target() { return &continue_target_; } 622 Label* continue_target() { return &continue_target_; }
633 623
634 protected: 624 protected:
635 IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 625 IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
636 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), 626 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos),
637 body_(NULL), 627 body_(NULL),
638 yield_count_(0), 628 yield_count_(0),
639 first_yield_id_(0) {} 629 first_yield_id_(0) {}
(...skipping 16 matching lines...) Expand all
656 646
657 void Initialize(Expression* cond, Statement* body) { 647 void Initialize(Expression* cond, Statement* body) {
658 IterationStatement::Initialize(body); 648 IterationStatement::Initialize(body);
659 cond_ = cond; 649 cond_ = cond;
660 } 650 }
661 651
662 Expression* cond() const { return cond_; } 652 Expression* cond() const { return cond_; }
663 void set_cond(Expression* e) { cond_ = e; } 653 void set_cond(Expression* e) { cond_ = e; }
664 654
665 static int num_ids() { return parent_num_ids() + 2; } 655 static int num_ids() { return parent_num_ids() + 2; }
666 BailoutId ContinueId() const override { return BailoutId(local_id(0)); } 656 BailoutId ContinueId() const { return BailoutId(local_id(0)); }
667 BailoutId StackCheckId() const override { return BackEdgeId(); } 657 BailoutId StackCheckId() const { return BackEdgeId(); }
668 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } 658 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); }
669 659
670 protected: 660 protected:
671 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 661 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
672 : IterationStatement(zone, labels, pos), cond_(NULL) {} 662 : IterationStatement(zone, labels, pos), cond_(NULL) {}
673 static int parent_num_ids() { return IterationStatement::num_ids(); } 663 static int parent_num_ids() { return IterationStatement::num_ids(); }
674 664
675 private: 665 private:
676 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 666 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
677 667
678 Expression* cond_; 668 Expression* cond_;
679 }; 669 };
680 670
681 671
682 class WhileStatement final : public IterationStatement { 672 class WhileStatement final : public IterationStatement {
683 public: 673 public:
684 DECLARE_NODE_TYPE(WhileStatement) 674 DECLARE_NODE_TYPE(WhileStatement)
685 675
686 void Initialize(Expression* cond, Statement* body) { 676 void Initialize(Expression* cond, Statement* body) {
687 IterationStatement::Initialize(body); 677 IterationStatement::Initialize(body);
688 cond_ = cond; 678 cond_ = cond;
689 } 679 }
690 680
691 Expression* cond() const { return cond_; } 681 Expression* cond() const { return cond_; }
692 void set_cond(Expression* e) { cond_ = e; } 682 void set_cond(Expression* e) { cond_ = e; }
693 683
694 static int num_ids() { return parent_num_ids() + 1; } 684 static int num_ids() { return parent_num_ids() + 1; }
695 BailoutId ContinueId() const override { return EntryId(); } 685 BailoutId ContinueId() const { return EntryId(); }
696 BailoutId StackCheckId() const override { return BodyId(); } 686 BailoutId StackCheckId() const { return BodyId(); }
697 BailoutId BodyId() const { return BailoutId(local_id(0)); } 687 BailoutId BodyId() const { return BailoutId(local_id(0)); }
698 688
699 protected: 689 protected:
700 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 690 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
701 : IterationStatement(zone, labels, pos), cond_(NULL) {} 691 : IterationStatement(zone, labels, pos), cond_(NULL) {}
702 static int parent_num_ids() { return IterationStatement::num_ids(); } 692 static int parent_num_ids() { return IterationStatement::num_ids(); }
703 693
704 private: 694 private:
705 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 695 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
706 696
(...skipping 17 matching lines...) Expand all
724 714
725 Statement* init() const { return init_; } 715 Statement* init() const { return init_; }
726 Expression* cond() const { return cond_; } 716 Expression* cond() const { return cond_; }
727 Statement* next() const { return next_; } 717 Statement* next() const { return next_; }
728 718
729 void set_init(Statement* s) { init_ = s; } 719 void set_init(Statement* s) { init_ = s; }
730 void set_cond(Expression* e) { cond_ = e; } 720 void set_cond(Expression* e) { cond_ = e; }
731 void set_next(Statement* s) { next_ = s; } 721 void set_next(Statement* s) { next_ = s; }
732 722
733 static int num_ids() { return parent_num_ids() + 2; } 723 static int num_ids() { return parent_num_ids() + 2; }
734 BailoutId ContinueId() const override { return BailoutId(local_id(0)); } 724 BailoutId ContinueId() const { return BailoutId(local_id(0)); }
735 BailoutId StackCheckId() const override { return BodyId(); } 725 BailoutId StackCheckId() const { return BodyId(); }
736 BailoutId BodyId() const { return BailoutId(local_id(1)); } 726 BailoutId BodyId() const { return BailoutId(local_id(1)); }
737 727
738 protected: 728 protected:
739 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 729 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
740 : IterationStatement(zone, labels, pos), 730 : IterationStatement(zone, labels, pos),
741 init_(NULL), 731 init_(NULL),
742 cond_(NULL), 732 cond_(NULL),
743 next_(NULL) {} 733 next_(NULL) {}
744 static int parent_num_ids() { return IterationStatement::num_ids(); } 734 static int parent_num_ids() { return IterationStatement::num_ids(); }
745 735
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 ForInType for_in_type() const { return for_in_type_; } 794 ForInType for_in_type() const { return for_in_type_; }
805 void set_for_in_type(ForInType type) { for_in_type_ = type; } 795 void set_for_in_type(ForInType type) { for_in_type_ = type; }
806 796
807 static int num_ids() { return parent_num_ids() + 6; } 797 static int num_ids() { return parent_num_ids() + 6; }
808 BailoutId BodyId() const { return BailoutId(local_id(0)); } 798 BailoutId BodyId() const { return BailoutId(local_id(0)); }
809 BailoutId EnumId() const { return BailoutId(local_id(1)); } 799 BailoutId EnumId() const { return BailoutId(local_id(1)); }
810 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } 800 BailoutId ToObjectId() const { return BailoutId(local_id(2)); }
811 BailoutId PrepareId() const { return BailoutId(local_id(3)); } 801 BailoutId PrepareId() const { return BailoutId(local_id(3)); }
812 BailoutId FilterId() const { return BailoutId(local_id(4)); } 802 BailoutId FilterId() const { return BailoutId(local_id(4)); }
813 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } 803 BailoutId AssignmentId() const { return BailoutId(local_id(5)); }
814 BailoutId ContinueId() const override { return EntryId(); } 804 BailoutId ContinueId() const { return EntryId(); }
815 BailoutId StackCheckId() const override { return BodyId(); } 805 BailoutId StackCheckId() const { return BodyId(); }
816 806
817 protected: 807 protected:
818 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 808 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
819 : ForEachStatement(zone, labels, pos), 809 : ForEachStatement(zone, labels, pos),
820 each_(nullptr), 810 each_(nullptr),
821 subject_(nullptr), 811 subject_(nullptr),
822 for_in_type_(SLOW_FOR_IN) {} 812 for_in_type_(SLOW_FOR_IN) {}
823 static int parent_num_ids() { return ForEachStatement::num_ids(); } 813 static int parent_num_ids() { return ForEachStatement::num_ids(); }
824 814
825 private: 815 private:
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 // each = result.value 860 // each = result.value
871 Expression* assign_each() const { 861 Expression* assign_each() const {
872 return assign_each_; 862 return assign_each_;
873 } 863 }
874 864
875 void set_assign_iterator(Expression* e) { assign_iterator_ = e; } 865 void set_assign_iterator(Expression* e) { assign_iterator_ = e; }
876 void set_next_result(Expression* e) { next_result_ = e; } 866 void set_next_result(Expression* e) { next_result_ = e; }
877 void set_result_done(Expression* e) { result_done_ = e; } 867 void set_result_done(Expression* e) { result_done_ = e; }
878 void set_assign_each(Expression* e) { assign_each_ = e; } 868 void set_assign_each(Expression* e) { assign_each_ = e; }
879 869
880 BailoutId ContinueId() const override { return EntryId(); } 870 BailoutId ContinueId() const { return EntryId(); }
881 BailoutId StackCheckId() const override { return BackEdgeId(); } 871 BailoutId StackCheckId() const { return BackEdgeId(); }
882 872
883 static int num_ids() { return parent_num_ids() + 1; } 873 static int num_ids() { return parent_num_ids() + 1; }
884 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } 874 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); }
885 875
886 protected: 876 protected:
887 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 877 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
888 : ForEachStatement(zone, labels, pos), 878 : ForEachStatement(zone, labels, pos),
889 iterator_(NULL), 879 iterator_(NULL),
890 assign_iterator_(NULL), 880 assign_iterator_(NULL),
891 next_result_(NULL), 881 next_result_(NULL),
(...skipping 11 matching lines...) Expand all
903 Expression* assign_each_; 893 Expression* assign_each_;
904 }; 894 };
905 895
906 896
907 class ExpressionStatement final : public Statement { 897 class ExpressionStatement final : public Statement {
908 public: 898 public:
909 DECLARE_NODE_TYPE(ExpressionStatement) 899 DECLARE_NODE_TYPE(ExpressionStatement)
910 900
911 void set_expression(Expression* e) { expression_ = e; } 901 void set_expression(Expression* e) { expression_ = e; }
912 Expression* expression() const { return expression_; } 902 Expression* expression() const { return expression_; }
913 bool IsJump() const override { return expression_->IsThrow(); } 903 bool IsJump() const { return expression_->IsThrow(); }
914 904
915 protected: 905 protected:
916 ExpressionStatement(Zone* zone, Expression* expression, int pos) 906 ExpressionStatement(Zone* zone, Expression* expression, int pos)
917 : Statement(zone, pos), expression_(expression) { } 907 : Statement(zone, pos), expression_(expression) { }
918 908
919 private: 909 private:
920 Expression* expression_; 910 Expression* expression_;
921 }; 911 };
922 912
923 913
924 class JumpStatement : public Statement { 914 class JumpStatement : public Statement {
925 public: 915 public:
926 bool IsJump() const final { return true; } 916 bool IsJump() const { return true; }
927 917
928 protected: 918 protected:
929 explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {} 919 explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {}
930 }; 920 };
931 921
932 922
933 class ContinueStatement final : public JumpStatement { 923 class ContinueStatement final : public JumpStatement {
934 public: 924 public:
935 DECLARE_NODE_TYPE(ContinueStatement) 925 DECLARE_NODE_TYPE(ContinueStatement)
936 926
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 1081 bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
1092 1082
1093 Expression* condition() const { return condition_; } 1083 Expression* condition() const { return condition_; }
1094 Statement* then_statement() const { return then_statement_; } 1084 Statement* then_statement() const { return then_statement_; }
1095 Statement* else_statement() const { return else_statement_; } 1085 Statement* else_statement() const { return else_statement_; }
1096 1086
1097 void set_condition(Expression* e) { condition_ = e; } 1087 void set_condition(Expression* e) { condition_ = e; }
1098 void set_then_statement(Statement* s) { then_statement_ = s; } 1088 void set_then_statement(Statement* s) { then_statement_ = s; }
1099 void set_else_statement(Statement* s) { else_statement_ = s; } 1089 void set_else_statement(Statement* s) { else_statement_ = s; }
1100 1090
1101 bool IsJump() const override { 1091 bool IsJump() const {
1102 return HasThenStatement() && then_statement()->IsJump() 1092 return HasThenStatement() && then_statement()->IsJump()
1103 && HasElseStatement() && else_statement()->IsJump(); 1093 && HasElseStatement() && else_statement()->IsJump();
1104 } 1094 }
1105 1095
1106 void set_base_id(int id) { base_id_ = id; } 1096 void set_base_id(int id) { base_id_ = id; }
1107 static int num_ids() { return parent_num_ids() + 3; } 1097 static int num_ids() { return parent_num_ids() + 3; }
1108 BailoutId IfId() const { return BailoutId(local_id(0)); } 1098 BailoutId IfId() const { return BailoutId(local_id(0)); }
1109 BailoutId ThenId() const { return BailoutId(local_id(1)); } 1099 BailoutId ThenId() const { return BailoutId(local_id(1)); }
1110 BailoutId ElseId() const { return BailoutId(local_id(2)); } 1100 BailoutId ElseId() const { return BailoutId(local_id(2)); }
1111 1101
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 1262
1273 Statement* statement_; 1263 Statement* statement_;
1274 Scope* const scope_; 1264 Scope* const scope_;
1275 }; 1265 };
1276 1266
1277 1267
1278 class Literal final : public Expression { 1268 class Literal final : public Expression {
1279 public: 1269 public:
1280 DECLARE_NODE_TYPE(Literal) 1270 DECLARE_NODE_TYPE(Literal)
1281 1271
1282 bool IsPropertyName() const override { return value_->IsPropertyName(); } 1272 bool IsPropertyName() const { return value_->IsPropertyName(); }
1283 1273
1284 Handle<String> AsPropertyName() { 1274 Handle<String> AsPropertyName() {
1285 DCHECK(IsPropertyName()); 1275 DCHECK(IsPropertyName());
1286 return Handle<String>::cast(value()); 1276 return Handle<String>::cast(value());
1287 } 1277 }
1288 1278
1289 const AstRawString* AsRawPropertyName() { 1279 const AstRawString* AsRawPropertyName() {
1290 DCHECK(IsPropertyName()); 1280 DCHECK(IsPropertyName());
1291 return value_->AsString(); 1281 return value_->AsString();
1292 } 1282 }
1293 1283
1294 bool ToBooleanIsTrue() const override { return value()->BooleanValue(); } 1284 bool ToBooleanIsTrue() const { return value()->BooleanValue(); }
1295 bool ToBooleanIsFalse() const override { return !value()->BooleanValue(); } 1285 bool ToBooleanIsFalse() const { return !value()->BooleanValue(); }
1296 1286
1297 Handle<Object> value() const { return value_->value(); } 1287 Handle<Object> value() const { return value_->value(); }
1298 const AstValue* raw_value() const { return value_; } 1288 const AstValue* raw_value() const { return value_; }
1299 1289
1300 // Support for using Literal as a HashMap key. NOTE: Currently, this works 1290 // Support for using Literal as a HashMap key. NOTE: Currently, this works
1301 // only for string and number literals! 1291 // only for string and number literals!
1302 uint32_t Hash(); 1292 uint32_t Hash();
1303 static bool Match(void* literal1, void* literal2); 1293 static bool Match(void* literal1, void* literal2);
1304 1294
1305 static int num_ids() { return parent_num_ids() + 1; } 1295 static int num_ids() { return parent_num_ids() + 1; }
(...skipping 11 matching lines...) Expand all
1317 1307
1318 const AstValue* value_; 1308 const AstValue* value_;
1319 }; 1309 };
1320 1310
1321 1311
1322 class AstLiteralReindexer; 1312 class AstLiteralReindexer;
1323 1313
1324 // Base class for literals that needs space in the corresponding JSFunction. 1314 // Base class for literals that needs space in the corresponding JSFunction.
1325 class MaterializedLiteral : public Expression { 1315 class MaterializedLiteral : public Expression {
1326 public: 1316 public:
1327 MaterializedLiteral* AsMaterializedLiteral() final { return this; }
1328
1329 int literal_index() { return literal_index_; } 1317 int literal_index() { return literal_index_; }
1330 1318
1331 int depth() const { 1319 int depth() const {
1332 // only callable after initialization. 1320 // only callable after initialization.
1333 DCHECK(depth_ >= 1); 1321 DCHECK(depth_ >= 1);
1334 return depth_; 1322 return depth_;
1335 } 1323 }
1336 1324
1337 protected: 1325 protected:
1338 MaterializedLiteral(Zone* zone, int literal_index, int pos) 1326 MaterializedLiteral(Zone* zone, int literal_index, int pos)
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 ZoneList<Expression*>* values_; 1646 ZoneList<Expression*>* values_;
1659 int first_spread_index_; 1647 int first_spread_index_;
1660 FeedbackVectorSlot literal_slot_; 1648 FeedbackVectorSlot literal_slot_;
1661 }; 1649 };
1662 1650
1663 1651
1664 class VariableProxy final : public Expression { 1652 class VariableProxy final : public Expression {
1665 public: 1653 public:
1666 DECLARE_NODE_TYPE(VariableProxy) 1654 DECLARE_NODE_TYPE(VariableProxy)
1667 1655
1668 bool IsValidReferenceExpression() const override { 1656 bool IsValidReferenceExpression() const {
1669 return !is_this() && !is_new_target(); 1657 return !is_this() && !is_new_target();
1670 } 1658 }
1671 1659
1672 bool IsArguments() const { return is_resolved() && var()->is_arguments(); } 1660 bool IsArguments() const { return is_resolved() && var()->is_arguments(); }
1673 1661
1674 Handle<String> name() const { return raw_name()->string(); } 1662 Handle<String> name() const { return raw_name()->string(); }
1675 const AstRawString* raw_name() const { 1663 const AstRawString* raw_name() const {
1676 return is_resolved() ? var_->raw_name() : raw_name_; 1664 return is_resolved() ? var_->raw_name() : raw_name_;
1677 } 1665 }
1678 1666
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1758 KEYED_PROPERTY, 1746 KEYED_PROPERTY,
1759 NAMED_SUPER_PROPERTY, 1747 NAMED_SUPER_PROPERTY,
1760 KEYED_SUPER_PROPERTY 1748 KEYED_SUPER_PROPERTY
1761 }; 1749 };
1762 1750
1763 1751
1764 class Property final : public Expression { 1752 class Property final : public Expression {
1765 public: 1753 public:
1766 DECLARE_NODE_TYPE(Property) 1754 DECLARE_NODE_TYPE(Property)
1767 1755
1768 bool IsValidReferenceExpression() const override { return true; } 1756 bool IsValidReferenceExpression() const { return true; }
1769 1757
1770 Expression* obj() const { return obj_; } 1758 Expression* obj() const { return obj_; }
1771 Expression* key() const { return key_; } 1759 Expression* key() const { return key_; }
1772 1760
1773 void set_obj(Expression* e) { obj_ = e; } 1761 void set_obj(Expression* e) { obj_ = e; }
1774 void set_key(Expression* e) { key_ = e; } 1762 void set_key(Expression* e) { key_ = e; }
1775 1763
1776 static int num_ids() { return parent_num_ids() + 1; } 1764 static int num_ids() { return parent_num_ids() + 1; }
1777 BailoutId LoadId() const { return BailoutId(local_id(0)); } 1765 BailoutId LoadId() const { return BailoutId(local_id(0)); }
1778 1766
1779 bool IsStringAccess() const { 1767 bool IsStringAccess() const {
1780 return IsStringAccessField::decode(bit_field_); 1768 return IsStringAccessField::decode(bit_field_);
1781 } 1769 }
1782 1770
1783 // Type feedback information. 1771 // Type feedback information.
1784 bool IsMonomorphic() override { return receiver_types_.length() == 1; } 1772 bool IsMonomorphic() const { return receiver_types_.length() == 1; }
1785 SmallMapList* GetReceiverTypes() override { return &receiver_types_; } 1773 SmallMapList* GetReceiverTypes() { return &receiver_types_; }
1786 KeyedAccessStoreMode GetStoreMode() const override { return STANDARD_STORE; } 1774 KeyedAccessStoreMode GetStoreMode() const { return STANDARD_STORE; }
1787 IcCheckType GetKeyType() const override { 1775 IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); }
1788 return KeyTypeField::decode(bit_field_);
1789 }
1790 bool IsUninitialized() const { 1776 bool IsUninitialized() const {
1791 return !is_for_call() && HasNoTypeInformation(); 1777 return !is_for_call() && HasNoTypeInformation();
1792 } 1778 }
1793 bool HasNoTypeInformation() const { 1779 bool HasNoTypeInformation() const {
1794 return GetInlineCacheState() == UNINITIALIZED; 1780 return GetInlineCacheState() == UNINITIALIZED;
1795 } 1781 }
1796 InlineCacheState GetInlineCacheState() const { 1782 InlineCacheState GetInlineCacheState() const {
1797 return InlineCacheStateField::decode(bit_field_); 1783 return InlineCacheStateField::decode(bit_field_);
1798 } 1784 }
1799 void set_is_string_access(bool b) { 1785 void set_is_string_access(bool b) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1867 void set_expression(Expression* e) { expression_ = e; } 1853 void set_expression(Expression* e) { expression_ = e; }
1868 1854
1869 // Type feedback information. 1855 // Type feedback information.
1870 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1856 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1871 FeedbackVectorSlotCache* cache); 1857 FeedbackVectorSlotCache* cache);
1872 1858
1873 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; } 1859 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; }
1874 1860
1875 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; } 1861 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; }
1876 1862
1877 SmallMapList* GetReceiverTypes() override { 1863 SmallMapList* GetReceiverTypes() {
1878 if (expression()->IsProperty()) { 1864 if (expression()->IsProperty()) {
1879 return expression()->AsProperty()->GetReceiverTypes(); 1865 return expression()->AsProperty()->GetReceiverTypes();
1880 } 1866 }
1881 return NULL; 1867 return nullptr;
1882 } 1868 }
1883 1869
1884 bool IsMonomorphic() override { 1870 bool IsMonomorphic() const {
1885 if (expression()->IsProperty()) { 1871 if (expression()->IsProperty()) {
1886 return expression()->AsProperty()->IsMonomorphic(); 1872 return expression()->AsProperty()->IsMonomorphic();
1887 } 1873 }
1888 return !target_.is_null(); 1874 return !target_.is_null();
1889 } 1875 }
1890 1876
1891 bool global_call() const { 1877 bool global_call() const {
1892 VariableProxy* proxy = expression_->AsVariableProxy(); 1878 VariableProxy* proxy = expression_->AsVariableProxy();
1893 return proxy != NULL && proxy->var()->IsUnallocatedOrGlobalSlot(); 1879 return proxy != NULL && proxy->var()->IsUnallocatedOrGlobalSlot();
1894 } 1880 }
(...skipping 25 matching lines...) Expand all
1920 return IsUninitializedField::decode(bit_field_); 1906 return IsUninitializedField::decode(bit_field_);
1921 } 1907 }
1922 void set_is_uninitialized(bool b) { 1908 void set_is_uninitialized(bool b) {
1923 bit_field_ = IsUninitializedField::update(bit_field_, b); 1909 bit_field_ = IsUninitializedField::update(bit_field_, b);
1924 } 1910 }
1925 1911
1926 TailCallMode tail_call_mode() const { 1912 TailCallMode tail_call_mode() const {
1927 return IsTailField::decode(bit_field_) ? TailCallMode::kAllow 1913 return IsTailField::decode(bit_field_) ? TailCallMode::kAllow
1928 : TailCallMode::kDisallow; 1914 : TailCallMode::kDisallow;
1929 } 1915 }
1930 void MarkTail() override { 1916 void MarkTail() { bit_field_ = IsTailField::update(bit_field_, true); }
1931 bit_field_ = IsTailField::update(bit_field_, true);
1932 }
1933 1917
1934 enum CallType { 1918 enum CallType {
1935 POSSIBLY_EVAL_CALL, 1919 POSSIBLY_EVAL_CALL,
1936 GLOBAL_CALL, 1920 GLOBAL_CALL,
1937 LOOKUP_SLOT_CALL, 1921 LOOKUP_SLOT_CALL,
1938 NAMED_PROPERTY_CALL, 1922 NAMED_PROPERTY_CALL,
1939 KEYED_PROPERTY_CALL, 1923 KEYED_PROPERTY_CALL,
1940 NAMED_SUPER_PROPERTY_CALL, 1924 NAMED_SUPER_PROPERTY_CALL,
1941 KEYED_SUPER_PROPERTY_CALL, 1925 KEYED_SUPER_PROPERTY_CALL,
1942 SUPER_CALL, 1926 SUPER_CALL,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1997 // Construct calls have two slots, one right after the other. 1981 // Construct calls have two slots, one right after the other.
1998 // The second slot stores the call count for monomorphic calls. 1982 // The second slot stores the call count for monomorphic calls.
1999 spec->AddGeneralSlot(); 1983 spec->AddGeneralSlot();
2000 } 1984 }
2001 1985
2002 FeedbackVectorSlot CallNewFeedbackSlot() { 1986 FeedbackVectorSlot CallNewFeedbackSlot() {
2003 DCHECK(!callnew_feedback_slot_.IsInvalid()); 1987 DCHECK(!callnew_feedback_slot_.IsInvalid());
2004 return callnew_feedback_slot_; 1988 return callnew_feedback_slot_;
2005 } 1989 }
2006 1990
2007 bool IsMonomorphic() override { return is_monomorphic_; } 1991 bool IsMonomorphic() const { return is_monomorphic_; }
2008 Handle<JSFunction> target() const { return target_; } 1992 Handle<JSFunction> target() const { return target_; }
2009 Handle<AllocationSite> allocation_site() const { 1993 Handle<AllocationSite> allocation_site() const {
2010 return allocation_site_; 1994 return allocation_site_;
2011 } 1995 }
2012 1996
2013 static int num_ids() { return parent_num_ids() + 1; } 1997 static int num_ids() { return parent_num_ids() + 1; }
2014 static int feedback_slots() { return 1; } 1998 static int feedback_slots() { return 1; }
2015 BailoutId ReturnId() const { return BailoutId(local_id(0)); } 1999 BailoutId ReturnId() const { return BailoutId(local_id(0)); }
2016 2000
2017 void set_allocation_site(Handle<AllocationSite> site) { 2001 void set_allocation_site(Handle<AllocationSite> site) {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2103 Token::Value op() const { return op_; } 2087 Token::Value op() const { return op_; }
2104 Expression* expression() const { return expression_; } 2088 Expression* expression() const { return expression_; }
2105 void set_expression(Expression* e) { expression_ = e; } 2089 void set_expression(Expression* e) { expression_ = e; }
2106 2090
2107 // For unary not (Token::NOT), the AST ids where true and false will 2091 // For unary not (Token::NOT), the AST ids where true and false will
2108 // actually be materialized, respectively. 2092 // actually be materialized, respectively.
2109 static int num_ids() { return parent_num_ids() + 2; } 2093 static int num_ids() { return parent_num_ids() + 2; }
2110 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } 2094 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); }
2111 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } 2095 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); }
2112 2096
2113 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) override; 2097 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle);
2114 2098
2115 protected: 2099 protected:
2116 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) 2100 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos)
2117 : Expression(zone, pos), op_(op), expression_(expression) { 2101 : Expression(zone, pos), op_(op), expression_(expression) {
2118 DCHECK(Token::IsUnaryOp(op)); 2102 DCHECK(Token::IsUnaryOp(op));
2119 } 2103 }
2120 static int parent_num_ids() { return Expression::num_ids(); } 2104 static int parent_num_ids() { return Expression::num_ids(); }
2121 2105
2122 private: 2106 private:
2123 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2107 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
(...skipping 10 matching lines...) Expand all
2134 Token::Value op() const { return static_cast<Token::Value>(op_); } 2118 Token::Value op() const { return static_cast<Token::Value>(op_); }
2135 Expression* left() const { return left_; } 2119 Expression* left() const { return left_; }
2136 void set_left(Expression* e) { left_ = e; } 2120 void set_left(Expression* e) { left_ = e; }
2137 Expression* right() const { return right_; } 2121 Expression* right() const { return right_; }
2138 void set_right(Expression* e) { right_ = e; } 2122 void set_right(Expression* e) { right_ = e; }
2139 Handle<AllocationSite> allocation_site() const { return allocation_site_; } 2123 Handle<AllocationSite> allocation_site() const { return allocation_site_; }
2140 void set_allocation_site(Handle<AllocationSite> allocation_site) { 2124 void set_allocation_site(Handle<AllocationSite> allocation_site) {
2141 allocation_site_ = allocation_site; 2125 allocation_site_ = allocation_site;
2142 } 2126 }
2143 2127
2144 void MarkTail() override { 2128 void MarkTail() {
2145 switch (op()) { 2129 switch (op()) {
2146 case Token::COMMA: 2130 case Token::COMMA:
2147 case Token::AND: 2131 case Token::AND:
2148 case Token::OR: 2132 case Token::OR:
2149 right_->MarkTail(); 2133 right_->MarkTail();
2150 default: 2134 default:
2151 break; 2135 break;
2152 } 2136 }
2153 } 2137 }
2154 2138
2155 // The short-circuit logical operations need an AST ID for their 2139 // The short-circuit logical operations need an AST ID for their
2156 // right-hand subexpression. 2140 // right-hand subexpression.
2157 static int num_ids() { return parent_num_ids() + 2; } 2141 static int num_ids() { return parent_num_ids() + 2; }
2158 BailoutId RightId() const { return BailoutId(local_id(0)); } 2142 BailoutId RightId() const { return BailoutId(local_id(0)); }
2159 2143
2160 TypeFeedbackId BinaryOperationFeedbackId() const { 2144 TypeFeedbackId BinaryOperationFeedbackId() const {
2161 return TypeFeedbackId(local_id(1)); 2145 return TypeFeedbackId(local_id(1));
2162 } 2146 }
2163 Maybe<int> fixed_right_arg() const { 2147 Maybe<int> fixed_right_arg() const {
2164 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>(); 2148 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>();
2165 } 2149 }
2166 void set_fixed_right_arg(Maybe<int> arg) { 2150 void set_fixed_right_arg(Maybe<int> arg) {
2167 has_fixed_right_arg_ = arg.IsJust(); 2151 has_fixed_right_arg_ = arg.IsJust();
2168 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); 2152 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust();
2169 } 2153 }
2170 2154
2171 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) override; 2155 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle);
2172 2156
2173 protected: 2157 protected:
2174 BinaryOperation(Zone* zone, Token::Value op, Expression* left, 2158 BinaryOperation(Zone* zone, Token::Value op, Expression* left,
2175 Expression* right, int pos) 2159 Expression* right, int pos)
2176 : Expression(zone, pos), 2160 : Expression(zone, pos),
2177 op_(static_cast<byte>(op)), 2161 op_(static_cast<byte>(op)),
2178 has_fixed_right_arg_(false), 2162 has_fixed_right_arg_(false),
2179 fixed_right_arg_value_(0), 2163 fixed_right_arg_value_(0),
2180 left_(left), 2164 left_(left),
2181 right_(right) { 2165 right_(right) {
(...skipping 23 matching lines...) Expand all
2205 bool is_postfix() const { return !is_prefix(); } 2189 bool is_postfix() const { return !is_prefix(); }
2206 2190
2207 Token::Value op() const { return TokenField::decode(bit_field_); } 2191 Token::Value op() const { return TokenField::decode(bit_field_); }
2208 Token::Value binary_op() { 2192 Token::Value binary_op() {
2209 return (op() == Token::INC) ? Token::ADD : Token::SUB; 2193 return (op() == Token::INC) ? Token::ADD : Token::SUB;
2210 } 2194 }
2211 2195
2212 Expression* expression() const { return expression_; } 2196 Expression* expression() const { return expression_; }
2213 void set_expression(Expression* e) { expression_ = e; } 2197 void set_expression(Expression* e) { expression_ = e; }
2214 2198
2215 bool IsMonomorphic() override { return receiver_types_.length() == 1; } 2199 bool IsMonomorphic() const { return receiver_types_.length() == 1; }
2216 SmallMapList* GetReceiverTypes() override { return &receiver_types_; } 2200 SmallMapList* GetReceiverTypes() { return &receiver_types_; }
2217 IcCheckType GetKeyType() const override { 2201 IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); }
2218 return KeyTypeField::decode(bit_field_); 2202 KeyedAccessStoreMode GetStoreMode() const {
2219 }
2220 KeyedAccessStoreMode GetStoreMode() const override {
2221 return StoreModeField::decode(bit_field_); 2203 return StoreModeField::decode(bit_field_);
2222 } 2204 }
2223 Type* type() const { return type_; } 2205 Type* type() const { return type_; }
2224 void set_key_type(IcCheckType type) { 2206 void set_key_type(IcCheckType type) {
2225 bit_field_ = KeyTypeField::update(bit_field_, type); 2207 bit_field_ = KeyTypeField::update(bit_field_, type);
2226 } 2208 }
2227 void set_store_mode(KeyedAccessStoreMode mode) { 2209 void set_store_mode(KeyedAccessStoreMode mode) {
2228 bit_field_ = StoreModeField::update(bit_field_, mode); 2210 bit_field_ = StoreModeField::update(bit_field_, mode);
2229 } 2211 }
2230 void set_type(Type* type) { type_ = type; } 2212 void set_type(Type* type) { type_ = type; }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
2348 DECLARE_NODE_TYPE(Conditional) 2330 DECLARE_NODE_TYPE(Conditional)
2349 2331
2350 Expression* condition() const { return condition_; } 2332 Expression* condition() const { return condition_; }
2351 Expression* then_expression() const { return then_expression_; } 2333 Expression* then_expression() const { return then_expression_; }
2352 Expression* else_expression() const { return else_expression_; } 2334 Expression* else_expression() const { return else_expression_; }
2353 2335
2354 void set_condition(Expression* e) { condition_ = e; } 2336 void set_condition(Expression* e) { condition_ = e; }
2355 void set_then_expression(Expression* e) { then_expression_ = e; } 2337 void set_then_expression(Expression* e) { then_expression_ = e; }
2356 void set_else_expression(Expression* e) { else_expression_ = e; } 2338 void set_else_expression(Expression* e) { else_expression_ = e; }
2357 2339
2358 void MarkTail() override { 2340 void MarkTail() {
2359 then_expression_->MarkTail(); 2341 then_expression_->MarkTail();
2360 else_expression_->MarkTail(); 2342 else_expression_->MarkTail();
2361 } 2343 }
2362 2344
2363 static int num_ids() { return parent_num_ids() + 2; } 2345 static int num_ids() { return parent_num_ids() + 2; }
2364 BailoutId ThenId() const { return BailoutId(local_id(0)); } 2346 BailoutId ThenId() const { return BailoutId(local_id(0)); }
2365 BailoutId ElseId() const { return BailoutId(local_id(1)); } 2347 BailoutId ElseId() const { return BailoutId(local_id(1)); }
2366 2348
2367 protected: 2349 protected:
2368 Conditional(Zone* zone, Expression* condition, Expression* then_expression, 2350 Conditional(Zone* zone, Expression* condition, Expression* then_expression,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2400 BinaryOperation* binary_operation() const { return binary_operation_; } 2382 BinaryOperation* binary_operation() const { return binary_operation_; }
2401 2383
2402 // This check relies on the definition order of token in token.h. 2384 // This check relies on the definition order of token in token.h.
2403 bool is_compound() const { return op() > Token::ASSIGN; } 2385 bool is_compound() const { return op() > Token::ASSIGN; }
2404 2386
2405 static int num_ids() { return parent_num_ids() + 2; } 2387 static int num_ids() { return parent_num_ids() + 2; }
2406 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } 2388 BailoutId AssignmentId() const { return BailoutId(local_id(0)); }
2407 2389
2408 // Type feedback information. 2390 // Type feedback information.
2409 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); } 2391 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); }
2410 bool IsMonomorphic() override { return receiver_types_.length() == 1; }
2411 bool IsUninitialized() const { 2392 bool IsUninitialized() const {
2412 return IsUninitializedField::decode(bit_field_); 2393 return IsUninitializedField::decode(bit_field_);
2413 } 2394 }
2414 bool HasNoTypeInformation() { 2395 bool HasNoTypeInformation() {
2415 return IsUninitializedField::decode(bit_field_); 2396 return IsUninitializedField::decode(bit_field_);
2416 } 2397 }
2417 SmallMapList* GetReceiverTypes() override { return &receiver_types_; } 2398 bool IsMonomorphic() const { return receiver_types_.length() == 1; }
2418 IcCheckType GetKeyType() const override { 2399 SmallMapList* GetReceiverTypes() { return &receiver_types_; }
2419 return KeyTypeField::decode(bit_field_); 2400 IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); }
2420 } 2401 KeyedAccessStoreMode GetStoreMode() const {
2421 KeyedAccessStoreMode GetStoreMode() const override {
2422 return StoreModeField::decode(bit_field_); 2402 return StoreModeField::decode(bit_field_);
2423 } 2403 }
2424 void set_is_uninitialized(bool b) { 2404 void set_is_uninitialized(bool b) {
2425 bit_field_ = IsUninitializedField::update(bit_field_, b); 2405 bit_field_ = IsUninitializedField::update(bit_field_, b);
2426 } 2406 }
2427 void set_key_type(IcCheckType key_type) { 2407 void set_key_type(IcCheckType key_type) {
2428 bit_field_ = KeyTypeField::update(bit_field_, key_type); 2408 bit_field_ = KeyTypeField::update(bit_field_, key_type);
2429 } 2409 }
2430 void set_store_mode(KeyedAccessStoreMode mode) { 2410 void set_store_mode(KeyedAccessStoreMode mode) {
2431 bit_field_ = StoreModeField::update(bit_field_, mode); 2411 bit_field_ = StoreModeField::update(bit_field_, mode);
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
2681 } 2661 }
2682 const FeedbackVectorSpec* feedback_vector_spec() const { 2662 const FeedbackVectorSpec* feedback_vector_spec() const {
2683 return ast_properties_.get_spec(); 2663 return ast_properties_.get_spec();
2684 } 2664 }
2685 bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } 2665 bool dont_optimize() { return dont_optimize_reason_ != kNoReason; }
2686 BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } 2666 BailoutReason dont_optimize_reason() { return dont_optimize_reason_; }
2687 void set_dont_optimize_reason(BailoutReason reason) { 2667 void set_dont_optimize_reason(BailoutReason reason) {
2688 dont_optimize_reason_ = reason; 2668 dont_optimize_reason_ = reason;
2689 } 2669 }
2690 2670
2691 bool IsAnonymousFunctionDefinition() const final { 2671 bool IsAnonymousFunctionDefinition() const {
2692 return is_anonymous_expression(); 2672 return is_anonymous_expression();
2693 } 2673 }
2694 2674
2695 int yield_count() { return yield_count_; } 2675 int yield_count() { return yield_count_; }
2696 void set_yield_count(int yield_count) { yield_count_ = yield_count; } 2676 void set_yield_count(int yield_count) { yield_count_ = yield_count; }
2697 2677
2698 protected: 2678 protected:
2699 FunctionLiteral(Zone* zone, const AstString* name, 2679 FunctionLiteral(Zone* zone, const AstString* name,
2700 AstValueFactory* ast_value_factory, Scope* scope, 2680 AstValueFactory* ast_value_factory, Scope* scope,
2701 ZoneList<Statement*>* body, int materialized_literal_count, 2681 ZoneList<Statement*>* body, int materialized_literal_count,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2790 FeedbackVectorSlotCache* cache); 2770 FeedbackVectorSlotCache* cache);
2791 2771
2792 bool NeedsProxySlot() const { 2772 bool NeedsProxySlot() const {
2793 return class_variable_proxy() != nullptr && 2773 return class_variable_proxy() != nullptr &&
2794 class_variable_proxy()->var()->IsUnallocated(); 2774 class_variable_proxy()->var()->IsUnallocated();
2795 } 2775 }
2796 2776
2797 FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; } 2777 FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; }
2798 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } 2778 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; }
2799 2779
2800 bool IsAnonymousFunctionDefinition() const final { 2780 bool IsAnonymousFunctionDefinition() const {
2801 return constructor()->raw_name()->length() == 0; 2781 return constructor()->raw_name()->length() == 0;
2802 } 2782 }
2803 2783
2804 protected: 2784 protected:
2805 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, 2785 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy,
2806 Expression* extends, FunctionLiteral* constructor, 2786 Expression* extends, FunctionLiteral* constructor,
2807 ZoneList<Property*>* properties, int start_position, 2787 ZoneList<Property*>* properties, int start_position,
2808 int end_position) 2788 int end_position)
2809 : Expression(zone, start_position), 2789 : Expression(zone, start_position),
2810 scope_(scope), 2790 scope_(scope),
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
3566 : NULL; \ 3546 : NULL; \
3567 } 3547 }
3568 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3548 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3569 #undef DECLARE_NODE_FUNCTIONS 3549 #undef DECLARE_NODE_FUNCTIONS
3570 3550
3571 3551
3572 } // namespace internal 3552 } // namespace internal
3573 } // namespace v8 3553 } // namespace v8
3574 3554
3575 #endif // V8_AST_AST_H_ 3555 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698