| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 21 matching lines...) Expand all Loading... |
| 32 #include "ast.h" | 32 #include "ast.h" |
| 33 #include "preparse-data-format.h" | 33 #include "preparse-data-format.h" |
| 34 #include "preparse-data.h" | 34 #include "preparse-data.h" |
| 35 #include "scopes.h" | 35 #include "scopes.h" |
| 36 #include "preparser.h" | 36 #include "preparser.h" |
| 37 | 37 |
| 38 namespace v8 { | 38 namespace v8 { |
| 39 namespace internal { | 39 namespace internal { |
| 40 | 40 |
| 41 class CompilationInfo; | 41 class CompilationInfo; |
| 42 class FuncNameInferrer; | |
| 43 class ParserLog; | 42 class ParserLog; |
| 44 class PositionStack; | 43 class PositionStack; |
| 45 class Target; | 44 class Target; |
| 46 | 45 |
| 47 template <typename T> class ZoneListWrapper; | 46 template <typename T> class ZoneListWrapper; |
| 48 | 47 |
| 49 | 48 |
| 50 class FunctionEntry BASE_EMBEDDED { | 49 class FunctionEntry BASE_EMBEDDED { |
| 51 public: | 50 public: |
| 52 enum { | 51 enum { |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 | 412 |
| 414 // Types used by FunctionState and BlockState. | 413 // Types used by FunctionState and BlockState. |
| 415 typedef v8::internal::Scope Scope; | 414 typedef v8::internal::Scope Scope; |
| 416 typedef AstNodeFactory<AstConstructionVisitor> Factory; | 415 typedef AstNodeFactory<AstConstructionVisitor> Factory; |
| 417 typedef Variable GeneratorVariable; | 416 typedef Variable GeneratorVariable; |
| 418 typedef v8::internal::Zone Zone; | 417 typedef v8::internal::Zone Zone; |
| 419 | 418 |
| 420 // Return types for traversing functions. | 419 // Return types for traversing functions. |
| 421 typedef Handle<String> Identifier; | 420 typedef Handle<String> Identifier; |
| 422 typedef v8::internal::Expression* Expression; | 421 typedef v8::internal::Expression* Expression; |
| 422 typedef v8::internal::FunctionLiteral* FunctionLiteral; |
| 423 typedef v8::internal::Literal* Literal; |
| 424 typedef ObjectLiteral::Property* ObjectLiteralProperty; |
| 423 typedef ZoneList<v8::internal::Expression*>* ExpressionList; | 425 typedef ZoneList<v8::internal::Expression*>* ExpressionList; |
| 426 typedef ZoneList<ObjectLiteral::Property*>* PropertyList; |
| 424 }; | 427 }; |
| 425 | 428 |
| 426 explicit ParserTraits(Parser* parser) : parser_(parser) {} | 429 explicit ParserTraits(Parser* parser) : parser_(parser) {} |
| 427 | 430 |
| 428 // Custom operations executed when FunctionStates are created and destructed. | 431 // Custom operations executed when FunctionStates are created and destructed. |
| 429 template<typename FunctionState> | 432 template<typename FunctionState> |
| 430 static void SetUpFunctionState(FunctionState* function_state, Zone* zone) { | 433 static void SetUpFunctionState(FunctionState* function_state, Zone* zone) { |
| 431 Isolate* isolate = zone->isolate(); | 434 Isolate* isolate = zone->isolate(); |
| 432 function_state->isolate_ = isolate; | 435 function_state->isolate_ = isolate; |
| 433 function_state->saved_ast_node_id_ = isolate->ast_node_id(); | 436 function_state->saved_ast_node_id_ = isolate->ast_node_id(); |
| 434 isolate->set_ast_node_id(BailoutId::FirstUsable().ToInt()); | 437 isolate->set_ast_node_id(BailoutId::FirstUsable().ToInt()); |
| 435 } | 438 } |
| 436 | 439 |
| 437 template<typename FunctionState> | 440 template<typename FunctionState> |
| 438 static void TearDownFunctionState(FunctionState* function_state) { | 441 static void TearDownFunctionState(FunctionState* function_state) { |
| 439 if (function_state->outer_function_state_ != NULL) { | 442 if (function_state->outer_function_state_ != NULL) { |
| 440 function_state->isolate_->set_ast_node_id( | 443 function_state->isolate_->set_ast_node_id( |
| 441 function_state->saved_ast_node_id_); | 444 function_state->saved_ast_node_id_); |
| 442 } | 445 } |
| 443 } | 446 } |
| 444 | 447 |
| 445 // Helper functions for recursive descent. | 448 // Helper functions for recursive descent. |
| 446 bool IsEvalOrArguments(Handle<String> identifier) const; | 449 bool IsEvalOrArguments(Handle<String> identifier) const; |
| 447 | 450 |
| 451 static bool IsBoilerplateProperty(ObjectLiteral::Property* property) { |
| 452 return ObjectLiteral::IsBoilerplateProperty(property); |
| 453 } |
| 454 |
| 455 static bool IsArrayIndex(Handle<String> string, uint32_t* index) { |
| 456 return !string.is_null() && string->AsArrayIndex(index); |
| 457 } |
| 458 |
| 459 static void PushLiteralName(FuncNameInferrer* fni, Handle<String> id) { |
| 460 fni->PushLiteralName(id); |
| 461 } |
| 462 |
| 463 static void CheckFunctionLiteralInsideTopLevelObjectLiteral( |
| 464 Scope* scope, Expression* value, bool* has_function) { |
| 465 if (scope->DeclarationScope()->is_global_scope() && |
| 466 value->AsFunctionLiteral() != NULL) { |
| 467 *has_function = true; |
| 468 value->AsFunctionLiteral()->set_pretenure(); |
| 469 } |
| 470 } |
| 471 |
| 448 // Reporting errors. | 472 // Reporting errors. |
| 449 void ReportMessageAt(Scanner::Location source_location, | 473 void ReportMessageAt(Scanner::Location source_location, |
| 450 const char* message, | 474 const char* message, |
| 451 Vector<const char*> args); | 475 Vector<const char*> args); |
| 452 void ReportMessage(const char* message, Vector<Handle<String> > args); | 476 void ReportMessage(const char* message, Vector<Handle<String> > args); |
| 453 void ReportMessageAt(Scanner::Location source_location, | 477 void ReportMessageAt(Scanner::Location source_location, |
| 454 const char* message, | 478 const char* message, |
| 455 Vector<Handle<String> > args); | 479 Vector<Handle<String> > args); |
| 456 | 480 |
| 457 // "null" return type creators. | 481 // "null" return type creators. |
| 458 static Handle<String> EmptyIdentifier() { | 482 static Handle<String> EmptyIdentifier() { |
| 459 return Handle<String>(); | 483 return Handle<String>(); |
| 460 } | 484 } |
| 461 static Expression* EmptyExpression() { | 485 static Expression* EmptyExpression() { |
| 462 return NULL; | 486 return NULL; |
| 463 } | 487 } |
| 488 static Literal* EmptyLiteral() { |
| 489 return NULL; |
| 490 } |
| 464 | 491 |
| 465 // Odd-ball literal creators. | 492 // Odd-ball literal creators. |
| 466 Literal* GetLiteralTheHole(int position, | 493 Literal* GetLiteralTheHole(int position, |
| 467 AstNodeFactory<AstConstructionVisitor>* factory); | 494 AstNodeFactory<AstConstructionVisitor>* factory); |
| 468 | 495 |
| 469 // Producing data during the recursive descent. | 496 // Producing data during the recursive descent. |
| 470 Handle<String> GetSymbol(Scanner* scanner = NULL); | 497 Handle<String> GetSymbol(Scanner* scanner = NULL); |
| 471 Handle<String> NextLiteralString(Scanner* scanner, | 498 Handle<String> NextLiteralString(Scanner* scanner, |
| 472 PretenureFlag tenured); | 499 PretenureFlag tenured); |
| 473 Expression* ThisExpression(Scope* scope, | 500 Expression* ThisExpression(Scope* scope, |
| 474 AstNodeFactory<AstConstructionVisitor>* factory); | 501 AstNodeFactory<AstConstructionVisitor>* factory); |
| 475 Expression* ExpressionFromLiteral( | 502 Literal* ExpressionFromLiteral( |
| 476 Token::Value token, int pos, Scanner* scanner, | 503 Token::Value token, int pos, Scanner* scanner, |
| 477 AstNodeFactory<AstConstructionVisitor>* factory); | 504 AstNodeFactory<AstConstructionVisitor>* factory); |
| 478 Expression* ExpressionFromIdentifier( | 505 Expression* ExpressionFromIdentifier( |
| 479 Handle<String> name, int pos, Scope* scope, | 506 Handle<String> name, int pos, Scope* scope, |
| 480 AstNodeFactory<AstConstructionVisitor>* factory); | 507 AstNodeFactory<AstConstructionVisitor>* factory); |
| 481 Expression* ExpressionFromString( | 508 Expression* ExpressionFromString( |
| 482 int pos, Scanner* scanner, | 509 int pos, Scanner* scanner, |
| 483 AstNodeFactory<AstConstructionVisitor>* factory); | 510 AstNodeFactory<AstConstructionVisitor>* factory); |
| 484 ZoneList<v8::internal::Expression*>* NewExpressionList(int size, Zone* zone) { | 511 ZoneList<v8::internal::Expression*>* NewExpressionList(int size, Zone* zone) { |
| 485 return new(zone) ZoneList<v8::internal::Expression*>(size, zone); | 512 return new(zone) ZoneList<v8::internal::Expression*>(size, zone); |
| 486 } | 513 } |
| 514 ZoneList<ObjectLiteral::Property*>* NewPropertyList(int size, Zone* zone) { |
| 515 return new(zone) ZoneList<ObjectLiteral::Property*>(size, zone); |
| 516 } |
| 487 | 517 |
| 488 // Temporary glue; these functions will move to ParserBase. | 518 // Temporary glue; these functions will move to ParserBase. |
| 489 Expression* ParseObjectLiteral(bool* ok); | |
| 490 Expression* ParseAssignmentExpression(bool accept_IN, bool* ok); | 519 Expression* ParseAssignmentExpression(bool accept_IN, bool* ok); |
| 491 Expression* ParseV8Intrinsic(bool* ok); | 520 Expression* ParseV8Intrinsic(bool* ok); |
| 521 FunctionLiteral* ParseFunctionLiteral( |
| 522 Handle<String> name, |
| 523 Scanner::Location function_name_location, |
| 524 bool name_is_strict_reserved, |
| 525 bool is_generator, |
| 526 int function_token_position, |
| 527 FunctionLiteral::FunctionType type, |
| 528 bool* ok); |
| 492 | 529 |
| 493 private: | 530 private: |
| 494 Parser* parser_; | 531 Parser* parser_; |
| 495 }; | 532 }; |
| 496 | 533 |
| 497 | 534 |
| 498 class Parser : public ParserBase<ParserTraits> { | 535 class Parser : public ParserBase<ParserTraits> { |
| 499 public: | 536 public: |
| 500 explicit Parser(CompilationInfo* info); | 537 explicit Parser(CompilationInfo* info); |
| 501 ~Parser() { | 538 ~Parser() { |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 | 779 |
| 743 Isolate* isolate_; | 780 Isolate* isolate_; |
| 744 ZoneList<Handle<String> > symbol_cache_; | 781 ZoneList<Handle<String> > symbol_cache_; |
| 745 | 782 |
| 746 Handle<Script> script_; | 783 Handle<Script> script_; |
| 747 Scanner scanner_; | 784 Scanner scanner_; |
| 748 PreParser* reusable_preparser_; | 785 PreParser* reusable_preparser_; |
| 749 Scope* original_scope_; // for ES5 function declarations in sloppy eval | 786 Scope* original_scope_; // for ES5 function declarations in sloppy eval |
| 750 Target* target_stack_; // for break, continue statements | 787 Target* target_stack_; // for break, continue statements |
| 751 ScriptDataImpl* pre_parse_data_; | 788 ScriptDataImpl* pre_parse_data_; |
| 752 FuncNameInferrer* fni_; | |
| 753 | 789 |
| 754 Mode mode_; | 790 Mode mode_; |
| 755 | 791 |
| 756 CompilationInfo* info_; | 792 CompilationInfo* info_; |
| 757 }; | 793 }; |
| 758 | 794 |
| 759 | 795 |
| 760 // Support for handling complex values (array and object literals) that | 796 // Support for handling complex values (array and object literals) that |
| 761 // can be fully handled at compile time. | 797 // can be fully handled at compile time. |
| 762 class CompileTimeValue: public AllStatic { | 798 class CompileTimeValue: public AllStatic { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 781 private: | 817 private: |
| 782 static const int kLiteralTypeSlot = 0; | 818 static const int kLiteralTypeSlot = 0; |
| 783 static const int kElementsSlot = 1; | 819 static const int kElementsSlot = 1; |
| 784 | 820 |
| 785 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); | 821 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); |
| 786 }; | 822 }; |
| 787 | 823 |
| 788 } } // namespace v8::internal | 824 } } // namespace v8::internal |
| 789 | 825 |
| 790 #endif // V8_PARSER_H_ | 826 #endif // V8_PARSER_H_ |
| OLD | NEW |