| 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 virtual Expression* AsExpression() { return NULL; } | 130 virtual Expression* AsExpression() { return NULL; } |
| 131 virtual Literal* AsLiteral() { return NULL; } | 131 virtual Literal* AsLiteral() { return NULL; } |
| 132 virtual Slot* AsSlot() { return NULL; } | 132 virtual Slot* AsSlot() { return NULL; } |
| 133 virtual VariableProxy* AsVariableProxy() { return NULL; } | 133 virtual VariableProxy* AsVariableProxy() { return NULL; } |
| 134 virtual Property* AsProperty() { return NULL; } | 134 virtual Property* AsProperty() { return NULL; } |
| 135 virtual Call* AsCall() { return NULL; } | 135 virtual Call* AsCall() { return NULL; } |
| 136 virtual TargetCollector* AsTargetCollector() { return NULL; } | 136 virtual TargetCollector* AsTargetCollector() { return NULL; } |
| 137 virtual BreakableStatement* AsBreakableStatement() { return NULL; } | 137 virtual BreakableStatement* AsBreakableStatement() { return NULL; } |
| 138 virtual IterationStatement* AsIterationStatement() { return NULL; } | 138 virtual IterationStatement* AsIterationStatement() { return NULL; } |
| 139 virtual UnaryOperation* AsUnaryOperation() { return NULL; } | 139 virtual UnaryOperation* AsUnaryOperation() { return NULL; } |
| 140 virtual CountOperation* AsCountOperation() { return NULL; } |
| 140 virtual BinaryOperation* AsBinaryOperation() { return NULL; } | 141 virtual BinaryOperation* AsBinaryOperation() { return NULL; } |
| 141 virtual Assignment* AsAssignment() { return NULL; } | 142 virtual Assignment* AsAssignment() { return NULL; } |
| 142 virtual FunctionLiteral* AsFunctionLiteral() { return NULL; } | 143 virtual FunctionLiteral* AsFunctionLiteral() { return NULL; } |
| 143 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } | 144 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
| 144 virtual ObjectLiteral* AsObjectLiteral() { return NULL; } | 145 virtual ObjectLiteral* AsObjectLiteral() { return NULL; } |
| 145 virtual ArrayLiteral* AsArrayLiteral() { return NULL; } | 146 virtual ArrayLiteral* AsArrayLiteral() { return NULL; } |
| 146 virtual CompareOperation* AsCompareOperation() { return NULL; } | 147 virtual CompareOperation* AsCompareOperation() { return NULL; } |
| 147 | 148 |
| 148 int num() { return num_; } | 149 int num() { return num_; } |
| 149 void set_num(int n) { num_ = n; } | 150 void set_num(int n) { num_ = n; } |
| 150 | 151 |
| 151 private: | 152 private: |
| 152 // Support for ast node numbering. | 153 // Support for ast node numbering. |
| 153 int num_; | 154 int num_; |
| 154 }; | 155 }; |
| 155 | 156 |
| 156 | 157 |
| 157 class Statement: public AstNode { | 158 class Statement: public AstNode { |
| 158 public: | 159 public: |
| 159 Statement() : statement_pos_(RelocInfo::kNoPosition) {} | 160 Statement() : statement_pos_(RelocInfo::kNoPosition) {} |
| 160 | 161 |
| 161 virtual Statement* AsStatement() { return this; } | 162 virtual Statement* AsStatement() { return this; } |
| 162 virtual ReturnStatement* AsReturnStatement() { return NULL; } | 163 virtual ReturnStatement* AsReturnStatement() { return NULL; } |
| 163 | 164 |
| 165 virtual Assignment* StatementAsSimpleAssignment() { return NULL; } |
| 166 virtual CountOperation* StatementAsCountOperation() { return NULL; } |
| 167 |
| 164 bool IsEmpty() { return AsEmptyStatement() != NULL; } | 168 bool IsEmpty() { return AsEmptyStatement() != NULL; } |
| 165 | 169 |
| 166 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } | 170 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } |
| 167 int statement_pos() const { return statement_pos_; } | 171 int statement_pos() const { return statement_pos_; } |
| 168 | 172 |
| 169 private: | 173 private: |
| 170 int statement_pos_; | 174 int statement_pos_; |
| 171 }; | 175 }; |
| 172 | 176 |
| 173 | 177 |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 | 318 |
| 315 class Block: public BreakableStatement { | 319 class Block: public BreakableStatement { |
| 316 public: | 320 public: |
| 317 Block(ZoneStringList* labels, int capacity, bool is_initializer_block) | 321 Block(ZoneStringList* labels, int capacity, bool is_initializer_block) |
| 318 : BreakableStatement(labels, TARGET_FOR_NAMED_ONLY), | 322 : BreakableStatement(labels, TARGET_FOR_NAMED_ONLY), |
| 319 statements_(capacity), | 323 statements_(capacity), |
| 320 is_initializer_block_(is_initializer_block) { } | 324 is_initializer_block_(is_initializer_block) { } |
| 321 | 325 |
| 322 virtual void Accept(AstVisitor* v); | 326 virtual void Accept(AstVisitor* v); |
| 323 | 327 |
| 328 virtual Assignment* StatementAsSimpleAssignment() { |
| 329 if (statements_.length() != 1) return NULL; |
| 330 return statements_[0]->StatementAsSimpleAssignment(); |
| 331 } |
| 332 |
| 333 virtual CountOperation* StatementAsCountOperation() { |
| 334 if (statements_.length() != 1) return NULL; |
| 335 return statements_[0]->StatementAsCountOperation(); |
| 336 } |
| 337 |
| 324 void AddStatement(Statement* statement) { statements_.Add(statement); } | 338 void AddStatement(Statement* statement) { statements_.Add(statement); } |
| 325 | 339 |
| 326 ZoneList<Statement*>* statements() { return &statements_; } | 340 ZoneList<Statement*>* statements() { return &statements_; } |
| 327 bool is_initializer_block() const { return is_initializer_block_; } | 341 bool is_initializer_block() const { return is_initializer_block_; } |
| 328 | 342 |
| 329 private: | 343 private: |
| 330 ZoneList<Statement*> statements_; | 344 ZoneList<Statement*> statements_; |
| 331 bool is_initializer_block_; | 345 bool is_initializer_block_; |
| 332 }; | 346 }; |
| 333 | 347 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 }; | 449 }; |
| 436 | 450 |
| 437 | 451 |
| 438 class ForStatement: public IterationStatement { | 452 class ForStatement: public IterationStatement { |
| 439 public: | 453 public: |
| 440 explicit ForStatement(ZoneStringList* labels) | 454 explicit ForStatement(ZoneStringList* labels) |
| 441 : IterationStatement(labels), | 455 : IterationStatement(labels), |
| 442 init_(NULL), | 456 init_(NULL), |
| 443 cond_(NULL), | 457 cond_(NULL), |
| 444 next_(NULL), | 458 next_(NULL), |
| 445 may_have_function_literal_(true) { | 459 may_have_function_literal_(true), |
| 446 } | 460 loop_variable_(NULL) {} |
| 447 | 461 |
| 448 void Initialize(Statement* init, | 462 void Initialize(Statement* init, |
| 449 Expression* cond, | 463 Expression* cond, |
| 450 Statement* next, | 464 Statement* next, |
| 451 Statement* body) { | 465 Statement* body) { |
| 452 IterationStatement::Initialize(body); | 466 IterationStatement::Initialize(body); |
| 453 init_ = init; | 467 init_ = init; |
| 454 cond_ = cond; | 468 cond_ = cond; |
| 455 next_ = next; | 469 next_ = next; |
| 456 } | 470 } |
| 457 | 471 |
| 458 virtual void Accept(AstVisitor* v); | 472 virtual void Accept(AstVisitor* v); |
| 459 | 473 |
| 460 Statement* init() const { return init_; } | 474 Statement* init() const { return init_; } |
| 461 Expression* cond() const { return cond_; } | 475 Expression* cond() const { return cond_; } |
| 462 Statement* next() const { return next_; } | 476 Statement* next() const { return next_; } |
| 463 bool may_have_function_literal() const { | 477 bool may_have_function_literal() const { |
| 464 return may_have_function_literal_; | 478 return may_have_function_literal_; |
| 465 } | 479 } |
| 466 | 480 |
| 481 bool is_fast_smi_loop() { return loop_variable_ != NULL; } |
| 482 Variable* loop_variable() { return loop_variable_; } |
| 483 void set_loop_variable(Variable* var) { loop_variable_ = var; } |
| 484 |
| 467 private: | 485 private: |
| 468 Statement* init_; | 486 Statement* init_; |
| 469 Expression* cond_; | 487 Expression* cond_; |
| 470 Statement* next_; | 488 Statement* next_; |
| 471 // True if there is a function literal subexpression in the condition. | 489 // True if there is a function literal subexpression in the condition. |
| 472 bool may_have_function_literal_; | 490 bool may_have_function_literal_; |
| 491 Variable* loop_variable_; |
| 473 | 492 |
| 474 friend class AstOptimizer; | 493 friend class AstOptimizer; |
| 475 }; | 494 }; |
| 476 | 495 |
| 477 | 496 |
| 478 class ForInStatement: public IterationStatement { | 497 class ForInStatement: public IterationStatement { |
| 479 public: | 498 public: |
| 480 explicit ForInStatement(ZoneStringList* labels) | 499 explicit ForInStatement(ZoneStringList* labels) |
| 481 : IterationStatement(labels), each_(NULL), enumerable_(NULL) { } | 500 : IterationStatement(labels), each_(NULL), enumerable_(NULL) { } |
| 482 | 501 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 500 class ExpressionStatement: public Statement { | 519 class ExpressionStatement: public Statement { |
| 501 public: | 520 public: |
| 502 explicit ExpressionStatement(Expression* expression) | 521 explicit ExpressionStatement(Expression* expression) |
| 503 : expression_(expression) { } | 522 : expression_(expression) { } |
| 504 | 523 |
| 505 virtual void Accept(AstVisitor* v); | 524 virtual void Accept(AstVisitor* v); |
| 506 | 525 |
| 507 // Type testing & conversion. | 526 // Type testing & conversion. |
| 508 virtual ExpressionStatement* AsExpressionStatement() { return this; } | 527 virtual ExpressionStatement* AsExpressionStatement() { return this; } |
| 509 | 528 |
| 529 virtual Assignment* StatementAsSimpleAssignment(); |
| 530 virtual CountOperation* StatementAsCountOperation(); |
| 531 |
| 510 void set_expression(Expression* e) { expression_ = e; } | 532 void set_expression(Expression* e) { expression_ = e; } |
| 511 Expression* expression() { return expression_; } | 533 Expression* expression() { return expression_; } |
| 512 | 534 |
| 513 private: | 535 private: |
| 514 Expression* expression_; | 536 Expression* expression_; |
| 515 }; | 537 }; |
| 516 | 538 |
| 517 | 539 |
| 518 class ContinueStatement: public Statement { | 540 class ContinueStatement: public Statement { |
| 519 public: | 541 public: |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 return var_ == NULL ? true : var_->IsValidLeftHandSide(); | 979 return var_ == NULL ? true : var_->IsValidLeftHandSide(); |
| 958 } | 980 } |
| 959 | 981 |
| 960 virtual bool IsLeaf() { | 982 virtual bool IsLeaf() { |
| 961 ASSERT(var_ != NULL); // Variable must be resolved. | 983 ASSERT(var_ != NULL); // Variable must be resolved. |
| 962 return var()->is_global() || var()->rewrite()->IsLeaf(); | 984 return var()->is_global() || var()->rewrite()->IsLeaf(); |
| 963 } | 985 } |
| 964 | 986 |
| 965 // Reading from a mutable variable is a side effect, but 'this' is | 987 // Reading from a mutable variable is a side effect, but 'this' is |
| 966 // immutable. | 988 // immutable. |
| 967 virtual bool IsTrivial() { return is_this(); } | 989 virtual bool IsTrivial() { return is_trivial_; } |
| 968 | 990 |
| 969 bool IsVariable(Handle<String> n) { | 991 bool IsVariable(Handle<String> n) { |
| 970 return !is_this() && name().is_identical_to(n); | 992 return !is_this() && name().is_identical_to(n); |
| 971 } | 993 } |
| 972 | 994 |
| 973 bool IsArguments() { | 995 bool IsArguments() { |
| 974 Variable* variable = AsVariable(); | 996 Variable* variable = AsVariable(); |
| 975 return (variable == NULL) ? false : variable->is_arguments(); | 997 return (variable == NULL) ? false : variable->is_arguments(); |
| 976 } | 998 } |
| 977 | 999 |
| 978 Handle<String> name() const { return name_; } | 1000 Handle<String> name() const { return name_; } |
| 979 Variable* var() const { return var_; } | 1001 Variable* var() const { return var_; } |
| 980 bool is_this() const { return is_this_; } | 1002 bool is_this() const { return is_this_; } |
| 981 bool inside_with() const { return inside_with_; } | 1003 bool inside_with() const { return inside_with_; } |
| 1004 bool is_trivial() { return is_trivial_; } |
| 1005 void set_is_trivial(bool b) { is_trivial_ = b; } |
| 982 | 1006 |
| 983 // Bind this proxy to the variable var. | 1007 // Bind this proxy to the variable var. |
| 984 void BindTo(Variable* var); | 1008 void BindTo(Variable* var); |
| 985 | 1009 |
| 986 protected: | 1010 protected: |
| 987 Handle<String> name_; | 1011 Handle<String> name_; |
| 988 Variable* var_; // resolved variable, or NULL | 1012 Variable* var_; // resolved variable, or NULL |
| 989 bool is_this_; | 1013 bool is_this_; |
| 990 bool inside_with_; | 1014 bool inside_with_; |
| 1015 bool is_trivial_; |
| 991 | 1016 |
| 992 VariableProxy(Handle<String> name, bool is_this, bool inside_with); | 1017 VariableProxy(Handle<String> name, bool is_this, bool inside_with); |
| 993 explicit VariableProxy(bool is_this); | 1018 explicit VariableProxy(bool is_this); |
| 994 | 1019 |
| 995 friend class Scope; | 1020 friend class Scope; |
| 996 }; | 1021 }; |
| 997 | 1022 |
| 998 | 1023 |
| 999 class VariableProxySentinel: public VariableProxy { | 1024 class VariableProxySentinel: public VariableProxy { |
| 1000 public: | 1025 public: |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1239 | 1264 |
| 1240 class CountOperation: public Expression { | 1265 class CountOperation: public Expression { |
| 1241 public: | 1266 public: |
| 1242 CountOperation(bool is_prefix, Token::Value op, Expression* expression) | 1267 CountOperation(bool is_prefix, Token::Value op, Expression* expression) |
| 1243 : is_prefix_(is_prefix), op_(op), expression_(expression) { | 1268 : is_prefix_(is_prefix), op_(op), expression_(expression) { |
| 1244 ASSERT(Token::IsCountOp(op)); | 1269 ASSERT(Token::IsCountOp(op)); |
| 1245 } | 1270 } |
| 1246 | 1271 |
| 1247 virtual void Accept(AstVisitor* v); | 1272 virtual void Accept(AstVisitor* v); |
| 1248 | 1273 |
| 1274 virtual CountOperation* AsCountOperation() { return this; } |
| 1275 |
| 1249 bool is_prefix() const { return is_prefix_; } | 1276 bool is_prefix() const { return is_prefix_; } |
| 1250 bool is_postfix() const { return !is_prefix_; } | 1277 bool is_postfix() const { return !is_prefix_; } |
| 1251 Token::Value op() const { return op_; } | 1278 Token::Value op() const { return op_; } |
| 1252 Token::Value binary_op() { | 1279 Token::Value binary_op() { |
| 1253 return op_ == Token::INC ? Token::ADD : Token::SUB; | 1280 return op_ == Token::INC ? Token::ADD : Token::SUB; |
| 1254 } | 1281 } |
| 1255 Expression* expression() const { return expression_; } | 1282 Expression* expression() const { return expression_; } |
| 1256 | 1283 |
| 1257 virtual void MarkAsStatement() { is_prefix_ = true; } | 1284 virtual void MarkAsStatement() { is_prefix_ = true; } |
| 1258 | 1285 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1317 public: | 1344 public: |
| 1318 Assignment(Token::Value op, Expression* target, Expression* value, int pos) | 1345 Assignment(Token::Value op, Expression* target, Expression* value, int pos) |
| 1319 : op_(op), target_(target), value_(value), pos_(pos), | 1346 : op_(op), target_(target), value_(value), pos_(pos), |
| 1320 block_start_(false), block_end_(false) { | 1347 block_start_(false), block_end_(false) { |
| 1321 ASSERT(Token::IsAssignmentOp(op)); | 1348 ASSERT(Token::IsAssignmentOp(op)); |
| 1322 } | 1349 } |
| 1323 | 1350 |
| 1324 virtual void Accept(AstVisitor* v); | 1351 virtual void Accept(AstVisitor* v); |
| 1325 virtual Assignment* AsAssignment() { return this; } | 1352 virtual Assignment* AsAssignment() { return this; } |
| 1326 | 1353 |
| 1354 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } |
| 1355 |
| 1327 Token::Value binary_op() const; | 1356 Token::Value binary_op() const; |
| 1328 | 1357 |
| 1329 Token::Value op() const { return op_; } | 1358 Token::Value op() const { return op_; } |
| 1330 Expression* target() const { return target_; } | 1359 Expression* target() const { return target_; } |
| 1331 Expression* value() const { return value_; } | 1360 Expression* value() const { return value_; } |
| 1332 int position() { return pos_; } | 1361 int position() { return pos_; } |
| 1333 // This check relies on the definition order of token in token.h. | 1362 // This check relies on the definition order of token in token.h. |
| 1334 bool is_compound() const { return op() > Token::ASSIGN; } | 1363 bool is_compound() const { return op() > Token::ASSIGN; } |
| 1335 | 1364 |
| 1336 // An initialization block is a series of statments of the form | 1365 // An initialization block is a series of statments of the form |
| (...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1876 #undef DEF_VISIT | 1905 #undef DEF_VISIT |
| 1877 | 1906 |
| 1878 private: | 1907 private: |
| 1879 bool stack_overflow_; | 1908 bool stack_overflow_; |
| 1880 }; | 1909 }; |
| 1881 | 1910 |
| 1882 | 1911 |
| 1883 } } // namespace v8::internal | 1912 } } // namespace v8::internal |
| 1884 | 1913 |
| 1885 #endif // V8_AST_H_ | 1914 #endif // V8_AST_H_ |
| OLD | NEW |