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 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 delete reusable_preparser_; | 432 delete reusable_preparser_; |
433 reusable_preparser_ = NULL; | 433 reusable_preparser_ = NULL; |
434 } | 434 } |
435 | 435 |
436 // Parses the source code represented by the compilation info and sets its | 436 // Parses the source code represented by the compilation info and sets its |
437 // function literal. Returns false (and deallocates any allocated AST | 437 // function literal. Returns false (and deallocates any allocated AST |
438 // nodes) if parsing failed. | 438 // nodes) if parsing failed. |
439 static bool Parse(CompilationInfo* info) { return Parser(info).Parse(); } | 439 static bool Parse(CompilationInfo* info) { return Parser(info).Parse(); } |
440 bool Parse(); | 440 bool Parse(); |
441 | 441 |
442 void ReportMessageAt(Scanner::Location loc, | |
443 const char* message, | |
444 Vector<const char*> args = Vector<const char*>::empty()); | |
445 void ReportMessageAt(Scanner::Location loc, | |
446 const char* message, | |
447 Vector<Handle<String> > args); | |
448 | |
449 private: | 442 private: |
450 static const int kMaxNumFunctionLocals = 131071; // 2^17-1 | 443 static const int kMaxNumFunctionLocals = 131071; // 2^17-1 |
451 | 444 |
452 enum Mode { | 445 enum Mode { |
453 PARSE_LAZILY, | 446 PARSE_LAZILY, |
454 PARSE_EAGERLY | 447 PARSE_EAGERLY |
455 }; | 448 }; |
456 | 449 |
457 enum VariableDeclarationContext { | 450 enum VariableDeclarationContext { |
458 kModuleElement, | 451 kModuleElement, |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 | 548 |
556 // Called by ParseProgram after setting up the scanner. | 549 // Called by ParseProgram after setting up the scanner. |
557 FunctionLiteral* DoParseProgram(CompilationInfo* info, | 550 FunctionLiteral* DoParseProgram(CompilationInfo* info, |
558 Handle<String> source); | 551 Handle<String> source); |
559 | 552 |
560 // Report syntax error | 553 // Report syntax error |
561 void ReportUnexpectedToken(Token::Value token); | 554 void ReportUnexpectedToken(Token::Value token); |
562 void ReportInvalidPreparseData(Handle<String> name, bool* ok); | 555 void ReportInvalidPreparseData(Handle<String> name, bool* ok); |
563 void ReportMessage(const char* message, Vector<const char*> args); | 556 void ReportMessage(const char* message, Vector<const char*> args); |
564 void ReportMessage(const char* message, Vector<Handle<String> > args); | 557 void ReportMessage(const char* message, Vector<Handle<String> > args); |
| 558 void ReportMessageAt(Scanner::Location location, const char* type) { |
| 559 ReportMessageAt(location, type, Vector<const char*>::empty()); |
| 560 } |
| 561 void ReportMessageAt(Scanner::Location loc, |
| 562 const char* message, |
| 563 Vector<const char*> args); |
| 564 void ReportMessageAt(Scanner::Location loc, |
| 565 const char* message, |
| 566 Vector<Handle<String> > args); |
565 | 567 |
566 void set_pre_parse_data(ScriptDataImpl *data) { | 568 void set_pre_parse_data(ScriptDataImpl *data) { |
567 pre_parse_data_ = data; | 569 pre_parse_data_ = data; |
568 symbol_cache_.Initialize(data ? data->symbol_count() : 0, zone()); | 570 symbol_cache_.Initialize(data ? data->symbol_count() : 0, zone()); |
569 } | 571 } |
570 | 572 |
571 bool inside_with() const { return top_scope_->inside_with(); } | 573 bool inside_with() const { return top_scope_->inside_with(); } |
572 Scanner& scanner() { return scanner_; } | 574 Scanner& scanner() { return scanner_; } |
573 int position() { return scanner_.location().beg_pos; } | |
574 int peek_position() { return scanner_.peek_location().beg_pos; } | |
575 Mode mode() const { return mode_; } | 575 Mode mode() const { return mode_; } |
576 ScriptDataImpl* pre_parse_data() const { return pre_parse_data_; } | 576 ScriptDataImpl* pre_parse_data() const { return pre_parse_data_; } |
577 bool is_extended_mode() { | 577 bool is_extended_mode() { |
578 ASSERT(top_scope_ != NULL); | 578 ASSERT(top_scope_ != NULL); |
579 return top_scope_->is_extended_mode(); | 579 return top_scope_->is_extended_mode(); |
580 } | 580 } |
581 Scope* DeclarationScope(VariableMode mode) { | 581 Scope* DeclarationScope(VariableMode mode) { |
582 return IsLexicalVariableMode(mode) | 582 return IsLexicalVariableMode(mode) |
583 ? top_scope_ : top_scope_->DeclarationScope(); | 583 ? top_scope_ : top_scope_->DeclarationScope(); |
584 } | 584 } |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 bool* ok); | 687 bool* ok); |
688 | 688 |
689 | 689 |
690 // Magical syntax support. | 690 // Magical syntax support. |
691 Expression* ParseV8Intrinsic(bool* ok); | 691 Expression* ParseV8Intrinsic(bool* ok); |
692 | 692 |
693 bool is_generator() const { return current_function_state_->is_generator(); } | 693 bool is_generator() const { return current_function_state_->is_generator(); } |
694 | 694 |
695 bool CheckInOrOf(bool accept_OF, ForEachStatement::VisitMode* visit_mode); | 695 bool CheckInOrOf(bool accept_OF, ForEachStatement::VisitMode* visit_mode); |
696 | 696 |
697 bool CheckContextualKeyword(Vector<const char> keyword); | |
698 void ExpectContextualKeyword(Vector<const char> keyword, bool* ok); | |
699 | |
700 Handle<String> LiteralString(PretenureFlag tenured) { | 697 Handle<String> LiteralString(PretenureFlag tenured) { |
701 if (scanner().is_literal_ascii()) { | 698 if (scanner().is_literal_ascii()) { |
702 return isolate_->factory()->NewStringFromAscii( | 699 return isolate_->factory()->NewStringFromAscii( |
703 scanner().literal_ascii_string(), tenured); | 700 scanner().literal_ascii_string(), tenured); |
704 } else { | 701 } else { |
705 return isolate_->factory()->NewStringFromTwoByte( | 702 return isolate_->factory()->NewStringFromTwoByte( |
706 scanner().literal_utf16_string(), tenured); | 703 scanner().literal_utf16_string(), tenured); |
707 } | 704 } |
708 } | 705 } |
709 | 706 |
(...skipping 24 matching lines...) Expand all Loading... |
734 // Determine if the expression is a variable proxy and mark it as being used | 731 // Determine if the expression is a variable proxy and mark it as being used |
735 // in an assignment or with a increment/decrement operator. This is currently | 732 // in an assignment or with a increment/decrement operator. This is currently |
736 // used on for the statically checking assignments to harmony const bindings. | 733 // used on for the statically checking assignments to harmony const bindings. |
737 void MarkAsLValue(Expression* expression); | 734 void MarkAsLValue(Expression* expression); |
738 | 735 |
739 // Strict mode validation of LValue expressions | 736 // Strict mode validation of LValue expressions |
740 void CheckStrictModeLValue(Expression* expression, | 737 void CheckStrictModeLValue(Expression* expression, |
741 const char* error, | 738 const char* error, |
742 bool* ok); | 739 bool* ok); |
743 | 740 |
744 // Strict mode octal literal validation. | |
745 void CheckOctalLiteral(int beg_pos, int end_pos, bool* ok); | |
746 | |
747 // For harmony block scoping mode: Check if the scope has conflicting var/let | 741 // For harmony block scoping mode: Check if the scope has conflicting var/let |
748 // declarations from different scopes. It covers for example | 742 // declarations from different scopes. It covers for example |
749 // | 743 // |
750 // function f() { { { var x; } let x; } } | 744 // function f() { { { var x; } let x; } } |
751 // function g() { { var x; let x; } } | 745 // function g() { { var x; let x; } } |
752 // | 746 // |
753 // The var declarations are hoisted to the function scope, but originate from | 747 // The var declarations are hoisted to the function scope, but originate from |
754 // a scope where the name has also been let bound or the var declaration is | 748 // a scope where the name has also been let bound or the var declaration is |
755 // hoisted over such a scope. | 749 // hoisted over such a scope. |
756 void CheckConflictingVarDeclarations(Scope* scope, bool* ok); | 750 void CheckConflictingVarDeclarations(Scope* scope, bool* ok); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 // If true, the next (and immediately following) function literal is | 813 // If true, the next (and immediately following) function literal is |
820 // preceded by a parenthesis. | 814 // preceded by a parenthesis. |
821 // Heuristically that means that the function will be called immediately, | 815 // Heuristically that means that the function will be called immediately, |
822 // so never lazily compile it. | 816 // so never lazily compile it. |
823 bool parenthesized_function_; | 817 bool parenthesized_function_; |
824 | 818 |
825 Zone* zone_; | 819 Zone* zone_; |
826 CompilationInfo* info_; | 820 CompilationInfo* info_; |
827 friend class BlockState; | 821 friend class BlockState; |
828 friend class FunctionState; | 822 friend class FunctionState; |
829 friend class ObjectLiteralChecker<Parser>; | |
830 }; | 823 }; |
831 | 824 |
832 | 825 |
833 // Support for handling complex values (array and object literals) that | 826 // Support for handling complex values (array and object literals) that |
834 // can be fully handled at compile time. | 827 // can be fully handled at compile time. |
835 class CompileTimeValue: public AllStatic { | 828 class CompileTimeValue: public AllStatic { |
836 public: | 829 public: |
837 enum LiteralType { | 830 enum LiteralType { |
838 OBJECT_LITERAL_FAST_ELEMENTS, | 831 OBJECT_LITERAL_FAST_ELEMENTS, |
839 OBJECT_LITERAL_SLOW_ELEMENTS, | 832 OBJECT_LITERAL_SLOW_ELEMENTS, |
(...skipping 14 matching lines...) Expand all Loading... |
854 private: | 847 private: |
855 static const int kLiteralTypeSlot = 0; | 848 static const int kLiteralTypeSlot = 0; |
856 static const int kElementsSlot = 1; | 849 static const int kElementsSlot = 1; |
857 | 850 |
858 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); | 851 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); |
859 }; | 852 }; |
860 | 853 |
861 } } // namespace v8::internal | 854 } } // namespace v8::internal |
862 | 855 |
863 #endif // V8_PARSER_H_ | 856 #endif // V8_PARSER_H_ |
OLD | NEW |