OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 25 matching lines...) Expand all Loading... |
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; | 42 class FuncNameInferrer; |
43 class ParserLog; | 43 class ParserLog; |
44 class PositionStack; | 44 class PositionStack; |
45 class Target; | 45 class Target; |
46 class LexicalScope; | |
47 class SaveScope; | |
48 | 46 |
49 template <typename T> class ZoneListWrapper; | 47 template <typename T> class ZoneListWrapper; |
50 | 48 |
51 | 49 |
52 class ParserMessage : public Malloced { | 50 class ParserMessage : public Malloced { |
53 public: | 51 public: |
54 ParserMessage(Scanner::Location loc, const char* message, | 52 ParserMessage(Scanner::Location loc, const char* message, |
55 Vector<const char*> args) | 53 Vector<const char*> args) |
56 : loc_(loc), | 54 : loc_(loc), |
57 message_(message), | 55 message_(message), |
58 args_(args) { } | 56 args_(args) { } |
59 ~ParserMessage(); | 57 ~ParserMessage(); |
60 Scanner::Location location() { return loc_; } | 58 Scanner::Location location() { return loc_; } |
61 const char* message() { return message_; } | 59 const char* message() { return message_; } |
62 Vector<const char*> args() { return args_; } | 60 Vector<const char*> args() { return args_; } |
63 private: | 61 private: |
64 Scanner::Location loc_; | 62 Scanner::Location loc_; |
65 const char* message_; | 63 const char* message_; |
66 Vector<const char*> args_; | 64 Vector<const char*> args_; |
67 }; | 65 }; |
68 | 66 |
69 | 67 |
70 class FunctionEntry BASE_EMBEDDED { | 68 class FunctionEntry BASE_EMBEDDED { |
71 public: | 69 public: |
| 70 enum { |
| 71 kStartPositionIndex, |
| 72 kEndPositionIndex, |
| 73 kLiteralCountIndex, |
| 74 kPropertyCountIndex, |
| 75 kStrictModeIndex, |
| 76 kSize |
| 77 }; |
| 78 |
72 explicit FunctionEntry(Vector<unsigned> backing) : backing_(backing) { } | 79 explicit FunctionEntry(Vector<unsigned> backing) : backing_(backing) { } |
73 FunctionEntry() : backing_(Vector<unsigned>::empty()) { } | 80 FunctionEntry() : backing_(Vector<unsigned>::empty()) { } |
74 | 81 |
75 int start_pos() { return backing_[kStartPosOffset]; } | 82 int start_pos() { return backing_[kStartPositionIndex]; } |
76 int end_pos() { return backing_[kEndPosOffset]; } | 83 int end_pos() { return backing_[kEndPositionIndex]; } |
77 int literal_count() { return backing_[kLiteralCountOffset]; } | 84 int literal_count() { return backing_[kLiteralCountIndex]; } |
78 int property_count() { return backing_[kPropertyCountOffset]; } | 85 int property_count() { return backing_[kPropertyCountIndex]; } |
79 StrictModeFlag strict_mode_flag() { | 86 StrictModeFlag strict_mode_flag() { |
80 ASSERT(backing_[kStrictModeOffset] == kStrictMode || | 87 ASSERT(backing_[kStrictModeIndex] == kStrictMode || |
81 backing_[kStrictModeOffset] == kNonStrictMode); | 88 backing_[kStrictModeIndex] == kNonStrictMode); |
82 return static_cast<StrictModeFlag>(backing_[kStrictModeOffset]); | 89 return static_cast<StrictModeFlag>(backing_[kStrictModeIndex]); |
83 } | 90 } |
84 | 91 |
85 bool is_valid() { return backing_.length() > 0; } | 92 bool is_valid() { return !backing_.is_empty(); } |
86 | |
87 static const int kSize = 5; | |
88 | 93 |
89 private: | 94 private: |
90 Vector<unsigned> backing_; | 95 Vector<unsigned> backing_; |
91 static const int kStartPosOffset = 0; | |
92 static const int kEndPosOffset = 1; | |
93 static const int kLiteralCountOffset = 2; | |
94 static const int kPropertyCountOffset = 3; | |
95 static const int kStrictModeOffset = 4; | |
96 }; | 96 }; |
97 | 97 |
98 | 98 |
99 class ScriptDataImpl : public ScriptData { | 99 class ScriptDataImpl : public ScriptData { |
100 public: | 100 public: |
101 explicit ScriptDataImpl(Vector<unsigned> store) | 101 explicit ScriptDataImpl(Vector<unsigned> store) |
102 : store_(store), | 102 : store_(store), |
103 owns_store_(true) { } | 103 owns_store_(true) { } |
104 | 104 |
105 // Create an empty ScriptDataImpl that is guaranteed to not satisfy | 105 // Create an empty ScriptDataImpl that is guaranteed to not satisfy |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 Vector<Handle<String> > args); | 444 Vector<Handle<String> > args); |
445 void SetHarmonyScoping(bool block_scoping); | 445 void SetHarmonyScoping(bool block_scoping); |
446 | 446 |
447 private: | 447 private: |
448 // Limit on number of function parameters is chosen arbitrarily. | 448 // Limit on number of function parameters is chosen arbitrarily. |
449 // Code::Flags uses only the low 17 bits of num-parameters to | 449 // Code::Flags uses only the low 17 bits of num-parameters to |
450 // construct a hashable id, so if more than 2^17 are allowed, this | 450 // construct a hashable id, so if more than 2^17 are allowed, this |
451 // should be checked. | 451 // should be checked. |
452 static const int kMaxNumFunctionParameters = 32766; | 452 static const int kMaxNumFunctionParameters = 32766; |
453 static const int kMaxNumFunctionLocals = 32767; | 453 static const int kMaxNumFunctionLocals = 32767; |
454 FunctionLiteral* ParseLazy(CompilationInfo* info, | 454 |
455 UC16CharacterStream* source, | |
456 ZoneScope* zone_scope); | |
457 enum Mode { | 455 enum Mode { |
458 PARSE_LAZILY, | 456 PARSE_LAZILY, |
459 PARSE_EAGERLY | 457 PARSE_EAGERLY |
460 }; | 458 }; |
461 | 459 |
462 enum VariableDeclarationContext { | 460 enum VariableDeclarationContext { |
463 kSourceElement, | 461 kSourceElement, |
464 kStatement, | 462 kStatement, |
465 kForStatement | 463 kForStatement |
466 }; | 464 }; |
467 | 465 |
468 // If a list of variable declarations includes any initializers. | 466 // If a list of variable declarations includes any initializers. |
469 enum VariableDeclarationProperties { | 467 enum VariableDeclarationProperties { |
470 kHasInitializers, | 468 kHasInitializers, |
471 kHasNoInitializers | 469 kHasNoInitializers |
472 }; | 470 }; |
473 | 471 |
| 472 class BlockState; |
| 473 class FunctionState; |
| 474 |
| 475 FunctionLiteral* ParseLazy(CompilationInfo* info, |
| 476 UC16CharacterStream* source, |
| 477 ZoneScope* zone_scope); |
| 478 |
474 Isolate* isolate() { return isolate_; } | 479 Isolate* isolate() { return isolate_; } |
475 Zone* zone() { return isolate_->zone(); } | 480 Zone* zone() { return isolate_->zone(); } |
476 | 481 |
477 // Called by ParseProgram after setting up the scanner. | 482 // Called by ParseProgram after setting up the scanner. |
478 FunctionLiteral* DoParseProgram(Handle<String> source, | 483 FunctionLiteral* DoParseProgram(Handle<String> source, |
479 bool in_global_context, | 484 bool in_global_context, |
480 StrictModeFlag strict_mode, | 485 StrictModeFlag strict_mode, |
481 ZoneScope* zone_scope); | 486 ZoneScope* zone_scope); |
482 | 487 |
483 // Report syntax error | 488 // Report syntax error |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 Vector< Handle<Object> > arguments); | 728 Vector< Handle<Object> > arguments); |
724 | 729 |
725 Isolate* isolate_; | 730 Isolate* isolate_; |
726 ZoneList<Handle<String> > symbol_cache_; | 731 ZoneList<Handle<String> > symbol_cache_; |
727 | 732 |
728 Handle<Script> script_; | 733 Handle<Script> script_; |
729 Scanner scanner_; | 734 Scanner scanner_; |
730 | 735 |
731 Scope* top_scope_; | 736 Scope* top_scope_; |
732 | 737 |
733 LexicalScope* lexical_scope_; | 738 FunctionState* current_function_state_; |
734 Mode mode_; | 739 Mode mode_; |
735 | 740 |
736 Target* target_stack_; // for break, continue statements | 741 Target* target_stack_; // for break, continue statements |
737 bool allow_natives_syntax_; | 742 bool allow_natives_syntax_; |
738 v8::Extension* extension_; | 743 v8::Extension* extension_; |
739 bool is_pre_parsing_; | 744 bool is_pre_parsing_; |
740 ScriptDataImpl* pre_data_; | 745 ScriptDataImpl* pre_data_; |
741 FuncNameInferrer* fni_; | 746 FuncNameInferrer* fni_; |
742 bool stack_overflow_; | 747 bool stack_overflow_; |
743 // If true, the next (and immediately following) function literal is | 748 // If true, the next (and immediately following) function literal is |
744 // preceded by a parenthesis. | 749 // preceded by a parenthesis. |
745 // Heuristically that means that the function will be called immediately, | 750 // Heuristically that means that the function will be called immediately, |
746 // so never lazily compile it. | 751 // so never lazily compile it. |
747 bool parenthesized_function_; | 752 bool parenthesized_function_; |
748 bool harmony_scoping_; | 753 bool harmony_scoping_; |
749 | 754 |
750 friend class LexicalScope; | 755 friend class BlockState; |
751 friend class SaveScope; | 756 friend class FunctionState; |
752 }; | 757 }; |
753 | 758 |
754 | 759 |
755 // Support for handling complex values (array and object literals) that | 760 // Support for handling complex values (array and object literals) that |
756 // can be fully handled at compile time. | 761 // can be fully handled at compile time. |
757 class CompileTimeValue: public AllStatic { | 762 class CompileTimeValue: public AllStatic { |
758 public: | 763 public: |
759 enum Type { | 764 enum Type { |
760 OBJECT_LITERAL_FAST_ELEMENTS, | 765 OBJECT_LITERAL_FAST_ELEMENTS, |
761 OBJECT_LITERAL_SLOW_ELEMENTS, | 766 OBJECT_LITERAL_SLOW_ELEMENTS, |
(...skipping 16 matching lines...) Expand all Loading... |
778 private: | 783 private: |
779 static const int kTypeSlot = 0; | 784 static const int kTypeSlot = 0; |
780 static const int kElementsSlot = 1; | 785 static const int kElementsSlot = 1; |
781 | 786 |
782 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); | 787 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); |
783 }; | 788 }; |
784 | 789 |
785 } } // namespace v8::internal | 790 } } // namespace v8::internal |
786 | 791 |
787 #endif // V8_PARSER_H_ | 792 #endif // V8_PARSER_H_ |
OLD | NEW |