OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 V(Assignment) \ | 85 V(Assignment) \ |
86 V(Throw) \ | 86 V(Throw) \ |
87 V(Property) \ | 87 V(Property) \ |
88 V(Call) \ | 88 V(Call) \ |
89 V(CallNew) \ | 89 V(CallNew) \ |
90 V(CallRuntime) \ | 90 V(CallRuntime) \ |
91 V(UnaryOperation) \ | 91 V(UnaryOperation) \ |
92 V(CountOperation) \ | 92 V(CountOperation) \ |
93 V(BinaryOperation) \ | 93 V(BinaryOperation) \ |
94 V(CompareOperation) \ | 94 V(CompareOperation) \ |
| 95 V(CompareToNull) \ |
95 V(ThisFunction) | 96 V(ThisFunction) |
96 | 97 |
97 #define AST_NODE_LIST(V) \ | 98 #define AST_NODE_LIST(V) \ |
98 V(Declaration) \ | 99 V(Declaration) \ |
99 STATEMENT_NODE_LIST(V) \ | 100 STATEMENT_NODE_LIST(V) \ |
100 EXPRESSION_NODE_LIST(V) | 101 EXPRESSION_NODE_LIST(V) |
101 | 102 |
102 // Forward declarations | 103 // Forward declarations |
103 class TargetCollector; | 104 class TargetCollector; |
104 class MaterializedLiteral; | 105 class MaterializedLiteral; |
105 class DefinitionInfo; | 106 class DefinitionInfo; |
106 class BitVector; | 107 class BitVector; |
107 | 108 |
108 #define DEF_FORWARD_DECLARATION(type) class type; | 109 #define DEF_FORWARD_DECLARATION(type) class type; |
109 AST_NODE_LIST(DEF_FORWARD_DECLARATION) | 110 AST_NODE_LIST(DEF_FORWARD_DECLARATION) |
110 #undef DEF_FORWARD_DECLARATION | 111 #undef DEF_FORWARD_DECLARATION |
111 | 112 |
112 | 113 |
113 // Typedef only introduced to avoid unreadable code. | 114 // Typedef only introduced to avoid unreadable code. |
114 // Please do appreciate the required space in "> >". | 115 // Please do appreciate the required space in "> >". |
115 typedef ZoneList<Handle<String> > ZoneStringList; | 116 typedef ZoneList<Handle<String> > ZoneStringList; |
116 typedef ZoneList<Handle<Object> > ZoneObjectList; | 117 typedef ZoneList<Handle<Object> > ZoneObjectList; |
117 | 118 |
118 | 119 |
119 class AstNode: public ZoneObject { | 120 class AstNode: public ZoneObject { |
120 public: | 121 public: |
121 static const int kNoNumber = -1; | |
122 | |
123 AstNode() : num_(kNoNumber) {} | |
124 | |
125 explicit AstNode(AstNode* other); | |
126 | |
127 virtual ~AstNode() { } | 122 virtual ~AstNode() { } |
128 virtual void Accept(AstVisitor* v) = 0; | 123 virtual void Accept(AstVisitor* v) = 0; |
129 | 124 |
130 // Type testing & conversion. | 125 // Type testing & conversion. |
131 virtual Statement* AsStatement() { return NULL; } | 126 virtual Statement* AsStatement() { return NULL; } |
132 virtual Block* AsBlock() { return NULL; } | 127 virtual Block* AsBlock() { return NULL; } |
133 virtual ExpressionStatement* AsExpressionStatement() { return NULL; } | 128 virtual ExpressionStatement* AsExpressionStatement() { return NULL; } |
134 virtual EmptyStatement* AsEmptyStatement() { return NULL; } | 129 virtual EmptyStatement* AsEmptyStatement() { return NULL; } |
135 virtual Expression* AsExpression() { return NULL; } | 130 virtual Expression* AsExpression() { return NULL; } |
136 virtual Literal* AsLiteral() { return NULL; } | 131 virtual Literal* AsLiteral() { return NULL; } |
137 virtual Slot* AsSlot() { return NULL; } | 132 virtual Slot* AsSlot() { return NULL; } |
138 virtual VariableProxy* AsVariableProxy() { return NULL; } | 133 virtual VariableProxy* AsVariableProxy() { return NULL; } |
139 virtual Property* AsProperty() { return NULL; } | 134 virtual Property* AsProperty() { return NULL; } |
140 virtual Call* AsCall() { return NULL; } | 135 virtual Call* AsCall() { return NULL; } |
141 virtual TargetCollector* AsTargetCollector() { return NULL; } | 136 virtual TargetCollector* AsTargetCollector() { return NULL; } |
142 virtual BreakableStatement* AsBreakableStatement() { return NULL; } | 137 virtual BreakableStatement* AsBreakableStatement() { return NULL; } |
143 virtual IterationStatement* AsIterationStatement() { return NULL; } | 138 virtual IterationStatement* AsIterationStatement() { return NULL; } |
144 virtual ForStatement* AsForStatement() { return NULL; } | 139 virtual ForStatement* AsForStatement() { return NULL; } |
145 virtual UnaryOperation* AsUnaryOperation() { return NULL; } | 140 virtual UnaryOperation* AsUnaryOperation() { return NULL; } |
146 virtual CountOperation* AsCountOperation() { return NULL; } | 141 virtual CountOperation* AsCountOperation() { return NULL; } |
147 virtual BinaryOperation* AsBinaryOperation() { return NULL; } | 142 virtual BinaryOperation* AsBinaryOperation() { return NULL; } |
148 virtual Assignment* AsAssignment() { return NULL; } | 143 virtual Assignment* AsAssignment() { return NULL; } |
149 virtual FunctionLiteral* AsFunctionLiteral() { return NULL; } | 144 virtual FunctionLiteral* AsFunctionLiteral() { return NULL; } |
150 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } | 145 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
151 virtual ObjectLiteral* AsObjectLiteral() { return NULL; } | 146 virtual ObjectLiteral* AsObjectLiteral() { return NULL; } |
152 virtual ArrayLiteral* AsArrayLiteral() { return NULL; } | 147 virtual ArrayLiteral* AsArrayLiteral() { return NULL; } |
153 virtual CompareOperation* AsCompareOperation() { return NULL; } | 148 virtual CompareOperation* AsCompareOperation() { return NULL; } |
154 | |
155 // True if the AST node is critical (its execution is needed or externally | |
156 // visible in some way). | |
157 virtual bool IsCritical() { | |
158 UNREACHABLE(); | |
159 return true; | |
160 } | |
161 | |
162 int num() { return num_; } | |
163 void set_num(int n) { num_ = n; } | |
164 | |
165 private: | |
166 // Support for ast node numbering. | |
167 int num_; | |
168 }; | 149 }; |
169 | 150 |
170 | 151 |
171 class Statement: public AstNode { | 152 class Statement: public AstNode { |
172 public: | 153 public: |
173 Statement() : statement_pos_(RelocInfo::kNoPosition) {} | 154 Statement() : statement_pos_(RelocInfo::kNoPosition) {} |
174 | 155 |
175 explicit Statement(Statement* other); | |
176 | |
177 virtual Statement* AsStatement() { return this; } | 156 virtual Statement* AsStatement() { return this; } |
178 virtual ReturnStatement* AsReturnStatement() { return NULL; } | 157 virtual ReturnStatement* AsReturnStatement() { return NULL; } |
179 | 158 |
180 virtual Assignment* StatementAsSimpleAssignment() { return NULL; } | 159 virtual Assignment* StatementAsSimpleAssignment() { return NULL; } |
181 virtual CountOperation* StatementAsCountOperation() { return NULL; } | 160 virtual CountOperation* StatementAsCountOperation() { return NULL; } |
182 | 161 |
183 bool IsEmpty() { return AsEmptyStatement() != NULL; } | 162 bool IsEmpty() { return AsEmptyStatement() != NULL; } |
184 | 163 |
185 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } | 164 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } |
186 int statement_pos() const { return statement_pos_; } | 165 int statement_pos() const { return statement_pos_; } |
(...skipping 12 matching lines...) Expand all Loading... |
199 // Evaluated for its side effects. | 178 // Evaluated for its side effects. |
200 kEffect, | 179 kEffect, |
201 // Evaluated for its value (and side effects). | 180 // Evaluated for its value (and side effects). |
202 kValue, | 181 kValue, |
203 // Evaluated for control flow (and side effects). | 182 // Evaluated for control flow (and side effects). |
204 kTest | 183 kTest |
205 }; | 184 }; |
206 | 185 |
207 Expression() : bitfields_(0) {} | 186 Expression() : bitfields_(0) {} |
208 | 187 |
209 explicit Expression(Expression* other); | |
210 | |
211 virtual Expression* AsExpression() { return this; } | 188 virtual Expression* AsExpression() { return this; } |
212 | 189 |
| 190 virtual bool IsTrivial() { return false; } |
213 virtual bool IsValidLeftHandSide() { return false; } | 191 virtual bool IsValidLeftHandSide() { return false; } |
214 | 192 |
215 virtual Variable* AssignedVariable() { return NULL; } | |
216 | |
217 // Symbols that cannot be parsed as array indices are considered property | 193 // Symbols that cannot be parsed as array indices are considered property |
218 // names. We do not treat symbols that can be array indexes as property | 194 // names. We do not treat symbols that can be array indexes as property |
219 // names because [] for string objects is handled only by keyed ICs. | 195 // names because [] for string objects is handled only by keyed ICs. |
220 virtual bool IsPropertyName() { return false; } | 196 virtual bool IsPropertyName() { return false; } |
221 | 197 |
222 // True if the expression does not have (evaluated) subexpressions. | |
223 // Function literals are leaves because their subexpressions are not | |
224 // evaluated. | |
225 virtual bool IsLeaf() { return false; } | |
226 | |
227 // True if the expression has no side effects and is safe to | |
228 // evaluate out of order. | |
229 virtual bool IsTrivial() { return false; } | |
230 | |
231 // True if the expression always has one of the non-Object JS types | |
232 // (Undefined, Null, Boolean, String, or Number). | |
233 virtual bool IsPrimitive() = 0; | |
234 | |
235 // Mark the expression as being compiled as an expression | 198 // Mark the expression as being compiled as an expression |
236 // statement. This is used to transform postfix increments to | 199 // statement. This is used to transform postfix increments to |
237 // (faster) prefix increments. | 200 // (faster) prefix increments. |
238 virtual void MarkAsStatement() { /* do nothing */ } | 201 virtual void MarkAsStatement() { /* do nothing */ } |
239 | 202 |
240 // Static type information for this expression. | 203 // Static type information for this expression. |
241 StaticType* type() { return &type_; } | 204 StaticType* type() { return &type_; } |
242 | 205 |
243 // True if the expression is a loop condition. | 206 // True if the expression is a loop condition. |
244 bool is_loop_condition() const { | 207 bool is_loop_condition() const { |
245 return LoopConditionField::decode(bitfields_); | 208 return LoopConditionField::decode(bitfields_); |
246 } | 209 } |
247 void set_is_loop_condition(bool flag) { | 210 void set_is_loop_condition(bool flag) { |
248 bitfields_ = (bitfields_ & ~LoopConditionField::mask()) | | 211 bitfields_ = (bitfields_ & ~LoopConditionField::mask()) | |
249 LoopConditionField::encode(flag); | 212 LoopConditionField::encode(flag); |
250 } | 213 } |
251 | 214 |
252 // The value of the expression is guaranteed to be a smi, because the | 215 // The value of the expression is guaranteed to be a smi, because the |
253 // top operation is a bit operation with a mask, or a shift. | 216 // top operation is a bit operation with a mask, or a shift. |
254 bool GuaranteedSmiResult(); | 217 bool GuaranteedSmiResult(); |
255 | 218 |
256 // AST analysis results | 219 // AST analysis results. |
| 220 void CopyAnalysisResultsFrom(Expression* other); |
257 | 221 |
258 // True if the expression rooted at this node can be compiled by the | 222 // True if the expression rooted at this node can be compiled by the |
259 // side-effect free compiler. | 223 // side-effect free compiler. |
260 bool side_effect_free() { return SideEffectFreeField::decode(bitfields_); } | 224 bool side_effect_free() { return SideEffectFreeField::decode(bitfields_); } |
261 void set_side_effect_free(bool is_side_effect_free) { | 225 void set_side_effect_free(bool is_side_effect_free) { |
262 bitfields_ &= ~SideEffectFreeField::mask(); | 226 bitfields_ &= ~SideEffectFreeField::mask(); |
263 bitfields_ |= SideEffectFreeField::encode(is_side_effect_free); | 227 bitfields_ |= SideEffectFreeField::encode(is_side_effect_free); |
264 } | 228 } |
265 | 229 |
266 // Will the use of this expression treat -0 the same as 0 in all cases? | 230 // Will the use of this expression treat -0 the same as 0 in all cases? |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 * A sentinel used during pre parsing that represents some expression | 271 * A sentinel used during pre parsing that represents some expression |
308 * that is a valid left hand side without having to actually build | 272 * that is a valid left hand side without having to actually build |
309 * the expression. | 273 * the expression. |
310 */ | 274 */ |
311 class ValidLeftHandSideSentinel: public Expression { | 275 class ValidLeftHandSideSentinel: public Expression { |
312 public: | 276 public: |
313 virtual bool IsValidLeftHandSide() { return true; } | 277 virtual bool IsValidLeftHandSide() { return true; } |
314 virtual void Accept(AstVisitor* v) { UNREACHABLE(); } | 278 virtual void Accept(AstVisitor* v) { UNREACHABLE(); } |
315 static ValidLeftHandSideSentinel* instance() { return &instance_; } | 279 static ValidLeftHandSideSentinel* instance() { return &instance_; } |
316 | 280 |
317 virtual bool IsPrimitive() { | |
318 UNREACHABLE(); | |
319 return false; | |
320 } | |
321 | |
322 private: | 281 private: |
323 static ValidLeftHandSideSentinel instance_; | 282 static ValidLeftHandSideSentinel instance_; |
324 }; | 283 }; |
325 | 284 |
326 | 285 |
327 class BreakableStatement: public Statement { | 286 class BreakableStatement: public Statement { |
328 public: | 287 public: |
329 enum Type { | 288 enum Type { |
330 TARGET_FOR_ANONYMOUS, | 289 TARGET_FOR_ANONYMOUS, |
331 TARGET_FOR_NAMED_ONLY | 290 TARGET_FOR_NAMED_ONLY |
332 }; | 291 }; |
333 | 292 |
334 // The labels associated with this statement. May be NULL; | 293 // The labels associated with this statement. May be NULL; |
335 // if it is != NULL, guaranteed to contain at least one entry. | 294 // if it is != NULL, guaranteed to contain at least one entry. |
336 ZoneStringList* labels() const { return labels_; } | 295 ZoneStringList* labels() const { return labels_; } |
337 | 296 |
338 // Type testing & conversion. | 297 // Type testing & conversion. |
339 virtual BreakableStatement* AsBreakableStatement() { return this; } | 298 virtual BreakableStatement* AsBreakableStatement() { return this; } |
340 | 299 |
341 // Code generation | 300 // Code generation |
342 BreakTarget* break_target() { return &break_target_; } | 301 BreakTarget* break_target() { return &break_target_; } |
343 | 302 |
344 // Testers. | 303 // Testers. |
345 bool is_target_for_anonymous() const { return type_ == TARGET_FOR_ANONYMOUS; } | 304 bool is_target_for_anonymous() const { return type_ == TARGET_FOR_ANONYMOUS; } |
346 | 305 |
347 protected: | 306 protected: |
348 inline BreakableStatement(ZoneStringList* labels, Type type); | 307 inline BreakableStatement(ZoneStringList* labels, Type type); |
349 | 308 |
350 explicit BreakableStatement(BreakableStatement* other); | |
351 | |
352 private: | 309 private: |
353 ZoneStringList* labels_; | 310 ZoneStringList* labels_; |
354 Type type_; | 311 Type type_; |
355 BreakTarget break_target_; | 312 BreakTarget break_target_; |
356 }; | 313 }; |
357 | 314 |
358 | 315 |
359 class Block: public BreakableStatement { | 316 class Block: public BreakableStatement { |
360 public: | 317 public: |
361 inline Block(ZoneStringList* labels, int capacity, bool is_initializer_block); | 318 inline Block(ZoneStringList* labels, int capacity, bool is_initializer_block); |
362 | 319 |
363 // Construct a clone initialized from the original block and | |
364 // a deep copy of all statements of the original block. | |
365 Block(Block* other, ZoneList<Statement*>* statements); | |
366 | |
367 virtual void Accept(AstVisitor* v); | 320 virtual void Accept(AstVisitor* v); |
368 | 321 |
369 virtual Block* AsBlock() { return this; } | 322 virtual Block* AsBlock() { return this; } |
370 | 323 |
371 virtual Assignment* StatementAsSimpleAssignment() { | 324 virtual Assignment* StatementAsSimpleAssignment() { |
372 if (statements_.length() != 1) return NULL; | 325 if (statements_.length() != 1) return NULL; |
373 return statements_[0]->StatementAsSimpleAssignment(); | 326 return statements_[0]->StatementAsSimpleAssignment(); |
374 } | 327 } |
375 | 328 |
376 virtual CountOperation* StatementAsCountOperation() { | 329 virtual CountOperation* StatementAsCountOperation() { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 | 373 |
421 Statement* body() const { return body_; } | 374 Statement* body() const { return body_; } |
422 void set_body(Statement* stmt) { body_ = stmt; } | 375 void set_body(Statement* stmt) { body_ = stmt; } |
423 | 376 |
424 // Code generation | 377 // Code generation |
425 BreakTarget* continue_target() { return &continue_target_; } | 378 BreakTarget* continue_target() { return &continue_target_; } |
426 | 379 |
427 protected: | 380 protected: |
428 explicit inline IterationStatement(ZoneStringList* labels); | 381 explicit inline IterationStatement(ZoneStringList* labels); |
429 | 382 |
430 // Construct a clone initialized from original and | |
431 // a deep copy of the original body. | |
432 IterationStatement(IterationStatement* other, Statement* body); | |
433 | |
434 void Initialize(Statement* body) { | 383 void Initialize(Statement* body) { |
435 body_ = body; | 384 body_ = body; |
436 } | 385 } |
437 | 386 |
438 private: | 387 private: |
439 Statement* body_; | 388 Statement* body_; |
440 BreakTarget continue_target_; | 389 BreakTarget continue_target_; |
441 }; | 390 }; |
442 | 391 |
443 | 392 |
(...skipping 29 matching lines...) Expand all Loading... |
473 IterationStatement::Initialize(body); | 422 IterationStatement::Initialize(body); |
474 cond_ = cond; | 423 cond_ = cond; |
475 } | 424 } |
476 | 425 |
477 virtual void Accept(AstVisitor* v); | 426 virtual void Accept(AstVisitor* v); |
478 | 427 |
479 Expression* cond() const { return cond_; } | 428 Expression* cond() const { return cond_; } |
480 bool may_have_function_literal() const { | 429 bool may_have_function_literal() const { |
481 return may_have_function_literal_; | 430 return may_have_function_literal_; |
482 } | 431 } |
| 432 void set_may_have_function_literal(bool value) { |
| 433 may_have_function_literal_ = value; |
| 434 } |
483 | 435 |
484 private: | 436 private: |
485 Expression* cond_; | 437 Expression* cond_; |
486 // True if there is a function literal subexpression in the condition. | 438 // True if there is a function literal subexpression in the condition. |
487 bool may_have_function_literal_; | 439 bool may_have_function_literal_; |
488 | |
489 friend class AstOptimizer; | |
490 }; | 440 }; |
491 | 441 |
492 | 442 |
493 class ForStatement: public IterationStatement { | 443 class ForStatement: public IterationStatement { |
494 public: | 444 public: |
495 explicit inline ForStatement(ZoneStringList* labels); | 445 explicit inline ForStatement(ZoneStringList* labels); |
496 | 446 |
497 // Construct a for-statement initialized from another for-statement | |
498 // and deep copies of all parts of the original statement. | |
499 ForStatement(ForStatement* other, | |
500 Statement* init, | |
501 Expression* cond, | |
502 Statement* next, | |
503 Statement* body); | |
504 | |
505 virtual ForStatement* AsForStatement() { return this; } | 447 virtual ForStatement* AsForStatement() { return this; } |
506 | 448 |
507 void Initialize(Statement* init, | 449 void Initialize(Statement* init, |
508 Expression* cond, | 450 Expression* cond, |
509 Statement* next, | 451 Statement* next, |
510 Statement* body) { | 452 Statement* body) { |
511 IterationStatement::Initialize(body); | 453 IterationStatement::Initialize(body); |
512 init_ = init; | 454 init_ = init; |
513 cond_ = cond; | 455 cond_ = cond; |
514 next_ = next; | 456 next_ = next; |
515 } | 457 } |
516 | 458 |
517 virtual void Accept(AstVisitor* v); | 459 virtual void Accept(AstVisitor* v); |
518 | 460 |
519 Statement* init() const { return init_; } | 461 Statement* init() const { return init_; } |
520 void set_init(Statement* stmt) { init_ = stmt; } | 462 void set_init(Statement* stmt) { init_ = stmt; } |
521 Expression* cond() const { return cond_; } | 463 Expression* cond() const { return cond_; } |
522 void set_cond(Expression* expr) { cond_ = expr; } | 464 void set_cond(Expression* expr) { cond_ = expr; } |
523 Statement* next() const { return next_; } | 465 Statement* next() const { return next_; } |
524 void set_next(Statement* stmt) { next_ = stmt; } | 466 void set_next(Statement* stmt) { next_ = stmt; } |
| 467 |
525 bool may_have_function_literal() const { | 468 bool may_have_function_literal() const { |
526 return may_have_function_literal_; | 469 return may_have_function_literal_; |
527 } | 470 } |
| 471 void set_may_have_function_literal(bool value) { |
| 472 may_have_function_literal_ = value; |
| 473 } |
528 | 474 |
529 bool is_fast_smi_loop() { return loop_variable_ != NULL; } | 475 bool is_fast_smi_loop() { return loop_variable_ != NULL; } |
530 Variable* loop_variable() { return loop_variable_; } | 476 Variable* loop_variable() { return loop_variable_; } |
531 void set_loop_variable(Variable* var) { loop_variable_ = var; } | 477 void set_loop_variable(Variable* var) { loop_variable_ = var; } |
532 | 478 |
533 bool peel_this_loop() { return peel_this_loop_; } | |
534 void set_peel_this_loop(bool b) { peel_this_loop_ = b; } | |
535 | |
536 private: | 479 private: |
537 Statement* init_; | 480 Statement* init_; |
538 Expression* cond_; | 481 Expression* cond_; |
539 Statement* next_; | 482 Statement* next_; |
540 // True if there is a function literal subexpression in the condition. | 483 // True if there is a function literal subexpression in the condition. |
541 bool may_have_function_literal_; | 484 bool may_have_function_literal_; |
542 Variable* loop_variable_; | 485 Variable* loop_variable_; |
543 bool peel_this_loop_; | |
544 | |
545 friend class AstOptimizer; | |
546 }; | 486 }; |
547 | 487 |
548 | 488 |
549 class ForInStatement: public IterationStatement { | 489 class ForInStatement: public IterationStatement { |
550 public: | 490 public: |
551 explicit inline ForInStatement(ZoneStringList* labels); | 491 explicit inline ForInStatement(ZoneStringList* labels); |
552 | 492 |
553 void Initialize(Expression* each, Expression* enumerable, Statement* body) { | 493 void Initialize(Expression* each, Expression* enumerable, Statement* body) { |
554 IterationStatement::Initialize(body); | 494 IterationStatement::Initialize(body); |
555 each_ = each; | 495 each_ = each; |
556 enumerable_ = enumerable; | 496 enumerable_ = enumerable; |
557 } | 497 } |
558 | 498 |
559 virtual void Accept(AstVisitor* v); | 499 virtual void Accept(AstVisitor* v); |
560 | 500 |
561 Expression* each() const { return each_; } | 501 Expression* each() const { return each_; } |
562 Expression* enumerable() const { return enumerable_; } | 502 Expression* enumerable() const { return enumerable_; } |
563 | 503 |
564 private: | 504 private: |
565 Expression* each_; | 505 Expression* each_; |
566 Expression* enumerable_; | 506 Expression* enumerable_; |
567 }; | 507 }; |
568 | 508 |
569 | 509 |
570 class ExpressionStatement: public Statement { | 510 class ExpressionStatement: public Statement { |
571 public: | 511 public: |
572 explicit ExpressionStatement(Expression* expression) | 512 explicit ExpressionStatement(Expression* expression) |
573 : expression_(expression) { } | 513 : expression_(expression) { } |
574 | 514 |
575 // Construct an expression statement initialized from another | |
576 // expression statement and a deep copy of the original expression. | |
577 ExpressionStatement(ExpressionStatement* other, Expression* expression); | |
578 | |
579 virtual void Accept(AstVisitor* v); | 515 virtual void Accept(AstVisitor* v); |
580 | 516 |
581 // Type testing & conversion. | 517 // Type testing & conversion. |
582 virtual ExpressionStatement* AsExpressionStatement() { return this; } | 518 virtual ExpressionStatement* AsExpressionStatement() { return this; } |
583 | 519 |
584 virtual Assignment* StatementAsSimpleAssignment(); | 520 virtual Assignment* StatementAsSimpleAssignment(); |
585 virtual CountOperation* StatementAsCountOperation(); | 521 virtual CountOperation* StatementAsCountOperation(); |
586 | 522 |
587 void set_expression(Expression* e) { expression_ = e; } | 523 void set_expression(Expression* e) { expression_ = e; } |
588 Expression* expression() { return expression_; } | 524 Expression* expression() { return expression_; } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 // given if-statement has a then- or an else-part containing code. | 644 // given if-statement has a then- or an else-part containing code. |
709 class IfStatement: public Statement { | 645 class IfStatement: public Statement { |
710 public: | 646 public: |
711 IfStatement(Expression* condition, | 647 IfStatement(Expression* condition, |
712 Statement* then_statement, | 648 Statement* then_statement, |
713 Statement* else_statement) | 649 Statement* else_statement) |
714 : condition_(condition), | 650 : condition_(condition), |
715 then_statement_(then_statement), | 651 then_statement_(then_statement), |
716 else_statement_(else_statement) { } | 652 else_statement_(else_statement) { } |
717 | 653 |
718 // Construct an if-statement initialized from another if-statement | |
719 // and deep copies of all parts of the original. | |
720 IfStatement(IfStatement* other, | |
721 Expression* condition, | |
722 Statement* then_statement, | |
723 Statement* else_statement); | |
724 | |
725 virtual void Accept(AstVisitor* v); | 654 virtual void Accept(AstVisitor* v); |
726 | 655 |
727 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } | 656 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } |
728 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } | 657 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } |
729 | 658 |
730 Expression* condition() const { return condition_; } | 659 Expression* condition() const { return condition_; } |
731 Statement* then_statement() const { return then_statement_; } | 660 Statement* then_statement() const { return then_statement_; } |
732 void set_then_statement(Statement* stmt) { then_statement_ = stmt; } | 661 void set_then_statement(Statement* stmt) { then_statement_ = stmt; } |
733 Statement* else_statement() const { return else_statement_; } | 662 Statement* else_statement() const { return else_statement_; } |
734 void set_else_statement(Statement* stmt) { else_statement_ = stmt; } | 663 void set_else_statement(Statement* stmt) { else_statement_ = stmt; } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 class DebuggerStatement: public Statement { | 750 class DebuggerStatement: public Statement { |
822 public: | 751 public: |
823 virtual void Accept(AstVisitor* v); | 752 virtual void Accept(AstVisitor* v); |
824 }; | 753 }; |
825 | 754 |
826 | 755 |
827 class EmptyStatement: public Statement { | 756 class EmptyStatement: public Statement { |
828 public: | 757 public: |
829 EmptyStatement() {} | 758 EmptyStatement() {} |
830 | 759 |
831 explicit EmptyStatement(EmptyStatement* other); | |
832 | |
833 virtual void Accept(AstVisitor* v); | 760 virtual void Accept(AstVisitor* v); |
834 | 761 |
835 // Type testing & conversion. | 762 // Type testing & conversion. |
836 virtual EmptyStatement* AsEmptyStatement() { return this; } | 763 virtual EmptyStatement* AsEmptyStatement() { return this; } |
837 }; | 764 }; |
838 | 765 |
839 | 766 |
840 class Literal: public Expression { | 767 class Literal: public Expression { |
841 public: | 768 public: |
842 explicit Literal(Handle<Object> handle) : handle_(handle) { } | 769 explicit Literal(Handle<Object> handle) : handle_(handle) { } |
843 | 770 |
844 virtual void Accept(AstVisitor* v); | 771 virtual void Accept(AstVisitor* v); |
| 772 virtual bool IsTrivial() { return true; } |
845 | 773 |
846 // Type testing & conversion. | 774 // Type testing & conversion. |
847 virtual Literal* AsLiteral() { return this; } | 775 virtual Literal* AsLiteral() { return this; } |
848 | 776 |
849 // Check if this literal is identical to the other literal. | 777 // Check if this literal is identical to the other literal. |
850 bool IsIdenticalTo(const Literal* other) const { | 778 bool IsIdenticalTo(const Literal* other) const { |
851 return handle_.is_identical_to(other->handle_); | 779 return handle_.is_identical_to(other->handle_); |
852 } | 780 } |
853 | 781 |
854 virtual bool IsPropertyName() { | 782 virtual bool IsPropertyName() { |
855 if (handle_->IsSymbol()) { | 783 if (handle_->IsSymbol()) { |
856 uint32_t ignored; | 784 uint32_t ignored; |
857 return !String::cast(*handle_)->AsArrayIndex(&ignored); | 785 return !String::cast(*handle_)->AsArrayIndex(&ignored); |
858 } | 786 } |
859 return false; | 787 return false; |
860 } | 788 } |
861 | 789 |
862 virtual bool IsLeaf() { return true; } | |
863 virtual bool IsTrivial() { return true; } | |
864 virtual bool IsPrimitive(); | |
865 virtual bool IsCritical(); | |
866 | |
867 // Identity testers. | 790 // Identity testers. |
868 bool IsNull() const { return handle_.is_identical_to(Factory::null_value()); } | 791 bool IsNull() const { return handle_.is_identical_to(Factory::null_value()); } |
869 bool IsTrue() const { return handle_.is_identical_to(Factory::true_value()); } | 792 bool IsTrue() const { return handle_.is_identical_to(Factory::true_value()); } |
870 bool IsFalse() const { | 793 bool IsFalse() const { |
871 return handle_.is_identical_to(Factory::false_value()); | 794 return handle_.is_identical_to(Factory::false_value()); |
872 } | 795 } |
873 | 796 |
874 Handle<Object> handle() const { return handle_; } | 797 Handle<Object> handle() const { return handle_; } |
875 | 798 |
876 private: | 799 private: |
(...skipping 26 matching lines...) Expand all Loading... |
903 | 826 |
904 // An object literal has a boilerplate object that is used | 827 // An object literal has a boilerplate object that is used |
905 // for minimizing the work when constructing it at runtime. | 828 // for minimizing the work when constructing it at runtime. |
906 class ObjectLiteral: public MaterializedLiteral { | 829 class ObjectLiteral: public MaterializedLiteral { |
907 public: | 830 public: |
908 // Property is used for passing information | 831 // Property is used for passing information |
909 // about an object literal's properties from the parser | 832 // about an object literal's properties from the parser |
910 // to the code generator. | 833 // to the code generator. |
911 class Property: public ZoneObject { | 834 class Property: public ZoneObject { |
912 public: | 835 public: |
913 | |
914 enum Kind { | 836 enum Kind { |
915 CONSTANT, // Property with constant value (compile time). | 837 CONSTANT, // Property with constant value (compile time). |
916 COMPUTED, // Property with computed value (execution time). | 838 COMPUTED, // Property with computed value (execution time). |
917 MATERIALIZED_LITERAL, // Property value is a materialized literal. | 839 MATERIALIZED_LITERAL, // Property value is a materialized literal. |
918 GETTER, SETTER, // Property is an accessor function. | 840 GETTER, SETTER, // Property is an accessor function. |
919 PROTOTYPE // Property is __proto__. | 841 PROTOTYPE // Property is __proto__. |
920 }; | 842 }; |
921 | 843 |
922 Property(Literal* key, Expression* value); | 844 Property(Literal* key, Expression* value); |
923 Property(bool is_getter, FunctionLiteral* value); | 845 Property(bool is_getter, FunctionLiteral* value); |
(...skipping 17 matching lines...) Expand all Loading... |
941 bool fast_elements, | 863 bool fast_elements, |
942 int depth) | 864 int depth) |
943 : MaterializedLiteral(literal_index, is_simple, depth), | 865 : MaterializedLiteral(literal_index, is_simple, depth), |
944 constant_properties_(constant_properties), | 866 constant_properties_(constant_properties), |
945 properties_(properties), | 867 properties_(properties), |
946 fast_elements_(fast_elements) {} | 868 fast_elements_(fast_elements) {} |
947 | 869 |
948 virtual ObjectLiteral* AsObjectLiteral() { return this; } | 870 virtual ObjectLiteral* AsObjectLiteral() { return this; } |
949 virtual void Accept(AstVisitor* v); | 871 virtual void Accept(AstVisitor* v); |
950 | 872 |
951 virtual bool IsLeaf() { return properties()->is_empty(); } | |
952 | |
953 virtual bool IsPrimitive(); | |
954 | |
955 Handle<FixedArray> constant_properties() const { | 873 Handle<FixedArray> constant_properties() const { |
956 return constant_properties_; | 874 return constant_properties_; |
957 } | 875 } |
958 ZoneList<Property*>* properties() const { return properties_; } | 876 ZoneList<Property*>* properties() const { return properties_; } |
959 | 877 |
960 bool fast_elements() const { return fast_elements_; } | 878 bool fast_elements() const { return fast_elements_; } |
961 | 879 |
962 private: | 880 private: |
963 Handle<FixedArray> constant_properties_; | 881 Handle<FixedArray> constant_properties_; |
964 ZoneList<Property*>* properties_; | 882 ZoneList<Property*>* properties_; |
965 bool fast_elements_; | 883 bool fast_elements_; |
966 }; | 884 }; |
967 | 885 |
968 | 886 |
969 // Node for capturing a regexp literal. | 887 // Node for capturing a regexp literal. |
970 class RegExpLiteral: public MaterializedLiteral { | 888 class RegExpLiteral: public MaterializedLiteral { |
971 public: | 889 public: |
972 RegExpLiteral(Handle<String> pattern, | 890 RegExpLiteral(Handle<String> pattern, |
973 Handle<String> flags, | 891 Handle<String> flags, |
974 int literal_index) | 892 int literal_index) |
975 : MaterializedLiteral(literal_index, false, 1), | 893 : MaterializedLiteral(literal_index, false, 1), |
976 pattern_(pattern), | 894 pattern_(pattern), |
977 flags_(flags) {} | 895 flags_(flags) {} |
978 | 896 |
979 virtual void Accept(AstVisitor* v); | 897 virtual void Accept(AstVisitor* v); |
980 | 898 |
981 virtual bool IsLeaf() { return true; } | |
982 | |
983 virtual bool IsPrimitive(); | |
984 | |
985 Handle<String> pattern() const { return pattern_; } | 899 Handle<String> pattern() const { return pattern_; } |
986 Handle<String> flags() const { return flags_; } | 900 Handle<String> flags() const { return flags_; } |
987 | 901 |
988 private: | 902 private: |
989 Handle<String> pattern_; | 903 Handle<String> pattern_; |
990 Handle<String> flags_; | 904 Handle<String> flags_; |
991 }; | 905 }; |
992 | 906 |
993 // An array literal has a literals object that is used | 907 // An array literal has a literals object that is used |
994 // for minimizing the work when constructing it at runtime. | 908 // for minimizing the work when constructing it at runtime. |
995 class ArrayLiteral: public MaterializedLiteral { | 909 class ArrayLiteral: public MaterializedLiteral { |
996 public: | 910 public: |
997 ArrayLiteral(Handle<FixedArray> constant_elements, | 911 ArrayLiteral(Handle<FixedArray> constant_elements, |
998 ZoneList<Expression*>* values, | 912 ZoneList<Expression*>* values, |
999 int literal_index, | 913 int literal_index, |
1000 bool is_simple, | 914 bool is_simple, |
1001 int depth) | 915 int depth) |
1002 : MaterializedLiteral(literal_index, is_simple, depth), | 916 : MaterializedLiteral(literal_index, is_simple, depth), |
1003 constant_elements_(constant_elements), | 917 constant_elements_(constant_elements), |
1004 values_(values) {} | 918 values_(values) {} |
1005 | 919 |
1006 virtual void Accept(AstVisitor* v); | 920 virtual void Accept(AstVisitor* v); |
1007 virtual ArrayLiteral* AsArrayLiteral() { return this; } | 921 virtual ArrayLiteral* AsArrayLiteral() { return this; } |
1008 | 922 |
1009 virtual bool IsLeaf() { return values()->is_empty(); } | |
1010 | |
1011 virtual bool IsPrimitive(); | |
1012 | |
1013 Handle<FixedArray> constant_elements() const { return constant_elements_; } | 923 Handle<FixedArray> constant_elements() const { return constant_elements_; } |
1014 ZoneList<Expression*>* values() const { return values_; } | 924 ZoneList<Expression*>* values() const { return values_; } |
1015 | 925 |
1016 private: | 926 private: |
1017 Handle<FixedArray> constant_elements_; | 927 Handle<FixedArray> constant_elements_; |
1018 ZoneList<Expression*>* values_; | 928 ZoneList<Expression*>* values_; |
1019 }; | 929 }; |
1020 | 930 |
1021 | 931 |
1022 // Node for constructing a context extension object for a catch block. | 932 // Node for constructing a context extension object for a catch block. |
1023 // The catch context extension object has one property, the catch | 933 // The catch context extension object has one property, the catch |
1024 // variable, which should be DontDelete. | 934 // variable, which should be DontDelete. |
1025 class CatchExtensionObject: public Expression { | 935 class CatchExtensionObject: public Expression { |
1026 public: | 936 public: |
1027 CatchExtensionObject(Literal* key, VariableProxy* value) | 937 CatchExtensionObject(Literal* key, VariableProxy* value) |
1028 : key_(key), value_(value) { | 938 : key_(key), value_(value) { |
1029 } | 939 } |
1030 | 940 |
1031 virtual void Accept(AstVisitor* v); | 941 virtual void Accept(AstVisitor* v); |
1032 | 942 |
1033 virtual bool IsPrimitive(); | |
1034 | |
1035 Literal* key() const { return key_; } | 943 Literal* key() const { return key_; } |
1036 VariableProxy* value() const { return value_; } | 944 VariableProxy* value() const { return value_; } |
1037 | 945 |
1038 private: | 946 private: |
1039 Literal* key_; | 947 Literal* key_; |
1040 VariableProxy* value_; | 948 VariableProxy* value_; |
1041 }; | 949 }; |
1042 | 950 |
1043 | 951 |
1044 class VariableProxy: public Expression { | 952 class VariableProxy: public Expression { |
1045 public: | 953 public: |
1046 virtual void Accept(AstVisitor* v); | 954 virtual void Accept(AstVisitor* v); |
1047 | 955 |
1048 // Type testing & conversion | 956 // Type testing & conversion |
1049 virtual Property* AsProperty() { | 957 virtual Property* AsProperty() { |
1050 return var_ == NULL ? NULL : var_->AsProperty(); | 958 return var_ == NULL ? NULL : var_->AsProperty(); |
1051 } | 959 } |
1052 virtual VariableProxy* AsVariableProxy() { return this; } | 960 |
| 961 virtual VariableProxy* AsVariableProxy() { |
| 962 return this; |
| 963 } |
1053 | 964 |
1054 Variable* AsVariable() { | 965 Variable* AsVariable() { |
1055 return this == NULL || var_ == NULL ? NULL : var_->AsVariable(); | 966 return this == NULL || var_ == NULL ? NULL : var_->AsVariable(); |
1056 } | 967 } |
1057 | 968 |
1058 virtual bool IsValidLeftHandSide() { | 969 virtual bool IsValidLeftHandSide() { |
1059 return var_ == NULL ? true : var_->IsValidLeftHandSide(); | 970 return var_ == NULL ? true : var_->IsValidLeftHandSide(); |
1060 } | 971 } |
1061 | 972 |
1062 virtual bool IsLeaf() { | 973 virtual bool IsTrivial() { |
1063 ASSERT(var_ != NULL); // Variable must be resolved. | 974 // Reading from a mutable variable is a side effect, but the |
1064 return var()->is_global() || var()->rewrite()->IsLeaf(); | 975 // variable for 'this' is immutable. |
| 976 return is_this_ || is_trivial_; |
1065 } | 977 } |
1066 | 978 |
1067 // Reading from a mutable variable is a side effect, but 'this' is | |
1068 // immutable. | |
1069 virtual bool IsTrivial() { return is_trivial_; } | |
1070 | |
1071 virtual bool IsPrimitive(); | |
1072 virtual bool IsCritical(); | |
1073 | |
1074 void SetIsPrimitive(bool value) { is_primitive_ = value; } | |
1075 | |
1076 bool IsVariable(Handle<String> n) { | 979 bool IsVariable(Handle<String> n) { |
1077 return !is_this() && name().is_identical_to(n); | 980 return !is_this() && name().is_identical_to(n); |
1078 } | 981 } |
1079 | 982 |
1080 bool IsArguments() { | 983 bool IsArguments() { |
1081 Variable* variable = AsVariable(); | 984 Variable* variable = AsVariable(); |
1082 return (variable == NULL) ? false : variable->is_arguments(); | 985 return (variable == NULL) ? false : variable->is_arguments(); |
1083 } | 986 } |
1084 | 987 |
1085 Handle<String> name() const { return name_; } | 988 Handle<String> name() const { return name_; } |
1086 Variable* var() const { return var_; } | 989 Variable* var() const { return var_; } |
1087 bool is_this() const { return is_this_; } | 990 bool is_this() const { return is_this_; } |
1088 bool inside_with() const { return inside_with_; } | 991 bool inside_with() const { return inside_with_; } |
1089 bool is_trivial() { return is_trivial_; } | |
1090 void set_is_trivial(bool b) { is_trivial_ = b; } | |
1091 | 992 |
1092 BitVector* reaching_definitions() { return reaching_definitions_; } | 993 void MarkAsTrivial() { is_trivial_ = true; } |
1093 void set_reaching_definitions(BitVector* rd) { reaching_definitions_ = rd; } | |
1094 | 994 |
1095 // Bind this proxy to the variable var. | 995 // Bind this proxy to the variable var. |
1096 void BindTo(Variable* var); | 996 void BindTo(Variable* var); |
1097 | 997 |
1098 protected: | 998 protected: |
1099 Handle<String> name_; | 999 Handle<String> name_; |
1100 Variable* var_; // resolved variable, or NULL | 1000 Variable* var_; // resolved variable, or NULL |
1101 bool is_this_; | 1001 bool is_this_; |
1102 bool inside_with_; | 1002 bool inside_with_; |
1103 bool is_trivial_; | 1003 bool is_trivial_; |
1104 BitVector* reaching_definitions_; | |
1105 bool is_primitive_; | |
1106 | 1004 |
1107 VariableProxy(Handle<String> name, bool is_this, bool inside_with); | 1005 VariableProxy(Handle<String> name, bool is_this, bool inside_with); |
1108 explicit VariableProxy(bool is_this); | 1006 explicit VariableProxy(bool is_this); |
1109 | 1007 |
1110 friend class Scope; | 1008 friend class Scope; |
1111 }; | 1009 }; |
1112 | 1010 |
1113 | 1011 |
1114 class VariableProxySentinel: public VariableProxy { | 1012 class VariableProxySentinel: public VariableProxy { |
1115 public: | 1013 public: |
1116 virtual bool IsValidLeftHandSide() { return !is_this(); } | 1014 virtual bool IsValidLeftHandSide() { return !is_this(); } |
1117 static VariableProxySentinel* this_proxy() { return &this_proxy_; } | 1015 static VariableProxySentinel* this_proxy() { return &this_proxy_; } |
1118 static VariableProxySentinel* identifier_proxy() { | 1016 static VariableProxySentinel* identifier_proxy() { |
1119 return &identifier_proxy_; | 1017 return &identifier_proxy_; |
1120 } | 1018 } |
1121 | 1019 |
1122 virtual bool IsPrimitive() { | |
1123 UNREACHABLE(); | |
1124 return false; | |
1125 } | |
1126 | |
1127 private: | 1020 private: |
1128 explicit VariableProxySentinel(bool is_this) : VariableProxy(is_this) { } | 1021 explicit VariableProxySentinel(bool is_this) : VariableProxy(is_this) { } |
1129 static VariableProxySentinel this_proxy_; | 1022 static VariableProxySentinel this_proxy_; |
1130 static VariableProxySentinel identifier_proxy_; | 1023 static VariableProxySentinel identifier_proxy_; |
1131 }; | 1024 }; |
1132 | 1025 |
1133 | 1026 |
1134 class Slot: public Expression { | 1027 class Slot: public Expression { |
1135 public: | 1028 public: |
1136 enum Type { | 1029 enum Type { |
(...skipping 21 matching lines...) Expand all Loading... |
1158 Slot(Variable* var, Type type, int index) | 1051 Slot(Variable* var, Type type, int index) |
1159 : var_(var), type_(type), index_(index) { | 1052 : var_(var), type_(type), index_(index) { |
1160 ASSERT(var != NULL); | 1053 ASSERT(var != NULL); |
1161 } | 1054 } |
1162 | 1055 |
1163 virtual void Accept(AstVisitor* v); | 1056 virtual void Accept(AstVisitor* v); |
1164 | 1057 |
1165 // Type testing & conversion | 1058 // Type testing & conversion |
1166 virtual Slot* AsSlot() { return this; } | 1059 virtual Slot* AsSlot() { return this; } |
1167 | 1060 |
1168 virtual bool IsLeaf() { return true; } | |
1169 | |
1170 virtual bool IsPrimitive() { | |
1171 UNREACHABLE(); | |
1172 return false; | |
1173 } | |
1174 | |
1175 bool IsStackAllocated() { return type_ == PARAMETER || type_ == LOCAL; } | 1061 bool IsStackAllocated() { return type_ == PARAMETER || type_ == LOCAL; } |
1176 | 1062 |
1177 // Accessors | 1063 // Accessors |
1178 Variable* var() const { return var_; } | 1064 Variable* var() const { return var_; } |
1179 Type type() const { return type_; } | 1065 Type type() const { return type_; } |
1180 int index() const { return index_; } | 1066 int index() const { return index_; } |
1181 bool is_arguments() const { return var_->is_arguments(); } | 1067 bool is_arguments() const { return var_->is_arguments(); } |
1182 | 1068 |
1183 private: | 1069 private: |
1184 Variable* var_; | 1070 Variable* var_; |
1185 Type type_; | 1071 Type type_; |
1186 int index_; | 1072 int index_; |
1187 }; | 1073 }; |
1188 | 1074 |
1189 | 1075 |
1190 class Property: public Expression { | 1076 class Property: public Expression { |
1191 public: | 1077 public: |
1192 // Synthetic properties are property lookups introduced by the system, | 1078 // Synthetic properties are property lookups introduced by the system, |
1193 // to objects that aren't visible to the user. Function calls to synthetic | 1079 // to objects that aren't visible to the user. Function calls to synthetic |
1194 // properties should use the global object as receiver, not the base object | 1080 // properties should use the global object as receiver, not the base object |
1195 // of the resolved Reference. | 1081 // of the resolved Reference. |
1196 enum Type { NORMAL, SYNTHETIC }; | 1082 enum Type { NORMAL, SYNTHETIC }; |
1197 Property(Expression* obj, Expression* key, int pos, Type type = NORMAL) | 1083 Property(Expression* obj, Expression* key, int pos, Type type = NORMAL) |
1198 : obj_(obj), key_(key), pos_(pos), type_(type) { } | 1084 : obj_(obj), key_(key), pos_(pos), type_(type) { } |
1199 | 1085 |
1200 Property(Property* other, Expression* obj, Expression* key); | |
1201 | |
1202 virtual void Accept(AstVisitor* v); | 1086 virtual void Accept(AstVisitor* v); |
1203 | 1087 |
1204 // Type testing & conversion | 1088 // Type testing & conversion |
1205 virtual Property* AsProperty() { return this; } | 1089 virtual Property* AsProperty() { return this; } |
1206 | 1090 |
1207 virtual bool IsValidLeftHandSide() { return true; } | 1091 virtual bool IsValidLeftHandSide() { return true; } |
1208 | 1092 |
1209 virtual bool IsPrimitive(); | |
1210 virtual bool IsCritical(); | |
1211 | |
1212 Expression* obj() const { return obj_; } | 1093 Expression* obj() const { return obj_; } |
1213 Expression* key() const { return key_; } | 1094 Expression* key() const { return key_; } |
1214 int position() const { return pos_; } | 1095 int position() const { return pos_; } |
1215 bool is_synthetic() const { return type_ == SYNTHETIC; } | 1096 bool is_synthetic() const { return type_ == SYNTHETIC; } |
1216 | 1097 |
1217 // Returns a property singleton property access on 'this'. Used | 1098 // Returns a property singleton property access on 'this'. Used |
1218 // during preparsing. | 1099 // during preparsing. |
1219 static Property* this_property() { return &this_property_; } | 1100 static Property* this_property() { return &this_property_; } |
1220 | 1101 |
1221 private: | 1102 private: |
1222 Expression* obj_; | 1103 Expression* obj_; |
1223 Expression* key_; | 1104 Expression* key_; |
1224 int pos_; | 1105 int pos_; |
1225 Type type_; | 1106 Type type_; |
1226 | 1107 |
1227 // Dummy property used during preparsing. | 1108 // Dummy property used during preparsing. |
1228 static Property this_property_; | 1109 static Property this_property_; |
1229 }; | 1110 }; |
1230 | 1111 |
1231 | 1112 |
1232 class Call: public Expression { | 1113 class Call: public Expression { |
1233 public: | 1114 public: |
1234 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos) | 1115 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos) |
1235 : expression_(expression), arguments_(arguments), pos_(pos) { } | 1116 : expression_(expression), arguments_(arguments), pos_(pos) { } |
1236 | 1117 |
1237 Call(Call* other, Expression* expression, ZoneList<Expression*>* arguments); | |
1238 | |
1239 virtual void Accept(AstVisitor* v); | 1118 virtual void Accept(AstVisitor* v); |
1240 | 1119 |
1241 // Type testing and conversion. | 1120 // Type testing and conversion. |
1242 virtual Call* AsCall() { return this; } | 1121 virtual Call* AsCall() { return this; } |
1243 | 1122 |
1244 virtual bool IsPrimitive(); | |
1245 virtual bool IsCritical(); | |
1246 | |
1247 Expression* expression() const { return expression_; } | 1123 Expression* expression() const { return expression_; } |
1248 ZoneList<Expression*>* arguments() const { return arguments_; } | 1124 ZoneList<Expression*>* arguments() const { return arguments_; } |
1249 int position() { return pos_; } | 1125 int position() { return pos_; } |
1250 | 1126 |
1251 static Call* sentinel() { return &sentinel_; } | 1127 static Call* sentinel() { return &sentinel_; } |
1252 | 1128 |
1253 private: | 1129 private: |
1254 Expression* expression_; | 1130 Expression* expression_; |
1255 ZoneList<Expression*>* arguments_; | 1131 ZoneList<Expression*>* arguments_; |
1256 int pos_; | 1132 int pos_; |
1257 | 1133 |
1258 static Call sentinel_; | 1134 static Call sentinel_; |
1259 }; | 1135 }; |
1260 | 1136 |
1261 | 1137 |
1262 class CallNew: public Expression { | 1138 class CallNew: public Expression { |
1263 public: | 1139 public: |
1264 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) | 1140 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) |
1265 : expression_(expression), arguments_(arguments), pos_(pos) { } | 1141 : expression_(expression), arguments_(arguments), pos_(pos) { } |
1266 | 1142 |
1267 virtual void Accept(AstVisitor* v); | 1143 virtual void Accept(AstVisitor* v); |
1268 | 1144 |
1269 virtual bool IsPrimitive(); | |
1270 | |
1271 Expression* expression() const { return expression_; } | 1145 Expression* expression() const { return expression_; } |
1272 ZoneList<Expression*>* arguments() const { return arguments_; } | 1146 ZoneList<Expression*>* arguments() const { return arguments_; } |
1273 int position() { return pos_; } | 1147 int position() { return pos_; } |
1274 | 1148 |
1275 private: | 1149 private: |
1276 Expression* expression_; | 1150 Expression* expression_; |
1277 ZoneList<Expression*>* arguments_; | 1151 ZoneList<Expression*>* arguments_; |
1278 int pos_; | 1152 int pos_; |
1279 }; | 1153 }; |
1280 | 1154 |
1281 | 1155 |
1282 // The CallRuntime class does not represent any official JavaScript | 1156 // The CallRuntime class does not represent any official JavaScript |
1283 // language construct. Instead it is used to call a C or JS function | 1157 // language construct. Instead it is used to call a C or JS function |
1284 // with a set of arguments. This is used from the builtins that are | 1158 // with a set of arguments. This is used from the builtins that are |
1285 // implemented in JavaScript (see "v8natives.js"). | 1159 // implemented in JavaScript (see "v8natives.js"). |
1286 class CallRuntime: public Expression { | 1160 class CallRuntime: public Expression { |
1287 public: | 1161 public: |
1288 CallRuntime(Handle<String> name, | 1162 CallRuntime(Handle<String> name, |
1289 Runtime::Function* function, | 1163 Runtime::Function* function, |
1290 ZoneList<Expression*>* arguments) | 1164 ZoneList<Expression*>* arguments) |
1291 : name_(name), function_(function), arguments_(arguments) { } | 1165 : name_(name), function_(function), arguments_(arguments) { } |
1292 | 1166 |
1293 virtual void Accept(AstVisitor* v); | 1167 virtual void Accept(AstVisitor* v); |
1294 | 1168 |
1295 virtual bool IsPrimitive(); | |
1296 | |
1297 Handle<String> name() const { return name_; } | 1169 Handle<String> name() const { return name_; } |
1298 Runtime::Function* function() const { return function_; } | 1170 Runtime::Function* function() const { return function_; } |
1299 ZoneList<Expression*>* arguments() const { return arguments_; } | 1171 ZoneList<Expression*>* arguments() const { return arguments_; } |
1300 bool is_jsruntime() const { return function_ == NULL; } | 1172 bool is_jsruntime() const { return function_ == NULL; } |
1301 | 1173 |
1302 private: | 1174 private: |
1303 Handle<String> name_; | 1175 Handle<String> name_; |
1304 Runtime::Function* function_; | 1176 Runtime::Function* function_; |
1305 ZoneList<Expression*>* arguments_; | 1177 ZoneList<Expression*>* arguments_; |
1306 }; | 1178 }; |
1307 | 1179 |
1308 | 1180 |
1309 class UnaryOperation: public Expression { | 1181 class UnaryOperation: public Expression { |
1310 public: | 1182 public: |
1311 UnaryOperation(Token::Value op, Expression* expression) | 1183 UnaryOperation(Token::Value op, Expression* expression) |
1312 : op_(op), expression_(expression) { | 1184 : op_(op), expression_(expression) { |
1313 ASSERT(Token::IsUnaryOp(op)); | 1185 ASSERT(Token::IsUnaryOp(op)); |
1314 } | 1186 } |
1315 | 1187 |
1316 UnaryOperation(UnaryOperation* other, Expression* expression); | |
1317 | |
1318 virtual void Accept(AstVisitor* v); | 1188 virtual void Accept(AstVisitor* v); |
1319 | 1189 |
1320 // Type testing & conversion | 1190 // Type testing & conversion |
1321 virtual UnaryOperation* AsUnaryOperation() { return this; } | 1191 virtual UnaryOperation* AsUnaryOperation() { return this; } |
1322 | 1192 |
1323 virtual bool IsPrimitive(); | |
1324 virtual bool IsCritical(); | |
1325 | |
1326 Token::Value op() const { return op_; } | 1193 Token::Value op() const { return op_; } |
1327 Expression* expression() const { return expression_; } | 1194 Expression* expression() const { return expression_; } |
1328 | 1195 |
1329 private: | 1196 private: |
1330 Token::Value op_; | 1197 Token::Value op_; |
1331 Expression* expression_; | 1198 Expression* expression_; |
1332 }; | 1199 }; |
1333 | 1200 |
1334 | 1201 |
1335 class BinaryOperation: public Expression { | 1202 class BinaryOperation: public Expression { |
1336 public: | 1203 public: |
1337 BinaryOperation(Token::Value op, Expression* left, Expression* right) | 1204 BinaryOperation(Token::Value op, Expression* left, Expression* right) |
1338 : op_(op), left_(left), right_(right) { | 1205 : op_(op), left_(left), right_(right) { |
1339 ASSERT(Token::IsBinaryOp(op)); | 1206 ASSERT(Token::IsBinaryOp(op)); |
1340 } | 1207 } |
1341 | 1208 |
1342 // Construct a binary operation with a given operator and left and right | |
1343 // subexpressions. The rest of the expression state is copied from | |
1344 // another expression. | |
1345 BinaryOperation(Expression* other, | |
1346 Token::Value op, | |
1347 Expression* left, | |
1348 Expression* right); | |
1349 | |
1350 virtual void Accept(AstVisitor* v); | 1209 virtual void Accept(AstVisitor* v); |
1351 | 1210 |
1352 // Type testing & conversion | 1211 // Type testing & conversion |
1353 virtual BinaryOperation* AsBinaryOperation() { return this; } | 1212 virtual BinaryOperation* AsBinaryOperation() { return this; } |
1354 | 1213 |
1355 virtual bool IsPrimitive(); | |
1356 virtual bool IsCritical(); | |
1357 | |
1358 // True iff the result can be safely overwritten (to avoid allocation). | 1214 // True iff the result can be safely overwritten (to avoid allocation). |
1359 // False for operations that can return one of their operands. | 1215 // False for operations that can return one of their operands. |
1360 bool ResultOverwriteAllowed() { | 1216 bool ResultOverwriteAllowed() { |
1361 switch (op_) { | 1217 switch (op_) { |
1362 case Token::COMMA: | 1218 case Token::COMMA: |
1363 case Token::OR: | 1219 case Token::OR: |
1364 case Token::AND: | 1220 case Token::AND: |
1365 return false; | 1221 return false; |
1366 case Token::BIT_OR: | 1222 case Token::BIT_OR: |
1367 case Token::BIT_XOR: | 1223 case Token::BIT_XOR: |
(...skipping 24 matching lines...) Expand all Loading... |
1392 }; | 1248 }; |
1393 | 1249 |
1394 | 1250 |
1395 class CountOperation: public Expression { | 1251 class CountOperation: public Expression { |
1396 public: | 1252 public: |
1397 CountOperation(bool is_prefix, Token::Value op, Expression* expression) | 1253 CountOperation(bool is_prefix, Token::Value op, Expression* expression) |
1398 : is_prefix_(is_prefix), op_(op), expression_(expression) { | 1254 : is_prefix_(is_prefix), op_(op), expression_(expression) { |
1399 ASSERT(Token::IsCountOp(op)); | 1255 ASSERT(Token::IsCountOp(op)); |
1400 } | 1256 } |
1401 | 1257 |
1402 CountOperation(CountOperation* other, Expression* expression); | |
1403 | |
1404 virtual void Accept(AstVisitor* v); | 1258 virtual void Accept(AstVisitor* v); |
1405 | 1259 |
1406 virtual CountOperation* AsCountOperation() { return this; } | 1260 virtual CountOperation* AsCountOperation() { return this; } |
1407 | 1261 |
1408 virtual Variable* AssignedVariable() { | |
1409 return expression()->AsVariableProxy()->AsVariable(); | |
1410 } | |
1411 | |
1412 virtual bool IsPrimitive(); | |
1413 virtual bool IsCritical(); | |
1414 | |
1415 bool is_prefix() const { return is_prefix_; } | 1262 bool is_prefix() const { return is_prefix_; } |
1416 bool is_postfix() const { return !is_prefix_; } | 1263 bool is_postfix() const { return !is_prefix_; } |
1417 Token::Value op() const { return op_; } | 1264 Token::Value op() const { return op_; } |
1418 Token::Value binary_op() { | 1265 Token::Value binary_op() { |
1419 return op_ == Token::INC ? Token::ADD : Token::SUB; | 1266 return op_ == Token::INC ? Token::ADD : Token::SUB; |
1420 } | 1267 } |
1421 Expression* expression() const { return expression_; } | 1268 Expression* expression() const { return expression_; } |
1422 | 1269 |
1423 virtual void MarkAsStatement() { is_prefix_ = true; } | 1270 virtual void MarkAsStatement() { is_prefix_ = true; } |
1424 | 1271 |
1425 private: | 1272 private: |
1426 bool is_prefix_; | 1273 bool is_prefix_; |
1427 Token::Value op_; | 1274 Token::Value op_; |
1428 Expression* expression_; | 1275 Expression* expression_; |
1429 }; | 1276 }; |
1430 | 1277 |
1431 | 1278 |
1432 class CompareOperation: public Expression { | 1279 class CompareOperation: public Expression { |
1433 public: | 1280 public: |
1434 CompareOperation(Token::Value op, Expression* left, Expression* right) | 1281 CompareOperation(Token::Value op, Expression* left, Expression* right) |
1435 : op_(op), left_(left), right_(right) { | 1282 : op_(op), left_(left), right_(right) { |
1436 ASSERT(Token::IsCompareOp(op)); | 1283 ASSERT(Token::IsCompareOp(op)); |
1437 } | 1284 } |
1438 | 1285 |
1439 CompareOperation(CompareOperation* other, | |
1440 Expression* left, | |
1441 Expression* right); | |
1442 | |
1443 virtual void Accept(AstVisitor* v); | 1286 virtual void Accept(AstVisitor* v); |
1444 | 1287 |
1445 virtual bool IsPrimitive(); | |
1446 virtual bool IsCritical(); | |
1447 | |
1448 Token::Value op() const { return op_; } | 1288 Token::Value op() const { return op_; } |
1449 Expression* left() const { return left_; } | 1289 Expression* left() const { return left_; } |
1450 Expression* right() const { return right_; } | 1290 Expression* right() const { return right_; } |
1451 | 1291 |
1452 // Type testing & conversion | 1292 // Type testing & conversion |
1453 virtual CompareOperation* AsCompareOperation() { return this; } | 1293 virtual CompareOperation* AsCompareOperation() { return this; } |
1454 | 1294 |
1455 private: | 1295 private: |
1456 Token::Value op_; | 1296 Token::Value op_; |
1457 Expression* left_; | 1297 Expression* left_; |
1458 Expression* right_; | 1298 Expression* right_; |
1459 }; | 1299 }; |
1460 | 1300 |
1461 | 1301 |
| 1302 class CompareToNull: public Expression { |
| 1303 public: |
| 1304 CompareToNull(bool is_strict, Expression* expression) |
| 1305 : is_strict_(is_strict), expression_(expression) { } |
| 1306 |
| 1307 virtual void Accept(AstVisitor* v); |
| 1308 |
| 1309 bool is_strict() const { return is_strict_; } |
| 1310 Token::Value op() const { return is_strict_ ? Token::EQ_STRICT : Token::EQ; } |
| 1311 Expression* expression() const { return expression_; } |
| 1312 |
| 1313 private: |
| 1314 bool is_strict_; |
| 1315 Expression* expression_; |
| 1316 }; |
| 1317 |
| 1318 |
1462 class Conditional: public Expression { | 1319 class Conditional: public Expression { |
1463 public: | 1320 public: |
1464 Conditional(Expression* condition, | 1321 Conditional(Expression* condition, |
1465 Expression* then_expression, | 1322 Expression* then_expression, |
1466 Expression* else_expression, | 1323 Expression* else_expression, |
1467 int then_expression_position, | 1324 int then_expression_position, |
1468 int else_expression_position) | 1325 int else_expression_position) |
1469 : condition_(condition), | 1326 : condition_(condition), |
1470 then_expression_(then_expression), | 1327 then_expression_(then_expression), |
1471 else_expression_(else_expression), | 1328 else_expression_(else_expression), |
1472 then_expression_position_(then_expression_position), | 1329 then_expression_position_(then_expression_position), |
1473 else_expression_position_(else_expression_position) { } | 1330 else_expression_position_(else_expression_position) { } |
1474 | 1331 |
1475 virtual void Accept(AstVisitor* v); | 1332 virtual void Accept(AstVisitor* v); |
1476 | 1333 |
1477 virtual bool IsPrimitive(); | |
1478 | |
1479 Expression* condition() const { return condition_; } | 1334 Expression* condition() const { return condition_; } |
1480 Expression* then_expression() const { return then_expression_; } | 1335 Expression* then_expression() const { return then_expression_; } |
1481 Expression* else_expression() const { return else_expression_; } | 1336 Expression* else_expression() const { return else_expression_; } |
1482 | 1337 |
1483 int then_expression_position() { return then_expression_position_; } | 1338 int then_expression_position() { return then_expression_position_; } |
1484 int else_expression_position() { return else_expression_position_; } | 1339 int else_expression_position() { return else_expression_position_; } |
1485 | 1340 |
1486 private: | 1341 private: |
1487 Expression* condition_; | 1342 Expression* condition_; |
1488 Expression* then_expression_; | 1343 Expression* then_expression_; |
1489 Expression* else_expression_; | 1344 Expression* else_expression_; |
1490 int then_expression_position_; | 1345 int then_expression_position_; |
1491 int else_expression_position_; | 1346 int else_expression_position_; |
1492 }; | 1347 }; |
1493 | 1348 |
1494 | 1349 |
1495 class Assignment: public Expression { | 1350 class Assignment: public Expression { |
1496 public: | 1351 public: |
1497 Assignment(Token::Value op, Expression* target, Expression* value, int pos) | 1352 Assignment(Token::Value op, Expression* target, Expression* value, int pos) |
1498 : op_(op), target_(target), value_(value), pos_(pos), | 1353 : op_(op), target_(target), value_(value), pos_(pos), |
1499 block_start_(false), block_end_(false) { | 1354 block_start_(false), block_end_(false) { |
1500 ASSERT(Token::IsAssignmentOp(op)); | 1355 ASSERT(Token::IsAssignmentOp(op)); |
1501 } | 1356 } |
1502 | 1357 |
1503 Assignment(Assignment* other, Expression* target, Expression* value); | |
1504 | |
1505 virtual void Accept(AstVisitor* v); | 1358 virtual void Accept(AstVisitor* v); |
1506 virtual Assignment* AsAssignment() { return this; } | 1359 virtual Assignment* AsAssignment() { return this; } |
1507 | 1360 |
1508 virtual bool IsPrimitive(); | |
1509 virtual bool IsCritical(); | |
1510 | |
1511 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } | 1361 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } |
1512 | 1362 |
1513 virtual Variable* AssignedVariable() { | |
1514 return target()->AsVariableProxy()->AsVariable(); | |
1515 } | |
1516 | |
1517 Token::Value binary_op() const; | 1363 Token::Value binary_op() const; |
1518 | 1364 |
1519 Token::Value op() const { return op_; } | 1365 Token::Value op() const { return op_; } |
1520 Expression* target() const { return target_; } | 1366 Expression* target() const { return target_; } |
1521 Expression* value() const { return value_; } | 1367 Expression* value() const { return value_; } |
1522 int position() { return pos_; } | 1368 int position() { return pos_; } |
1523 // This check relies on the definition order of token in token.h. | 1369 // This check relies on the definition order of token in token.h. |
1524 bool is_compound() const { return op() > Token::ASSIGN; } | 1370 bool is_compound() const { return op() > Token::ASSIGN; } |
1525 | 1371 |
1526 // An initialization block is a series of statments of the form | 1372 // An initialization block is a series of statments of the form |
(...skipping 15 matching lines...) Expand all Loading... |
1542 }; | 1388 }; |
1543 | 1389 |
1544 | 1390 |
1545 class Throw: public Expression { | 1391 class Throw: public Expression { |
1546 public: | 1392 public: |
1547 Throw(Expression* exception, int pos) | 1393 Throw(Expression* exception, int pos) |
1548 : exception_(exception), pos_(pos) {} | 1394 : exception_(exception), pos_(pos) {} |
1549 | 1395 |
1550 virtual void Accept(AstVisitor* v); | 1396 virtual void Accept(AstVisitor* v); |
1551 | 1397 |
1552 virtual bool IsPrimitive(); | |
1553 | |
1554 Expression* exception() const { return exception_; } | 1398 Expression* exception() const { return exception_; } |
1555 int position() const { return pos_; } | 1399 int position() const { return pos_; } |
1556 | 1400 |
1557 private: | 1401 private: |
1558 Expression* exception_; | 1402 Expression* exception_; |
1559 int pos_; | 1403 int pos_; |
1560 }; | 1404 }; |
1561 | 1405 |
1562 | 1406 |
1563 class FunctionLiteral: public Expression { | 1407 class FunctionLiteral: public Expression { |
(...skipping 27 matching lines...) Expand all Loading... |
1591 #ifdef DEBUG | 1435 #ifdef DEBUG |
1592 already_compiled_ = false; | 1436 already_compiled_ = false; |
1593 #endif | 1437 #endif |
1594 } | 1438 } |
1595 | 1439 |
1596 virtual void Accept(AstVisitor* v); | 1440 virtual void Accept(AstVisitor* v); |
1597 | 1441 |
1598 // Type testing & conversion | 1442 // Type testing & conversion |
1599 virtual FunctionLiteral* AsFunctionLiteral() { return this; } | 1443 virtual FunctionLiteral* AsFunctionLiteral() { return this; } |
1600 | 1444 |
1601 virtual bool IsLeaf() { return true; } | |
1602 | |
1603 virtual bool IsPrimitive(); | |
1604 | |
1605 Handle<String> name() const { return name_; } | 1445 Handle<String> name() const { return name_; } |
1606 Scope* scope() const { return scope_; } | 1446 Scope* scope() const { return scope_; } |
1607 ZoneList<Statement*>* body() const { return body_; } | 1447 ZoneList<Statement*>* body() const { return body_; } |
1608 void set_function_token_position(int pos) { function_token_position_ = pos; } | 1448 void set_function_token_position(int pos) { function_token_position_ = pos; } |
1609 int function_token_position() const { return function_token_position_; } | 1449 int function_token_position() const { return function_token_position_; } |
1610 int start_position() const { return start_position_; } | 1450 int start_position() const { return start_position_; } |
1611 int end_position() const { return end_position_; } | 1451 int end_position() const { return end_position_; } |
1612 bool is_expression() const { return is_expression_; } | 1452 bool is_expression() const { return is_expression_; } |
1613 | 1453 |
1614 int materialized_literal_count() { return materialized_literal_count_; } | 1454 int materialized_literal_count() { return materialized_literal_count_; } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1662 class SharedFunctionInfoLiteral: public Expression { | 1502 class SharedFunctionInfoLiteral: public Expression { |
1663 public: | 1503 public: |
1664 explicit SharedFunctionInfoLiteral( | 1504 explicit SharedFunctionInfoLiteral( |
1665 Handle<SharedFunctionInfo> shared_function_info) | 1505 Handle<SharedFunctionInfo> shared_function_info) |
1666 : shared_function_info_(shared_function_info) { } | 1506 : shared_function_info_(shared_function_info) { } |
1667 | 1507 |
1668 Handle<SharedFunctionInfo> shared_function_info() const { | 1508 Handle<SharedFunctionInfo> shared_function_info() const { |
1669 return shared_function_info_; | 1509 return shared_function_info_; |
1670 } | 1510 } |
1671 | 1511 |
1672 virtual bool IsLeaf() { return true; } | |
1673 | |
1674 virtual void Accept(AstVisitor* v); | 1512 virtual void Accept(AstVisitor* v); |
1675 | 1513 |
1676 virtual bool IsPrimitive(); | |
1677 | |
1678 private: | 1514 private: |
1679 Handle<SharedFunctionInfo> shared_function_info_; | 1515 Handle<SharedFunctionInfo> shared_function_info_; |
1680 }; | 1516 }; |
1681 | 1517 |
1682 | 1518 |
1683 class ThisFunction: public Expression { | 1519 class ThisFunction: public Expression { |
1684 public: | 1520 public: |
1685 virtual void Accept(AstVisitor* v); | 1521 virtual void Accept(AstVisitor* v); |
1686 virtual bool IsLeaf() { return true; } | |
1687 virtual bool IsPrimitive(); | |
1688 }; | 1522 }; |
1689 | 1523 |
1690 | 1524 |
1691 // ---------------------------------------------------------------------------- | 1525 // ---------------------------------------------------------------------------- |
1692 // Regular expressions | 1526 // Regular expressions |
1693 | 1527 |
1694 | 1528 |
1695 class RegExpVisitor BASE_EMBEDDED { | 1529 class RegExpVisitor BASE_EMBEDDED { |
1696 public: | 1530 public: |
1697 virtual ~RegExpVisitor() { } | 1531 virtual ~RegExpVisitor() { } |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2065 // Individual nodes | 1899 // Individual nodes |
2066 #define DEF_VISIT(type) \ | 1900 #define DEF_VISIT(type) \ |
2067 virtual void Visit##type(type* node) = 0; | 1901 virtual void Visit##type(type* node) = 0; |
2068 AST_NODE_LIST(DEF_VISIT) | 1902 AST_NODE_LIST(DEF_VISIT) |
2069 #undef DEF_VISIT | 1903 #undef DEF_VISIT |
2070 | 1904 |
2071 private: | 1905 private: |
2072 bool stack_overflow_; | 1906 bool stack_overflow_; |
2073 }; | 1907 }; |
2074 | 1908 |
2075 | |
2076 class CopyAstVisitor : public AstVisitor { | |
2077 public: | |
2078 Expression* DeepCopyExpr(Expression* expr); | |
2079 | |
2080 Statement* DeepCopyStmt(Statement* stmt); | |
2081 | |
2082 private: | |
2083 ZoneList<Expression*>* DeepCopyExprList(ZoneList<Expression*>* expressions); | |
2084 | |
2085 ZoneList<Statement*>* DeepCopyStmtList(ZoneList<Statement*>* statements); | |
2086 | |
2087 // AST node visit functions. | |
2088 #define DECLARE_VISIT(type) virtual void Visit##type(type* node); | |
2089 AST_NODE_LIST(DECLARE_VISIT) | |
2090 #undef DECLARE_VISIT | |
2091 | |
2092 // Holds the result of copying an expression. | |
2093 Expression* expr_; | |
2094 // Holds the result of copying a statement. | |
2095 Statement* stmt_; | |
2096 }; | |
2097 | |
2098 } } // namespace v8::internal | 1909 } } // namespace v8::internal |
2099 | 1910 |
2100 #endif // V8_AST_H_ | 1911 #endif // V8_AST_H_ |
OLD | NEW |