OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_PARSER_H_ | 5 #ifndef V8_PARSER_H_ |
6 #define V8_PARSER_H_ | 6 #define V8_PARSER_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/ast.h" | 9 #include "src/ast.h" |
10 #include "src/compiler.h" // For CachedDataMode | 10 #include "src/compiler.h" // For CachedDataMode |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 bool is_valid() { return !backing_.is_empty(); } | 55 bool is_valid() { return !backing_.is_empty(); } |
56 | 56 |
57 private: | 57 private: |
58 Vector<unsigned> backing_; | 58 Vector<unsigned> backing_; |
59 }; | 59 }; |
60 | 60 |
61 | 61 |
62 // Wrapper around ScriptData to provide parser-specific functionality. | 62 // Wrapper around ScriptData to provide parser-specific functionality. |
63 class ParseData { | 63 class ParseData { |
64 public: | 64 public: |
65 static ParseData* FromCachedData(ScriptData* cached_data) { | 65 explicit ParseData(ScriptData* script_data) : script_data_(script_data) { |
66 ParseData* pd = new ParseData(cached_data); | 66 CHECK(IsAligned(script_data->length(), sizeof(unsigned))); |
67 if (pd->IsSane()) return pd; | 67 CHECK(IsSane()); |
68 cached_data->Reject(); | |
69 delete pd; | |
70 return NULL; | |
71 } | 68 } |
72 | |
73 void Initialize(); | 69 void Initialize(); |
74 FunctionEntry GetFunctionEntry(int start); | 70 FunctionEntry GetFunctionEntry(int start); |
75 int FunctionCount(); | 71 int FunctionCount(); |
76 | 72 |
77 bool HasError(); | 73 bool HasError(); |
78 | 74 |
79 unsigned* Data() { // Writable data as unsigned int array. | 75 unsigned* Data() { // Writable data as unsigned int array. |
80 return reinterpret_cast<unsigned*>(const_cast<byte*>(script_data_->data())); | 76 return reinterpret_cast<unsigned*>(const_cast<byte*>(script_data_->data())); |
81 } | 77 } |
82 | 78 |
83 private: | 79 private: |
84 explicit ParseData(ScriptData* script_data) : script_data_(script_data) {} | |
85 | |
86 bool IsSane(); | 80 bool IsSane(); |
87 unsigned Magic(); | 81 unsigned Magic(); |
88 unsigned Version(); | 82 unsigned Version(); |
89 int FunctionsSize(); | 83 int FunctionsSize(); |
90 int Length() const { | 84 int Length() const { |
91 // Script data length is already checked to be a multiple of unsigned size. | 85 // Script data length is already checked to be a multiple of unsigned size. |
92 return script_data_->length() / sizeof(unsigned); | 86 return script_data_->length() / sizeof(unsigned); |
93 } | 87 } |
94 | 88 |
95 ScriptData* script_data_; | 89 ScriptData* script_data_; |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 // Called by ParseProgram after setting up the scanner. | 681 // Called by ParseProgram after setting up the scanner. |
688 FunctionLiteral* DoParseProgram(CompilationInfo* info, Scope** scope, | 682 FunctionLiteral* DoParseProgram(CompilationInfo* info, Scope** scope, |
689 Scope** ad_hoc_eval_scope); | 683 Scope** ad_hoc_eval_scope); |
690 | 684 |
691 void SetCachedData(); | 685 void SetCachedData(); |
692 | 686 |
693 bool inside_with() const { return scope_->inside_with(); } | 687 bool inside_with() const { return scope_->inside_with(); } |
694 ScriptCompiler::CompileOptions compile_options() const { | 688 ScriptCompiler::CompileOptions compile_options() const { |
695 return info_->compile_options(); | 689 return info_->compile_options(); |
696 } | 690 } |
697 bool consume_cached_parse_data() const { | |
698 return compile_options() == ScriptCompiler::kConsumeParserCache && | |
699 cached_parse_data_ != NULL; | |
700 } | |
701 bool produce_cached_parse_data() const { | |
702 return compile_options() == ScriptCompiler::kProduceParserCache; | |
703 } | |
704 Scope* DeclarationScope(VariableMode mode) { | 691 Scope* DeclarationScope(VariableMode mode) { |
705 return IsLexicalVariableMode(mode) | 692 return IsLexicalVariableMode(mode) |
706 ? scope_ : scope_->DeclarationScope(); | 693 ? scope_ : scope_->DeclarationScope(); |
707 } | 694 } |
708 | 695 |
709 // All ParseXXX functions take as the last argument an *ok parameter | 696 // All ParseXXX functions take as the last argument an *ok parameter |
710 // which is set to false if parsing failed; it is unchanged otherwise. | 697 // which is set to false if parsing failed; it is unchanged otherwise. |
711 // By making the 'exception handling' explicit, we are forced to check | 698 // By making the 'exception handling' explicit, we are forced to check |
712 // for failure at the call sites. | 699 // for failure at the call sites. |
713 void* ParseSourceElements(ZoneList<Statement*>* processor, int end_token, | 700 void* ParseSourceElements(ZoneList<Statement*>* processor, int end_token, |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 private: | 922 private: |
936 static const int kLiteralTypeSlot = 0; | 923 static const int kLiteralTypeSlot = 0; |
937 static const int kElementsSlot = 1; | 924 static const int kElementsSlot = 1; |
938 | 925 |
939 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); | 926 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); |
940 }; | 927 }; |
941 | 928 |
942 } } // namespace v8::internal | 929 } } // namespace v8::internal |
943 | 930 |
944 #endif // V8_PARSER_H_ | 931 #endif // V8_PARSER_H_ |
OLD | NEW |