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

Side by Side Diff: src/ast.h

Issue 12673: Change implementation of eval to make an exact distinction between direct eva... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 12 years 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/codegen-arm.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 V(Slot) \ 74 V(Slot) \
75 V(VariableProxy) \ 75 V(VariableProxy) \
76 V(Literal) \ 76 V(Literal) \
77 V(RegExpLiteral) \ 77 V(RegExpLiteral) \
78 V(ObjectLiteral) \ 78 V(ObjectLiteral) \
79 V(ArrayLiteral) \ 79 V(ArrayLiteral) \
80 V(Assignment) \ 80 V(Assignment) \
81 V(Throw) \ 81 V(Throw) \
82 V(Property) \ 82 V(Property) \
83 V(Call) \ 83 V(Call) \
84 V(CallEval) \
84 V(CallNew) \ 85 V(CallNew) \
85 V(CallRuntime) \ 86 V(CallRuntime) \
86 V(UnaryOperation) \ 87 V(UnaryOperation) \
87 V(CountOperation) \ 88 V(CountOperation) \
88 V(BinaryOperation) \ 89 V(BinaryOperation) \
89 V(CompareOperation) \ 90 V(CompareOperation) \
90 V(ThisFunction) 91 V(ThisFunction)
91 92
92 93
93 #define DEF_FORWARD_DECLARATION(type) class type; 94 #define DEF_FORWARD_DECLARATION(type) class type;
94 NODE_LIST(DEF_FORWARD_DECLARATION) 95 NODE_LIST(DEF_FORWARD_DECLARATION)
95 #undef DEF_FORWARD_DECLARATION 96 #undef DEF_FORWARD_DECLARATION
96 97
97 98
98 // Typedef only introduced to avoid unreadable code. 99 // Typedef only introduced to avoid unreadable code.
99 // Please do appreciate the required space in "> >". 100 // Please do appreciate the required space in "> >".
100 typedef ZoneList<Handle<String> > ZoneStringList; 101 typedef ZoneList<Handle<String> > ZoneStringList;
101 102
102 103
103 class Node: public ZoneObject { 104 class Node: public ZoneObject {
104 public: 105 public:
105 Node(): statement_pos_(RelocInfo::kNoPosition) { } 106 Node(): statement_pos_(RelocInfo::kNoPosition) { }
106 virtual ~Node() { } 107 virtual ~Node() { }
107 virtual void Accept(Visitor* v) = 0; 108 virtual void Accept(AstVisitor* v) = 0;
108 109
109 // Type testing & conversion. 110 // Type testing & conversion.
110 virtual Statement* AsStatement() { return NULL; } 111 virtual Statement* AsStatement() { return NULL; }
111 virtual ExpressionStatement* AsExpressionStatement() { return NULL; } 112 virtual ExpressionStatement* AsExpressionStatement() { return NULL; }
112 virtual EmptyStatement* AsEmptyStatement() { return NULL; } 113 virtual EmptyStatement* AsEmptyStatement() { return NULL; }
113 virtual Expression* AsExpression() { return NULL; } 114 virtual Expression* AsExpression() { return NULL; }
114 virtual Literal* AsLiteral() { return NULL; } 115 virtual Literal* AsLiteral() { return NULL; }
115 virtual Slot* AsSlot() { return NULL; } 116 virtual Slot* AsSlot() { return NULL; }
116 virtual VariableProxy* AsVariableProxy() { return NULL; } 117 virtual VariableProxy* AsVariableProxy() { return NULL; }
117 virtual Property* AsProperty() { return NULL; } 118 virtual Property* AsProperty() { return NULL; }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 162
162 163
163 /** 164 /**
164 * A sentinel used during pre parsing that represents some expression 165 * A sentinel used during pre parsing that represents some expression
165 * that is a valid left hand side without having to actually build 166 * that is a valid left hand side without having to actually build
166 * the expression. 167 * the expression.
167 */ 168 */
168 class ValidLeftHandSideSentinel: public Expression { 169 class ValidLeftHandSideSentinel: public Expression {
169 public: 170 public:
170 virtual bool IsValidLeftHandSide() { return true; } 171 virtual bool IsValidLeftHandSide() { return true; }
171 virtual void Accept(Visitor* v) { UNREACHABLE(); } 172 virtual void Accept(AstVisitor* v) { UNREACHABLE(); }
172 static ValidLeftHandSideSentinel* instance() { return &instance_; } 173 static ValidLeftHandSideSentinel* instance() { return &instance_; }
173 private: 174 private:
174 static ValidLeftHandSideSentinel instance_; 175 static ValidLeftHandSideSentinel instance_;
175 }; 176 };
176 177
177 178
178 class BreakableStatement: public Statement { 179 class BreakableStatement: public Statement {
179 public: 180 public:
180 enum Type { 181 enum Type {
181 TARGET_FOR_ANONYMOUS, 182 TARGET_FOR_ANONYMOUS,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 }; 215 };
215 216
216 217
217 class Block: public BreakableStatement { 218 class Block: public BreakableStatement {
218 public: 219 public:
219 Block(ZoneStringList* labels, int capacity, bool is_initializer_block) 220 Block(ZoneStringList* labels, int capacity, bool is_initializer_block)
220 : BreakableStatement(labels, TARGET_FOR_NAMED_ONLY), 221 : BreakableStatement(labels, TARGET_FOR_NAMED_ONLY),
221 statements_(capacity), 222 statements_(capacity),
222 is_initializer_block_(is_initializer_block) { } 223 is_initializer_block_(is_initializer_block) { }
223 224
224 virtual void Accept(Visitor* v); 225 virtual void Accept(AstVisitor* v);
225 226
226 void AddStatement(Statement* statement) { statements_.Add(statement); } 227 void AddStatement(Statement* statement) { statements_.Add(statement); }
227 228
228 ZoneList<Statement*>* statements() { return &statements_; } 229 ZoneList<Statement*>* statements() { return &statements_; }
229 bool is_initializer_block() const { return is_initializer_block_; } 230 bool is_initializer_block() const { return is_initializer_block_; }
230 231
231 private: 232 private:
232 ZoneList<Statement*> statements_; 233 ZoneList<Statement*> statements_;
233 bool is_initializer_block_; 234 bool is_initializer_block_;
234 }; 235 };
235 236
236 237
237 class Declaration: public Node { 238 class Declaration: public Node {
238 public: 239 public:
239 Declaration(VariableProxy* proxy, Variable::Mode mode, FunctionLiteral* fun) 240 Declaration(VariableProxy* proxy, Variable::Mode mode, FunctionLiteral* fun)
240 : proxy_(proxy), 241 : proxy_(proxy),
241 mode_(mode), 242 mode_(mode),
242 fun_(fun) { 243 fun_(fun) {
243 ASSERT(mode == Variable::VAR || mode == Variable::CONST); 244 ASSERT(mode == Variable::VAR || mode == Variable::CONST);
244 // At the moment there are no "const functions"'s in JavaScript... 245 // At the moment there are no "const functions"'s in JavaScript...
245 ASSERT(fun == NULL || mode == Variable::VAR); 246 ASSERT(fun == NULL || mode == Variable::VAR);
246 } 247 }
247 248
248 virtual void Accept(Visitor* v); 249 virtual void Accept(AstVisitor* v);
249 250
250 VariableProxy* proxy() const { return proxy_; } 251 VariableProxy* proxy() const { return proxy_; }
251 Variable::Mode mode() const { return mode_; } 252 Variable::Mode mode() const { return mode_; }
252 FunctionLiteral* fun() const { return fun_; } // may be NULL 253 FunctionLiteral* fun() const { return fun_; } // may be NULL
253 254
254 private: 255 private:
255 VariableProxy* proxy_; 256 VariableProxy* proxy_;
256 Variable::Mode mode_; 257 Variable::Mode mode_;
257 FunctionLiteral* fun_; 258 FunctionLiteral* fun_;
258 }; 259 };
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 Statement* next, 296 Statement* next,
296 Statement* body) { 297 Statement* body) {
297 ASSERT(init == NULL || type_ == FOR_LOOP); 298 ASSERT(init == NULL || type_ == FOR_LOOP);
298 ASSERT(next == NULL || type_ == FOR_LOOP); 299 ASSERT(next == NULL || type_ == FOR_LOOP);
299 IterationStatement::Initialize(body); 300 IterationStatement::Initialize(body);
300 init_ = init; 301 init_ = init;
301 cond_ = cond; 302 cond_ = cond;
302 next_ = next; 303 next_ = next;
303 } 304 }
304 305
305 virtual void Accept(Visitor* v); 306 virtual void Accept(AstVisitor* v);
306 307
307 Type type() const { return type_; } 308 Type type() const { return type_; }
308 Statement* init() const { return init_; } 309 Statement* init() const { return init_; }
309 Expression* cond() const { return cond_; } 310 Expression* cond() const { return cond_; }
310 Statement* next() const { return next_; } 311 Statement* next() const { return next_; }
311 312
312 #ifdef DEBUG 313 #ifdef DEBUG
313 const char* OperatorString() const; 314 const char* OperatorString() const;
314 #endif 315 #endif
315 316
316 private: 317 private:
317 Type type_; 318 Type type_;
318 Statement* init_; 319 Statement* init_;
319 Expression* cond_; 320 Expression* cond_;
320 Statement* next_; 321 Statement* next_;
321 }; 322 };
322 323
323 324
324 class ForInStatement: public IterationStatement { 325 class ForInStatement: public IterationStatement {
325 public: 326 public:
326 explicit ForInStatement(ZoneStringList* labels) 327 explicit ForInStatement(ZoneStringList* labels)
327 : IterationStatement(labels), each_(NULL), enumerable_(NULL) { } 328 : IterationStatement(labels), each_(NULL), enumerable_(NULL) { }
328 329
329 void Initialize(Expression* each, Expression* enumerable, Statement* body) { 330 void Initialize(Expression* each, Expression* enumerable, Statement* body) {
330 IterationStatement::Initialize(body); 331 IterationStatement::Initialize(body);
331 each_ = each; 332 each_ = each;
332 enumerable_ = enumerable; 333 enumerable_ = enumerable;
333 } 334 }
334 335
335 virtual void Accept(Visitor* v); 336 virtual void Accept(AstVisitor* v);
336 337
337 Expression* each() const { return each_; } 338 Expression* each() const { return each_; }
338 Expression* enumerable() const { return enumerable_; } 339 Expression* enumerable() const { return enumerable_; }
339 340
340 private: 341 private:
341 Expression* each_; 342 Expression* each_;
342 Expression* enumerable_; 343 Expression* enumerable_;
343 }; 344 };
344 345
345 346
346 class ExpressionStatement: public Statement { 347 class ExpressionStatement: public Statement {
347 public: 348 public:
348 explicit ExpressionStatement(Expression* expression) 349 explicit ExpressionStatement(Expression* expression)
349 : expression_(expression) { } 350 : expression_(expression) { }
350 351
351 virtual void Accept(Visitor* v); 352 virtual void Accept(AstVisitor* v);
352 353
353 // Type testing & conversion. 354 // Type testing & conversion.
354 virtual ExpressionStatement* AsExpressionStatement() { return this; } 355 virtual ExpressionStatement* AsExpressionStatement() { return this; }
355 356
356 void set_expression(Expression* e) { expression_ = e; } 357 void set_expression(Expression* e) { expression_ = e; }
357 Expression* expression() { return expression_; } 358 Expression* expression() { return expression_; }
358 359
359 private: 360 private:
360 Expression* expression_; 361 Expression* expression_;
361 }; 362 };
362 363
363 364
364 class ContinueStatement: public Statement { 365 class ContinueStatement: public Statement {
365 public: 366 public:
366 explicit ContinueStatement(IterationStatement* target) 367 explicit ContinueStatement(IterationStatement* target)
367 : target_(target) { } 368 : target_(target) { }
368 369
369 virtual void Accept(Visitor* v); 370 virtual void Accept(AstVisitor* v);
370 371
371 IterationStatement* target() const { return target_; } 372 IterationStatement* target() const { return target_; }
372 373
373 private: 374 private:
374 IterationStatement* target_; 375 IterationStatement* target_;
375 }; 376 };
376 377
377 378
378 class BreakStatement: public Statement { 379 class BreakStatement: public Statement {
379 public: 380 public:
380 explicit BreakStatement(BreakableStatement* target) 381 explicit BreakStatement(BreakableStatement* target)
381 : target_(target) { } 382 : target_(target) { }
382 383
383 virtual void Accept(Visitor* v); 384 virtual void Accept(AstVisitor* v);
384 385
385 BreakableStatement* target() const { return target_; } 386 BreakableStatement* target() const { return target_; }
386 387
387 private: 388 private:
388 BreakableStatement* target_; 389 BreakableStatement* target_;
389 }; 390 };
390 391
391 392
392 class ReturnStatement: public Statement { 393 class ReturnStatement: public Statement {
393 public: 394 public:
394 explicit ReturnStatement(Expression* expression) 395 explicit ReturnStatement(Expression* expression)
395 : expression_(expression) { } 396 : expression_(expression) { }
396 397
397 virtual void Accept(Visitor* v); 398 virtual void Accept(AstVisitor* v);
398 399
399 // Type testing & conversion. 400 // Type testing & conversion.
400 virtual ReturnStatement* AsReturnStatement() { return this; } 401 virtual ReturnStatement* AsReturnStatement() { return this; }
401 402
402 Expression* expression() { return expression_; } 403 Expression* expression() { return expression_; }
403 404
404 private: 405 private:
405 Expression* expression_; 406 Expression* expression_;
406 }; 407 };
407 408
408 409
409 class WithEnterStatement: public Statement { 410 class WithEnterStatement: public Statement {
410 public: 411 public:
411 explicit WithEnterStatement(Expression* expression) 412 explicit WithEnterStatement(Expression* expression)
412 : expression_(expression) { } 413 : expression_(expression) { }
413 414
414 virtual void Accept(Visitor* v); 415 virtual void Accept(AstVisitor* v);
415 416
416 Expression* expression() const { return expression_; } 417 Expression* expression() const { return expression_; }
417 418
418 private: 419 private:
419 Expression* expression_; 420 Expression* expression_;
420 }; 421 };
421 422
422 423
423 class WithExitStatement: public Statement { 424 class WithExitStatement: public Statement {
424 public: 425 public:
425 WithExitStatement() { } 426 WithExitStatement() { }
426 427
427 virtual void Accept(Visitor* v); 428 virtual void Accept(AstVisitor* v);
428 }; 429 };
429 430
430 431
431 class CaseClause: public ZoneObject { 432 class CaseClause: public ZoneObject {
432 public: 433 public:
433 CaseClause(Expression* label, ZoneList<Statement*>* statements) 434 CaseClause(Expression* label, ZoneList<Statement*>* statements)
434 : label_(label), statements_(statements) { } 435 : label_(label), statements_(statements) { }
435 436
436 bool is_default() const { return label_ == NULL; } 437 bool is_default() const { return label_ == NULL; }
437 Expression* label() const { 438 Expression* label() const {
(...skipping 12 matching lines...) Expand all
450 public: 451 public:
451 explicit SwitchStatement(ZoneStringList* labels) 452 explicit SwitchStatement(ZoneStringList* labels)
452 : BreakableStatement(labels, TARGET_FOR_ANONYMOUS), 453 : BreakableStatement(labels, TARGET_FOR_ANONYMOUS),
453 tag_(NULL), cases_(NULL) { } 454 tag_(NULL), cases_(NULL) { }
454 455
455 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 456 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
456 tag_ = tag; 457 tag_ = tag;
457 cases_ = cases; 458 cases_ = cases;
458 } 459 }
459 460
460 virtual void Accept(Visitor* v); 461 virtual void Accept(AstVisitor* v);
461 462
462 Expression* tag() const { return tag_; } 463 Expression* tag() const { return tag_; }
463 ZoneList<CaseClause*>* cases() const { return cases_; } 464 ZoneList<CaseClause*>* cases() const { return cases_; }
464 465
465 private: 466 private:
466 Expression* tag_; 467 Expression* tag_;
467 ZoneList<CaseClause*>* cases_; 468 ZoneList<CaseClause*>* cases_;
468 }; 469 };
469 470
470 471
471 // If-statements always have non-null references to their then- and 472 // If-statements always have non-null references to their then- and
472 // else-parts. When parsing if-statements with no explicit else-part, 473 // else-parts. When parsing if-statements with no explicit else-part,
473 // the parser implicitly creates an empty statement. Use the 474 // the parser implicitly creates an empty statement. Use the
474 // HasThenStatement() and HasElseStatement() functions to check if a 475 // HasThenStatement() and HasElseStatement() functions to check if a
475 // given if-statement has a then- or an else-part containing code. 476 // given if-statement has a then- or an else-part containing code.
476 class IfStatement: public Statement { 477 class IfStatement: public Statement {
477 public: 478 public:
478 IfStatement(Expression* condition, 479 IfStatement(Expression* condition,
479 Statement* then_statement, 480 Statement* then_statement,
480 Statement* else_statement) 481 Statement* else_statement)
481 : condition_(condition), 482 : condition_(condition),
482 then_statement_(then_statement), 483 then_statement_(then_statement),
483 else_statement_(else_statement) { } 484 else_statement_(else_statement) { }
484 485
485 virtual void Accept(Visitor* v); 486 virtual void Accept(AstVisitor* v);
486 487
487 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } 488 bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
488 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 489 bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
489 490
490 Expression* condition() const { return condition_; } 491 Expression* condition() const { return condition_; }
491 Statement* then_statement() const { return then_statement_; } 492 Statement* then_statement() const { return then_statement_; }
492 Statement* else_statement() const { return else_statement_; } 493 Statement* else_statement() const { return else_statement_; }
493 494
494 private: 495 private:
495 Expression* condition_; 496 Expression* condition_;
496 Statement* then_statement_; 497 Statement* then_statement_;
497 Statement* else_statement_; 498 Statement* else_statement_;
498 }; 499 };
499 500
500 501
501 // NOTE: LabelCollectors are represented as nodes to fit in the target 502 // NOTE: LabelCollectors are represented as nodes to fit in the target
502 // stack in the compiler; this should probably be reworked. 503 // stack in the compiler; this should probably be reworked.
503 class LabelCollector: public Node { 504 class LabelCollector: public Node {
504 public: 505 public:
505 explicit LabelCollector(ZoneList<Label*>* labels) : labels_(labels) { } 506 explicit LabelCollector(ZoneList<Label*>* labels) : labels_(labels) { }
506 507
507 // Adds a label to the collector. The collector stores a pointer not 508 // Adds a label to the collector. The collector stores a pointer not
508 // a copy of the label to make binding work, so make sure not to 509 // a copy of the label to make binding work, so make sure not to
509 // pass in references to something on the stack. 510 // pass in references to something on the stack.
510 void AddLabel(Label* label); 511 void AddLabel(Label* label);
511 512
512 // Virtual behaviour. LabelCollectors are never part of the AST. 513 // Virtual behaviour. LabelCollectors are never part of the AST.
513 virtual void Accept(Visitor* v) { UNREACHABLE(); } 514 virtual void Accept(AstVisitor* v) { UNREACHABLE(); }
514 virtual LabelCollector* AsLabelCollector() { return this; } 515 virtual LabelCollector* AsLabelCollector() { return this; }
515 516
516 ZoneList<Label*>* labels() { return labels_; } 517 ZoneList<Label*>* labels() { return labels_; }
517 518
518 private: 519 private:
519 ZoneList<Label*>* labels_; 520 ZoneList<Label*>* labels_;
520 }; 521 };
521 522
522 523
523 class TryStatement: public Statement { 524 class TryStatement: public Statement {
(...skipping 16 matching lines...) Expand all
540 541
541 class TryCatch: public TryStatement { 542 class TryCatch: public TryStatement {
542 public: 543 public:
543 TryCatch(Block* try_block, Expression* catch_var, Block* catch_block) 544 TryCatch(Block* try_block, Expression* catch_var, Block* catch_block)
544 : TryStatement(try_block), 545 : TryStatement(try_block),
545 catch_var_(catch_var), 546 catch_var_(catch_var),
546 catch_block_(catch_block) { 547 catch_block_(catch_block) {
547 ASSERT(catch_var->AsVariableProxy() != NULL); 548 ASSERT(catch_var->AsVariableProxy() != NULL);
548 } 549 }
549 550
550 virtual void Accept(Visitor* v); 551 virtual void Accept(AstVisitor* v);
551 552
552 Expression* catch_var() const { return catch_var_; } 553 Expression* catch_var() const { return catch_var_; }
553 Block* catch_block() const { return catch_block_; } 554 Block* catch_block() const { return catch_block_; }
554 555
555 private: 556 private:
556 Expression* catch_var_; 557 Expression* catch_var_;
557 Block* catch_block_; 558 Block* catch_block_;
558 }; 559 };
559 560
560 561
561 class TryFinally: public TryStatement { 562 class TryFinally: public TryStatement {
562 public: 563 public:
563 TryFinally(Block* try_block, Block* finally_block) 564 TryFinally(Block* try_block, Block* finally_block)
564 : TryStatement(try_block), 565 : TryStatement(try_block),
565 finally_block_(finally_block) { } 566 finally_block_(finally_block) { }
566 567
567 virtual void Accept(Visitor* v); 568 virtual void Accept(AstVisitor* v);
568 569
569 Block* finally_block() const { return finally_block_; } 570 Block* finally_block() const { return finally_block_; }
570 571
571 private: 572 private:
572 Block* finally_block_; 573 Block* finally_block_;
573 }; 574 };
574 575
575 576
576 class DebuggerStatement: public Statement { 577 class DebuggerStatement: public Statement {
577 public: 578 public:
578 virtual void Accept(Visitor* v); 579 virtual void Accept(AstVisitor* v);
579 }; 580 };
580 581
581 582
582 class EmptyStatement: public Statement { 583 class EmptyStatement: public Statement {
583 public: 584 public:
584 virtual void Accept(Visitor* v); 585 virtual void Accept(AstVisitor* v);
585 586
586 // Type testing & conversion. 587 // Type testing & conversion.
587 virtual EmptyStatement* AsEmptyStatement() { return this; } 588 virtual EmptyStatement* AsEmptyStatement() { return this; }
588 }; 589 };
589 590
590 591
591 class Literal: public Expression { 592 class Literal: public Expression {
592 public: 593 public:
593 explicit Literal(Handle<Object> handle) : handle_(handle) { } 594 explicit Literal(Handle<Object> handle) : handle_(handle) { }
594 595
595 virtual void Accept(Visitor* v); 596 virtual void Accept(AstVisitor* v);
596 597
597 // Type testing & conversion. 598 // Type testing & conversion.
598 virtual Literal* AsLiteral() { return this; } 599 virtual Literal* AsLiteral() { return this; }
599 600
600 // Check if this literal is identical to the other literal. 601 // Check if this literal is identical to the other literal.
601 bool IsIdenticalTo(const Literal* other) const { 602 bool IsIdenticalTo(const Literal* other) const {
602 return handle_.is_identical_to(other->handle_); 603 return handle_.is_identical_to(other->handle_);
603 } 604 }
604 605
605 // Identity testers. 606 // Identity testers.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 }; 659 };
659 660
660 ObjectLiteral(Handle<FixedArray> constant_properties, 661 ObjectLiteral(Handle<FixedArray> constant_properties,
661 ZoneList<Property*>* properties, 662 ZoneList<Property*>* properties,
662 int literal_index) 663 int literal_index)
663 : MaterializedLiteral(literal_index), 664 : MaterializedLiteral(literal_index),
664 constant_properties_(constant_properties), 665 constant_properties_(constant_properties),
665 properties_(properties) { 666 properties_(properties) {
666 } 667 }
667 668
668 virtual void Accept(Visitor* v); 669 virtual void Accept(AstVisitor* v);
669 670
670 Handle<FixedArray> constant_properties() const { 671 Handle<FixedArray> constant_properties() const {
671 return constant_properties_; 672 return constant_properties_;
672 } 673 }
673 ZoneList<Property*>* properties() const { return properties_; } 674 ZoneList<Property*>* properties() const { return properties_; }
674 675
675 private: 676 private:
676 Handle<FixedArray> constant_properties_; 677 Handle<FixedArray> constant_properties_;
677 ZoneList<Property*>* properties_; 678 ZoneList<Property*>* properties_;
678 }; 679 };
679 680
680 681
681 // Node for capturing a regexp literal. 682 // Node for capturing a regexp literal.
682 class RegExpLiteral: public MaterializedLiteral { 683 class RegExpLiteral: public MaterializedLiteral {
683 public: 684 public:
684 RegExpLiteral(Handle<String> pattern, 685 RegExpLiteral(Handle<String> pattern,
685 Handle<String> flags, 686 Handle<String> flags,
686 int literal_index) 687 int literal_index)
687 : MaterializedLiteral(literal_index), 688 : MaterializedLiteral(literal_index),
688 pattern_(pattern), 689 pattern_(pattern),
689 flags_(flags) {} 690 flags_(flags) {}
690 691
691 virtual void Accept(Visitor* v); 692 virtual void Accept(AstVisitor* v);
692 693
693 Handle<String> pattern() const { return pattern_; } 694 Handle<String> pattern() const { return pattern_; }
694 Handle<String> flags() const { return flags_; } 695 Handle<String> flags() const { return flags_; }
695 696
696 private: 697 private:
697 Handle<String> pattern_; 698 Handle<String> pattern_;
698 Handle<String> flags_; 699 Handle<String> flags_;
699 }; 700 };
700 701
701 // An array literal has a literals object that is used 702 // An array literal has a literals object that is used
702 // used for minimizing the work when contructing it at runtime. 703 // used for minimizing the work when contructing it at runtime.
703 class ArrayLiteral: public Expression { 704 class ArrayLiteral: public Expression {
704 public: 705 public:
705 ArrayLiteral(Handle<FixedArray> literals, 706 ArrayLiteral(Handle<FixedArray> literals,
706 ZoneList<Expression*>* values) 707 ZoneList<Expression*>* values)
707 : literals_(literals), values_(values) { 708 : literals_(literals), values_(values) {
708 } 709 }
709 710
710 virtual void Accept(Visitor* v); 711 virtual void Accept(AstVisitor* v);
711 712
712 Handle<FixedArray> literals() const { return literals_; } 713 Handle<FixedArray> literals() const { return literals_; }
713 ZoneList<Expression*>* values() const { return values_; } 714 ZoneList<Expression*>* values() const { return values_; }
714 715
715 private: 716 private:
716 Handle<FixedArray> literals_; 717 Handle<FixedArray> literals_;
717 ZoneList<Expression*>* values_; 718 ZoneList<Expression*>* values_;
718 }; 719 };
719 720
720 721
721 class VariableProxy: public Expression { 722 class VariableProxy: public Expression {
722 public: 723 public:
723 virtual void Accept(Visitor* v); 724 virtual void Accept(AstVisitor* v);
724 725
725 // Type testing & conversion 726 // Type testing & conversion
726 virtual Property* AsProperty() { 727 virtual Property* AsProperty() {
727 return var_ == NULL ? NULL : var_->AsProperty(); 728 return var_ == NULL ? NULL : var_->AsProperty();
728 } 729 }
729 virtual VariableProxy* AsVariableProxy() { return this; } 730 virtual VariableProxy* AsVariableProxy() { return this; }
730 731
731 Variable* AsVariable() { 732 Variable* AsVariable() {
732 return this == NULL || var_ == NULL ? NULL : var_->AsVariable(); 733 return this == NULL || var_ == NULL ? NULL : var_->AsVariable();
733 } 734 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 // A property in the global object. var()->name() is 810 // A property in the global object. var()->name() is
810 // the property name. 811 // the property name.
811 GLOBAL 812 GLOBAL
812 }; 813 };
813 814
814 Slot(Variable* var, Type type, int index) 815 Slot(Variable* var, Type type, int index)
815 : var_(var), type_(type), index_(index) { 816 : var_(var), type_(type), index_(index) {
816 ASSERT(var != NULL); 817 ASSERT(var != NULL);
817 } 818 }
818 819
819 virtual void Accept(Visitor* v); 820 virtual void Accept(AstVisitor* v);
820 821
821 // Type testing & conversion 822 // Type testing & conversion
822 virtual Slot* AsSlot() { return this; } 823 virtual Slot* AsSlot() { return this; }
823 824
824 // Accessors 825 // Accessors
825 Variable* var() const { return var_; } 826 Variable* var() const { return var_; }
826 Type type() const { return type_; } 827 Type type() const { return type_; }
827 int index() const { return index_; } 828 int index() const { return index_; }
828 829
829 private: 830 private:
830 Variable* var_; 831 Variable* var_;
831 Type type_; 832 Type type_;
832 int index_; 833 int index_;
833 }; 834 };
834 835
835 836
836 class Property: public Expression { 837 class Property: public Expression {
837 public: 838 public:
838 Property(Expression* obj, Expression* key, int pos) 839 Property(Expression* obj, Expression* key, int pos)
839 : obj_(obj), key_(key), pos_(pos) { } 840 : obj_(obj), key_(key), pos_(pos) { }
840 841
841 virtual void Accept(Visitor* v); 842 virtual void Accept(AstVisitor* v);
842 843
843 // Type testing & conversion 844 // Type testing & conversion
844 virtual Property* AsProperty() { return this; } 845 virtual Property* AsProperty() { return this; }
845 846
846 virtual bool IsValidLeftHandSide() { return true; } 847 virtual bool IsValidLeftHandSide() { return true; }
847 848
848 Expression* obj() const { return obj_; } 849 Expression* obj() const { return obj_; }
849 Expression* key() const { return key_; } 850 Expression* key() const { return key_; }
850 int position() const { return pos_; } 851 int position() const { return pos_; }
851 852
852 // Returns a property singleton property access on 'this'. Used 853 // Returns a property singleton property access on 'this'. Used
853 // during preparsing. 854 // during preparsing.
854 static Property* this_property() { return &this_property_; } 855 static Property* this_property() { return &this_property_; }
855 856
856 private: 857 private:
857 Expression* obj_; 858 Expression* obj_;
858 Expression* key_; 859 Expression* key_;
859 int pos_; 860 int pos_;
860 861
861 // Dummy property used during preparsing 862 // Dummy property used during preparsing
862 static Property this_property_; 863 static Property this_property_;
863 }; 864 };
864 865
865 866
866 class Call: public Expression { 867 class Call: public Expression {
867 public: 868 public:
868 Call(Expression* expression, 869 Call(Expression* expression,
869 ZoneList<Expression*>* arguments, 870 ZoneList<Expression*>* arguments,
870 bool is_eval,
871 int pos) 871 int pos)
872 : expression_(expression), 872 : expression_(expression),
873 arguments_(arguments), 873 arguments_(arguments),
874 is_eval_(is_eval),
875 pos_(pos) { } 874 pos_(pos) { }
876 875
877 virtual void Accept(Visitor* v); 876 virtual void Accept(AstVisitor* v);
878 877
879 // Type testing and conversion. 878 // Type testing and conversion.
880 virtual Call* AsCall() { return this; } 879 virtual Call* AsCall() { return this; }
881 880
882 Expression* expression() const { return expression_; } 881 Expression* expression() const { return expression_; }
883 ZoneList<Expression*>* arguments() const { return arguments_; } 882 ZoneList<Expression*>* arguments() const { return arguments_; }
884 bool is_eval() { return is_eval_; }
885 int position() { return pos_; } 883 int position() { return pos_; }
886 884
887 static Call* sentinel() { return &sentinel_; } 885 static Call* sentinel() { return &sentinel_; }
888 886
889 private: 887 private:
890 Expression* expression_; 888 Expression* expression_;
891 ZoneList<Expression*>* arguments_; 889 ZoneList<Expression*>* arguments_;
892 bool is_eval_;
893 int pos_; 890 int pos_;
894 891
895 static Call sentinel_; 892 static Call sentinel_;
896 }; 893 };
897 894
898 895
899 class CallNew: public Call { 896 class CallNew: public Call {
900 public: 897 public:
901 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) 898 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos)
902 : Call(expression, arguments, false, pos) { } 899 : Call(expression, arguments, pos) { }
903 900
904 virtual void Accept(Visitor* v); 901 virtual void Accept(AstVisitor* v);
902 };
903
904
905 // The CallEval class represents a call of the form 'eval(...)' where eval
906 // cannot be seen to be overwritten at compile time. It is potentially a
907 // direct (i.e. not aliased) eval call. The real nature of the call is
908 // determined at runtime.
909 class CallEval: public Call {
910 public:
911 CallEval(Expression* expression, ZoneList<Expression*>* arguments, int pos)
912 : Call(expression, arguments, pos) { }
913
914 virtual void Accept(AstVisitor* v);
915
916 static CallEval* sentinel() { return &sentinel_; }
917
918 private:
919 static CallEval sentinel_;
905 }; 920 };
906 921
907 922
908 // The CallRuntime class does not represent any official JavaScript 923 // The CallRuntime class does not represent any official JavaScript
909 // language construct. Instead it is used to call a C or JS function 924 // language construct. Instead it is used to call a C or JS function
910 // with a set of arguments. This is used from the builtins that are 925 // with a set of arguments. This is used from the builtins that are
911 // implemented in JavaScript (see "v8natives.js"). 926 // implemented in JavaScript (see "v8natives.js").
912 class CallRuntime: public Expression { 927 class CallRuntime: public Expression {
913 public: 928 public:
914 CallRuntime(Handle<String> name, 929 CallRuntime(Handle<String> name,
915 Runtime::Function* function, 930 Runtime::Function* function,
916 ZoneList<Expression*>* arguments) 931 ZoneList<Expression*>* arguments)
917 : name_(name), function_(function), arguments_(arguments) { } 932 : name_(name), function_(function), arguments_(arguments) { }
918 933
919 virtual void Accept(Visitor* v); 934 virtual void Accept(AstVisitor* v);
920 935
921 Handle<String> name() const { return name_; } 936 Handle<String> name() const { return name_; }
922 Runtime::Function* function() const { return function_; } 937 Runtime::Function* function() const { return function_; }
923 ZoneList<Expression*>* arguments() const { return arguments_; } 938 ZoneList<Expression*>* arguments() const { return arguments_; }
924 939
925 private: 940 private:
926 Handle<String> name_; 941 Handle<String> name_;
927 Runtime::Function* function_; 942 Runtime::Function* function_;
928 ZoneList<Expression*>* arguments_; 943 ZoneList<Expression*>* arguments_;
929 }; 944 };
930 945
931 946
932 class UnaryOperation: public Expression { 947 class UnaryOperation: public Expression {
933 public: 948 public:
934 UnaryOperation(Token::Value op, Expression* expression) 949 UnaryOperation(Token::Value op, Expression* expression)
935 : op_(op), expression_(expression) { 950 : op_(op), expression_(expression) {
936 ASSERT(Token::IsUnaryOp(op)); 951 ASSERT(Token::IsUnaryOp(op));
937 } 952 }
938 953
939 virtual void Accept(Visitor* v); 954 virtual void Accept(AstVisitor* v);
940 955
941 // Type testing & conversion 956 // Type testing & conversion
942 virtual UnaryOperation* AsUnaryOperation() { return this; } 957 virtual UnaryOperation* AsUnaryOperation() { return this; }
943 958
944 Token::Value op() const { return op_; } 959 Token::Value op() const { return op_; }
945 Expression* expression() const { return expression_; } 960 Expression* expression() const { return expression_; }
946 961
947 private: 962 private:
948 Token::Value op_; 963 Token::Value op_;
949 Expression* expression_; 964 Expression* expression_;
950 }; 965 };
951 966
952 967
953 class BinaryOperation: public Expression { 968 class BinaryOperation: public Expression {
954 public: 969 public:
955 BinaryOperation(Token::Value op, Expression* left, Expression* right) 970 BinaryOperation(Token::Value op, Expression* left, Expression* right)
956 : op_(op), left_(left), right_(right) { 971 : op_(op), left_(left), right_(right) {
957 ASSERT(Token::IsBinaryOp(op)); 972 ASSERT(Token::IsBinaryOp(op));
958 } 973 }
959 974
960 virtual void Accept(Visitor* v); 975 virtual void Accept(AstVisitor* v);
961 976
962 // Type testing & conversion 977 // Type testing & conversion
963 virtual BinaryOperation* AsBinaryOperation() { return this; } 978 virtual BinaryOperation* AsBinaryOperation() { return this; }
964 979
965 // True iff the result can be safely overwritten (to avoid allocation). 980 // True iff the result can be safely overwritten (to avoid allocation).
966 // False for operations that can return one of their operands. 981 // False for operations that can return one of their operands.
967 bool ResultOverwriteAllowed() { 982 bool ResultOverwriteAllowed() {
968 switch (op_) { 983 switch (op_) {
969 case Token::COMMA: 984 case Token::COMMA:
970 case Token::OR: 985 case Token::OR:
(...skipping 28 matching lines...) Expand all
999 }; 1014 };
1000 1015
1001 1016
1002 class CountOperation: public Expression { 1017 class CountOperation: public Expression {
1003 public: 1018 public:
1004 CountOperation(bool is_prefix, Token::Value op, Expression* expression) 1019 CountOperation(bool is_prefix, Token::Value op, Expression* expression)
1005 : is_prefix_(is_prefix), op_(op), expression_(expression) { 1020 : is_prefix_(is_prefix), op_(op), expression_(expression) {
1006 ASSERT(Token::IsCountOp(op)); 1021 ASSERT(Token::IsCountOp(op));
1007 } 1022 }
1008 1023
1009 virtual void Accept(Visitor* v); 1024 virtual void Accept(AstVisitor* v);
1010 1025
1011 bool is_prefix() const { return is_prefix_; } 1026 bool is_prefix() const { return is_prefix_; }
1012 bool is_postfix() const { return !is_prefix_; } 1027 bool is_postfix() const { return !is_prefix_; }
1013 Token::Value op() const { return op_; } 1028 Token::Value op() const { return op_; }
1014 Expression* expression() const { return expression_; } 1029 Expression* expression() const { return expression_; }
1015 1030
1016 virtual void MarkAsStatement() { is_prefix_ = true; } 1031 virtual void MarkAsStatement() { is_prefix_ = true; }
1017 1032
1018 private: 1033 private:
1019 bool is_prefix_; 1034 bool is_prefix_;
1020 Token::Value op_; 1035 Token::Value op_;
1021 Expression* expression_; 1036 Expression* expression_;
1022 }; 1037 };
1023 1038
1024 1039
1025 class CompareOperation: public Expression { 1040 class CompareOperation: public Expression {
1026 public: 1041 public:
1027 CompareOperation(Token::Value op, Expression* left, Expression* right) 1042 CompareOperation(Token::Value op, Expression* left, Expression* right)
1028 : op_(op), left_(left), right_(right) { 1043 : op_(op), left_(left), right_(right) {
1029 ASSERT(Token::IsCompareOp(op)); 1044 ASSERT(Token::IsCompareOp(op));
1030 } 1045 }
1031 1046
1032 virtual void Accept(Visitor* v); 1047 virtual void Accept(AstVisitor* v);
1033 1048
1034 Token::Value op() const { return op_; } 1049 Token::Value op() const { return op_; }
1035 Expression* left() const { return left_; } 1050 Expression* left() const { return left_; }
1036 Expression* right() const { return right_; } 1051 Expression* right() const { return right_; }
1037 1052
1038 private: 1053 private:
1039 Token::Value op_; 1054 Token::Value op_;
1040 Expression* left_; 1055 Expression* left_;
1041 Expression* right_; 1056 Expression* right_;
1042 }; 1057 };
1043 1058
1044 1059
1045 class Conditional: public Expression { 1060 class Conditional: public Expression {
1046 public: 1061 public:
1047 Conditional(Expression* condition, 1062 Conditional(Expression* condition,
1048 Expression* then_expression, 1063 Expression* then_expression,
1049 Expression* else_expression) 1064 Expression* else_expression)
1050 : condition_(condition), 1065 : condition_(condition),
1051 then_expression_(then_expression), 1066 then_expression_(then_expression),
1052 else_expression_(else_expression) { } 1067 else_expression_(else_expression) { }
1053 1068
1054 virtual void Accept(Visitor* v); 1069 virtual void Accept(AstVisitor* v);
1055 1070
1056 Expression* condition() const { return condition_; } 1071 Expression* condition() const { return condition_; }
1057 Expression* then_expression() const { return then_expression_; } 1072 Expression* then_expression() const { return then_expression_; }
1058 Expression* else_expression() const { return else_expression_; } 1073 Expression* else_expression() const { return else_expression_; }
1059 1074
1060 private: 1075 private:
1061 Expression* condition_; 1076 Expression* condition_;
1062 Expression* then_expression_; 1077 Expression* then_expression_;
1063 Expression* else_expression_; 1078 Expression* else_expression_;
1064 }; 1079 };
1065 1080
1066 1081
1067 class Assignment: public Expression { 1082 class Assignment: public Expression {
1068 public: 1083 public:
1069 Assignment(Token::Value op, Expression* target, Expression* value, int pos) 1084 Assignment(Token::Value op, Expression* target, Expression* value, int pos)
1070 : op_(op), target_(target), value_(value), pos_(pos) { 1085 : op_(op), target_(target), value_(value), pos_(pos) {
1071 ASSERT(Token::IsAssignmentOp(op)); 1086 ASSERT(Token::IsAssignmentOp(op));
1072 } 1087 }
1073 1088
1074 virtual void Accept(Visitor* v); 1089 virtual void Accept(AstVisitor* v);
1075 virtual Assignment* AsAssignment() { return this; } 1090 virtual Assignment* AsAssignment() { return this; }
1076 1091
1077 Token::Value binary_op() const; 1092 Token::Value binary_op() const;
1078 1093
1079 Token::Value op() const { return op_; } 1094 Token::Value op() const { return op_; }
1080 Expression* target() const { return target_; } 1095 Expression* target() const { return target_; }
1081 Expression* value() const { return value_; } 1096 Expression* value() const { return value_; }
1082 int position() { return pos_; } 1097 int position() { return pos_; }
1083 1098
1084 private: 1099 private:
1085 Token::Value op_; 1100 Token::Value op_;
1086 Expression* target_; 1101 Expression* target_;
1087 Expression* value_; 1102 Expression* value_;
1088 int pos_; 1103 int pos_;
1089 }; 1104 };
1090 1105
1091 1106
1092 class Throw: public Expression { 1107 class Throw: public Expression {
1093 public: 1108 public:
1094 Throw(Expression* exception, int pos) 1109 Throw(Expression* exception, int pos)
1095 : exception_(exception), pos_(pos) {} 1110 : exception_(exception), pos_(pos) {}
1096 1111
1097 virtual void Accept(Visitor* v); 1112 virtual void Accept(AstVisitor* v);
1098 Expression* exception() const { return exception_; } 1113 Expression* exception() const { return exception_; }
1099 int position() const { return pos_; } 1114 int position() const { return pos_; }
1100 1115
1101 private: 1116 private:
1102 Expression* exception_; 1117 Expression* exception_;
1103 int pos_; 1118 int pos_;
1104 }; 1119 };
1105 1120
1106 1121
1107 class FunctionLiteral: public Expression { 1122 class FunctionLiteral: public Expression {
(...skipping 15 matching lines...) Expand all
1123 contains_array_literal_(contains_array_literal), 1138 contains_array_literal_(contains_array_literal),
1124 expected_property_count_(expected_property_count), 1139 expected_property_count_(expected_property_count),
1125 num_parameters_(num_parameters), 1140 num_parameters_(num_parameters),
1126 start_position_(start_position), 1141 start_position_(start_position),
1127 end_position_(end_position), 1142 end_position_(end_position),
1128 is_expression_(is_expression), 1143 is_expression_(is_expression),
1129 loop_nesting_(0), 1144 loop_nesting_(0),
1130 function_token_position_(RelocInfo::kNoPosition) { 1145 function_token_position_(RelocInfo::kNoPosition) {
1131 } 1146 }
1132 1147
1133 virtual void Accept(Visitor* v); 1148 virtual void Accept(AstVisitor* v);
1134 1149
1135 // Type testing & conversion 1150 // Type testing & conversion
1136 virtual FunctionLiteral* AsFunctionLiteral() { return this; } 1151 virtual FunctionLiteral* AsFunctionLiteral() { return this; }
1137 1152
1138 Handle<String> name() const { return name_; } 1153 Handle<String> name() const { return name_; }
1139 Scope* scope() const { return scope_; } 1154 Scope* scope() const { return scope_; }
1140 ZoneList<Statement*>* body() const { return body_; } 1155 ZoneList<Statement*>* body() const { return body_; }
1141 void set_function_token_position(int pos) { function_token_position_ = pos; } 1156 void set_function_token_position(int pos) { function_token_position_ = pos; }
1142 int function_token_position() const { return function_token_position_; } 1157 int function_token_position() const { return function_token_position_; }
1143 int start_position() const { return start_position_; } 1158 int start_position() const { return start_position_; }
(...skipping 28 matching lines...) Expand all
1172 1187
1173 class FunctionBoilerplateLiteral: public Expression { 1188 class FunctionBoilerplateLiteral: public Expression {
1174 public: 1189 public:
1175 explicit FunctionBoilerplateLiteral(Handle<JSFunction> boilerplate) 1190 explicit FunctionBoilerplateLiteral(Handle<JSFunction> boilerplate)
1176 : boilerplate_(boilerplate) { 1191 : boilerplate_(boilerplate) {
1177 ASSERT(boilerplate->IsBoilerplate()); 1192 ASSERT(boilerplate->IsBoilerplate());
1178 } 1193 }
1179 1194
1180 Handle<JSFunction> boilerplate() const { return boilerplate_; } 1195 Handle<JSFunction> boilerplate() const { return boilerplate_; }
1181 1196
1182 virtual void Accept(Visitor* v); 1197 virtual void Accept(AstVisitor* v);
1183 1198
1184 private: 1199 private:
1185 Handle<JSFunction> boilerplate_; 1200 Handle<JSFunction> boilerplate_;
1186 }; 1201 };
1187 1202
1188 1203
1189 class ThisFunction: public Expression { 1204 class ThisFunction: public Expression {
1190 public: 1205 public:
1191 virtual void Accept(Visitor* v); 1206 virtual void Accept(AstVisitor* v);
1192 }; 1207 };
1193 1208
1194 1209
1195 // ---------------------------------------------------------------------------- 1210 // ----------------------------------------------------------------------------
1196 // Regular expressions 1211 // Regular expressions
1197 1212
1198 1213
1199 class RegExpTree: public ZoneObject { 1214 class RegExpTree: public ZoneObject {
1200 public: 1215 public:
1201 virtual ~RegExpTree() { } 1216 virtual ~RegExpTree() { }
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1458 virtual void* Visit##Name(RegExp##Name*, void* data) = 0; 1473 virtual void* Visit##Name(RegExp##Name*, void* data) = 0;
1459 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) 1474 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
1460 #undef MAKE_CASE 1475 #undef MAKE_CASE
1461 }; 1476 };
1462 1477
1463 1478
1464 // ---------------------------------------------------------------------------- 1479 // ----------------------------------------------------------------------------
1465 // Basic visitor 1480 // Basic visitor
1466 // - leaf node visitors are abstract. 1481 // - leaf node visitors are abstract.
1467 1482
1468 class Visitor BASE_EMBEDDED { 1483 class AstVisitor BASE_EMBEDDED {
1469 public: 1484 public:
1470 Visitor() : stack_overflow_(false) { } 1485 AstVisitor() : stack_overflow_(false) { }
1471 virtual ~Visitor() { } 1486 virtual ~AstVisitor() { }
1472 1487
1473 // Dispatch 1488 // Dispatch
1474 void Visit(Node* node) { node->Accept(this); } 1489 void Visit(Node* node) { node->Accept(this); }
1475 1490
1476 // Iteration 1491 // Iteration
1477 virtual void VisitStatements(ZoneList<Statement*>* statements); 1492 virtual void VisitStatements(ZoneList<Statement*>* statements);
1478 virtual void VisitExpressions(ZoneList<Expression*>* expressions); 1493 virtual void VisitExpressions(ZoneList<Expression*>* expressions);
1479 1494
1480 // Stack overflow tracking support. 1495 // Stack overflow tracking support.
1481 bool HasStackOverflow() const { return stack_overflow_; } 1496 bool HasStackOverflow() const { return stack_overflow_; }
(...skipping 17 matching lines...) Expand all
1499 #undef DEF_VISIT 1514 #undef DEF_VISIT
1500 1515
1501 private: 1516 private:
1502 bool stack_overflow_; 1517 bool stack_overflow_;
1503 }; 1518 };
1504 1519
1505 1520
1506 } } // namespace v8::internal 1521 } } // namespace v8::internal
1507 1522
1508 #endif // V8_AST_H_ 1523 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/codegen-arm.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698