Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/parser.cc

Issue 974213002: Extract ParseInfo from CompilationInfo. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parser.h ('k') | src/preparse-data.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
11 #include "src/bootstrapper.h" 11 #include "src/bootstrapper.h"
12 #include "src/char-predicates-inl.h" 12 #include "src/char-predicates-inl.h"
13 #include "src/codegen.h" 13 #include "src/codegen.h"
14 #include "src/compiler.h" 14 #include "src/compiler.h"
15 #include "src/messages.h" 15 #include "src/messages.h"
16 #include "src/parser.h" 16 #include "src/parser.h"
17 #include "src/preparser.h" 17 #include "src/preparser.h"
18 #include "src/runtime/runtime.h" 18 #include "src/runtime/runtime.h"
19 #include "src/scanner-character-streams.h" 19 #include "src/scanner-character-streams.h"
20 #include "src/scopeinfo.h" 20 #include "src/scopeinfo.h"
21 #include "src/string-stream.h" 21 #include "src/string-stream.h"
22 22
23 namespace v8 { 23 namespace v8 {
24 namespace internal { 24 namespace internal {
25 25
26 ScriptData::ScriptData(const byte* data, int length)
27 : owns_data_(false), rejected_(false), data_(data), length_(length) {
28 if (!IsAligned(reinterpret_cast<intptr_t>(data), kPointerAlignment)) {
29 byte* copy = NewArray<byte>(length);
30 DCHECK(IsAligned(reinterpret_cast<intptr_t>(copy), kPointerAlignment));
31 CopyBytes(copy, data, length);
32 data_ = copy;
33 AcquireDataOwnership();
34 }
35 }
36
37
38 ParseInfo* ParseInfo::InitializeFromJSFunction(Handle<JSFunction> function) {
39 Handle<SharedFunctionInfo> shared(function->shared());
40 InitializeFromSharedFunctionInfo(shared);
41 set_closure(function);
42 set_context(Handle<Context>(function->context()));
43 return this;
44 }
45
46
47 ParseInfo* ParseInfo::InitializeFromSharedFunctionInfo(
48 Handle<SharedFunctionInfo> shared) {
49 isolate_ = shared->GetIsolate();
50
51 set_lazy();
52 set_this_has_uses();
53 set_hash_seed(isolate_->heap()->HashSeed());
54 set_stack_limit(isolate_->stack_guard()->real_climit());
55 set_unicode_cache(isolate_->unicode_cache());
56 set_language_mode(shared->language_mode());
57 set_shared_info(shared);
58
59 Handle<Script> script(Script::cast(shared->script()));
60 set_script(script);
61 if (!script.is_null() && script->type()->value() == Script::TYPE_NATIVE) {
62 set_native();
63 }
64 return this;
65 }
66
67
68 ParseInfo* ParseInfo::InitializeFromScript(Handle<Script> script) {
69 isolate_ = script->GetIsolate();
70
71 set_this_has_uses();
72 set_hash_seed(isolate_->heap()->HashSeed());
73 set_stack_limit(isolate_->stack_guard()->real_climit());
74 set_unicode_cache(isolate_->unicode_cache());
75 set_script(script);
76
77 if (script->type()->value() == Script::TYPE_NATIVE) {
78 set_native();
79 }
80 return this;
81 }
82
83
26 RegExpBuilder::RegExpBuilder(Zone* zone) 84 RegExpBuilder::RegExpBuilder(Zone* zone)
27 : zone_(zone), 85 : zone_(zone),
28 pending_empty_(false), 86 pending_empty_(false),
29 characters_(NULL), 87 characters_(NULL),
30 terms_(), 88 terms_(),
31 alternatives_() 89 alternatives_()
32 #ifdef DEBUG 90 #ifdef DEBUG
33 , last_added_(ADD_NONE) 91 , last_added_(ADD_NONE)
34 #endif 92 #endif
35 {} 93 {}
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 unsigned ParseData::Version() { 302 unsigned ParseData::Version() {
245 return Data()[PreparseDataConstants::kVersionOffset]; 303 return Data()[PreparseDataConstants::kVersionOffset];
246 } 304 }
247 305
248 306
249 int ParseData::FunctionsSize() { 307 int ParseData::FunctionsSize() {
250 return static_cast<int>(Data()[PreparseDataConstants::kFunctionsSizeOffset]); 308 return static_cast<int>(Data()[PreparseDataConstants::kFunctionsSizeOffset]);
251 } 309 }
252 310
253 311
254 void Parser::SetCachedData(CompilationInfo* info) { 312 void Parser::SetCachedData(ParseInfo* info) {
255 if (compile_options_ == ScriptCompiler::kNoCompileOptions) { 313 if (compile_options_ == ScriptCompiler::kNoCompileOptions) {
256 cached_parse_data_ = NULL; 314 cached_parse_data_ = NULL;
257 } else { 315 } else {
258 DCHECK(info->cached_data() != NULL); 316 DCHECK(info->cached_data() != NULL);
259 if (compile_options_ == ScriptCompiler::kConsumeParserCache) { 317 if (compile_options_ == ScriptCompiler::kConsumeParserCache) {
260 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data()); 318 cached_parse_data_ = ParseData::FromCachedData(*info->cached_data());
261 } 319 }
262 } 320 }
263 } 321 }
264 322
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 830
773 831
774 ClassLiteral* ParserTraits::ParseClassLiteral( 832 ClassLiteral* ParserTraits::ParseClassLiteral(
775 const AstRawString* name, Scanner::Location class_name_location, 833 const AstRawString* name, Scanner::Location class_name_location,
776 bool name_is_strict_reserved, int pos, bool* ok) { 834 bool name_is_strict_reserved, int pos, bool* ok) {
777 return parser_->ParseClassLiteral(name, class_name_location, 835 return parser_->ParseClassLiteral(name, class_name_location,
778 name_is_strict_reserved, pos, ok); 836 name_is_strict_reserved, pos, ok);
779 } 837 }
780 838
781 839
782 Parser::Parser(CompilationInfo* info, uintptr_t stack_limit, uint32_t hash_seed, 840 Parser::Parser(ParseInfo* info)
783 UnicodeCache* unicode_cache) 841 : ParserBase<ParserTraits>(info->zone(), &scanner_, info->stack_limit(),
784 : ParserBase<ParserTraits>(info->zone(), &scanner_, stack_limit,
785 info->extension(), info->ast_value_factory(), 842 info->extension(), info->ast_value_factory(),
786 NULL, this), 843 NULL, this),
787 scanner_(unicode_cache), 844 scanner_(info->unicode_cache()),
788 reusable_preparser_(NULL), 845 reusable_preparser_(NULL),
789 original_scope_(NULL), 846 original_scope_(NULL),
790 target_stack_(NULL), 847 target_stack_(NULL),
791 compile_options_(info->compile_options()), 848 compile_options_(info->compile_options()),
792 cached_parse_data_(NULL), 849 cached_parse_data_(NULL),
793 parsing_lazy_arrow_parameters_(false), 850 parsing_lazy_arrow_parameters_(false),
794 total_preparse_skipped_(0), 851 total_preparse_skipped_(0),
795 pre_parse_timer_(NULL), 852 pre_parse_timer_(NULL),
796 parsing_on_main_thread_(true) { 853 parsing_on_main_thread_(true) {
797 // Even though we were passed CompilationInfo, we should not store it in 854 // Even though we were passed ParseInfo, we should not store it in
798 // Parser - this makes sure that Isolate is not accidentally accessed via 855 // Parser - this makes sure that Isolate is not accidentally accessed via
799 // CompilationInfo during background parsing. 856 // ParseInfo during background parsing.
800 DCHECK(!info->script().is_null() || info->source_stream() != NULL); 857 DCHECK(!info->script().is_null() || info->source_stream() != NULL);
801 set_allow_lazy(false); // Must be explicitly enabled. 858 set_allow_lazy(info->allow_lazy_parsing());
802 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); 859 set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
803 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); 860 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
804 set_allow_harmony_modules(!info->is_native() && FLAG_harmony_modules); 861 set_allow_harmony_modules(!info->is_native() && FLAG_harmony_modules);
805 set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions); 862 set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions);
806 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); 863 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals);
807 set_allow_harmony_classes(FLAG_harmony_classes); 864 set_allow_harmony_classes(FLAG_harmony_classes);
808 set_allow_harmony_object_literals(FLAG_harmony_object_literals); 865 set_allow_harmony_object_literals(FLAG_harmony_object_literals);
809 set_allow_harmony_templates(FLAG_harmony_templates); 866 set_allow_harmony_templates(FLAG_harmony_templates);
810 set_allow_harmony_sloppy(FLAG_harmony_sloppy); 867 set_allow_harmony_sloppy(FLAG_harmony_sloppy);
811 set_allow_harmony_unicode(FLAG_harmony_unicode); 868 set_allow_harmony_unicode(FLAG_harmony_unicode);
812 set_allow_harmony_computed_property_names( 869 set_allow_harmony_computed_property_names(
813 FLAG_harmony_computed_property_names); 870 FLAG_harmony_computed_property_names);
814 set_allow_harmony_rest_params(FLAG_harmony_rest_parameters); 871 set_allow_harmony_rest_params(FLAG_harmony_rest_parameters);
815 set_allow_strong_mode(FLAG_strong_mode); 872 set_allow_strong_mode(FLAG_strong_mode);
816 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; 873 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
817 ++feature) { 874 ++feature) {
818 use_counts_[feature] = 0; 875 use_counts_[feature] = 0;
819 } 876 }
820 if (info->ast_value_factory() == NULL) { 877 if (info->ast_value_factory() == NULL) {
821 // info takes ownership of AstValueFactory. 878 // info takes ownership of AstValueFactory.
822 info->SetAstValueFactory(new AstValueFactory(zone(), hash_seed)); 879 info->set_ast_value_factory(new AstValueFactory(zone(), info->hash_seed()));
880 info->set_ast_value_factory_owned();
823 ast_value_factory_ = info->ast_value_factory(); 881 ast_value_factory_ = info->ast_value_factory();
824 } 882 }
825 } 883 }
826 884
827 885
828 FunctionLiteral* Parser::ParseProgram(Isolate* isolate, CompilationInfo* info) { 886 FunctionLiteral* Parser::ParseProgram(Isolate* isolate, ParseInfo* info) {
829 // TODO(bmeurer): We temporarily need to pass allow_nesting = true here, 887 // TODO(bmeurer): We temporarily need to pass allow_nesting = true here,
830 // see comment for HistogramTimerScope class. 888 // see comment for HistogramTimerScope class.
831 889
832 // It's OK to use the Isolate & counters here, since this function is only 890 // It's OK to use the Isolate & counters here, since this function is only
833 // called in the main thread. 891 // called in the main thread.
834 DCHECK(parsing_on_main_thread_); 892 DCHECK(parsing_on_main_thread_);
835 893
836 HistogramTimerScope timer_scope(isolate->counters()->parse(), true); 894 HistogramTimerScope timer_scope(isolate->counters()->parse(), true);
837 Handle<String> source(String::cast(info->script()->source())); 895 Handle<String> source(String::cast(info->script()->source()));
838 isolate->counters()->total_parse_size()->Increment(source->length()); 896 isolate->counters()->total_parse_size()->Increment(source->length());
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 PrintF(" - took %0.3f ms]\n", ms); 947 PrintF(" - took %0.3f ms]\n", ms);
890 } 948 }
891 if (produce_cached_parse_data()) { 949 if (produce_cached_parse_data()) {
892 if (result != NULL) *info->cached_data() = recorder.GetScriptData(); 950 if (result != NULL) *info->cached_data() = recorder.GetScriptData();
893 log_ = NULL; 951 log_ = NULL;
894 } 952 }
895 return result; 953 return result;
896 } 954 }
897 955
898 956
899 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, Scope** scope, 957 FunctionLiteral* Parser::DoParseProgram(ParseInfo* info, Scope** scope,
900 Scope** eval_scope) { 958 Scope** eval_scope) {
901 // Note that this function can be called from the main thread or from a 959 // Note that this function can be called from the main thread or from a
902 // background thread. We should not access anything Isolate / heap dependent 960 // background thread. We should not access anything Isolate / heap dependent
903 // via CompilationInfo, and also not pass it forward. 961 // via ParseInfo, and also not pass it forward.
904 DCHECK(scope_ == NULL); 962 DCHECK(scope_ == NULL);
905 DCHECK(target_stack_ == NULL); 963 DCHECK(target_stack_ == NULL);
906 964
907 FunctionLiteral* result = NULL; 965 FunctionLiteral* result = NULL;
908 { 966 {
909 *scope = NewScope(scope_, SCRIPT_SCOPE); 967 *scope = NewScope(scope_, SCRIPT_SCOPE);
910 info->SetScriptScope(*scope); 968 info->set_script_scope(*scope);
911 if (!info->context().is_null() && !info->context()->IsNativeContext()) { 969 if (!info->context().is_null() && !info->context()->IsNativeContext()) {
912 *scope = Scope::DeserializeScopeChain(info->isolate(), zone(), 970 *scope = Scope::DeserializeScopeChain(info->isolate(), zone(),
913 *info->context(), *scope); 971 *info->context(), *scope);
914 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this 972 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this
915 // means the Parser cannot operate independent of the V8 heap. Tell the 973 // means the Parser cannot operate independent of the V8 heap. Tell the
916 // string table to internalize strings and values right after they're 974 // string table to internalize strings and values right after they're
917 // created. This kind of parsing can only be done in the main thread. 975 // created. This kind of parsing can only be done in the main thread.
918 DCHECK(parsing_on_main_thread_); 976 DCHECK(parsing_on_main_thread_);
919 ast_value_factory()->Internalize(info->isolate()); 977 ast_value_factory()->Internalize(info->isolate());
920 } 978 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 } 1043 }
986 } 1044 }
987 1045
988 // Make sure the target stack is empty. 1046 // Make sure the target stack is empty.
989 DCHECK(target_stack_ == NULL); 1047 DCHECK(target_stack_ == NULL);
990 1048
991 return result; 1049 return result;
992 } 1050 }
993 1051
994 1052
995 FunctionLiteral* Parser::ParseLazy(Isolate* isolate, CompilationInfo* info) { 1053 FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info) {
996 // It's OK to use the Isolate & counters here, since this function is only 1054 // It's OK to use the Isolate & counters here, since this function is only
997 // called in the main thread. 1055 // called in the main thread.
998 DCHECK(parsing_on_main_thread_); 1056 DCHECK(parsing_on_main_thread_);
999 HistogramTimerScope timer_scope(isolate->counters()->parse_lazy()); 1057 HistogramTimerScope timer_scope(isolate->counters()->parse_lazy());
1000 Handle<String> source(String::cast(info->script()->source())); 1058 Handle<String> source(String::cast(info->script()->source()));
1001 isolate->counters()->total_parse_size()->Increment(source->length()); 1059 isolate->counters()->total_parse_size()->Increment(source->length());
1002 base::ElapsedTimer timer; 1060 base::ElapsedTimer timer;
1003 if (FLAG_trace_parse) { 1061 if (FLAG_trace_parse) {
1004 timer.Start(); 1062 timer.Start();
1005 } 1063 }
(...skipping 17 matching lines...) Expand all
1023 1081
1024 if (FLAG_trace_parse && result != NULL) { 1082 if (FLAG_trace_parse && result != NULL) {
1025 double ms = timer.Elapsed().InMillisecondsF(); 1083 double ms = timer.Elapsed().InMillisecondsF();
1026 SmartArrayPointer<char> name_chars = result->debug_name()->ToCString(); 1084 SmartArrayPointer<char> name_chars = result->debug_name()->ToCString();
1027 PrintF("[parsing function: %s - took %0.3f ms]\n", name_chars.get(), ms); 1085 PrintF("[parsing function: %s - took %0.3f ms]\n", name_chars.get(), ms);
1028 } 1086 }
1029 return result; 1087 return result;
1030 } 1088 }
1031 1089
1032 1090
1033 FunctionLiteral* Parser::ParseLazy(Isolate* isolate, CompilationInfo* info, 1091 FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info,
1034 Utf16CharacterStream* source) { 1092 Utf16CharacterStream* source) {
1035 Handle<SharedFunctionInfo> shared_info = info->shared_info(); 1093 Handle<SharedFunctionInfo> shared_info = info->shared_info();
1036 scanner_.Initialize(source); 1094 scanner_.Initialize(source);
1037 DCHECK(scope_ == NULL); 1095 DCHECK(scope_ == NULL);
1038 DCHECK(target_stack_ == NULL); 1096 DCHECK(target_stack_ == NULL);
1039 1097
1040 Handle<String> name(String::cast(shared_info->name())); 1098 Handle<String> name(String::cast(shared_info->name()));
1041 DCHECK(ast_value_factory()); 1099 DCHECK(ast_value_factory());
1042 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone()); 1100 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone());
1043 const AstRawString* raw_name = ast_value_factory()->GetString(name); 1101 const AstRawString* raw_name = ast_value_factory()->GetString(name);
1044 fni_->PushEnclosingName(raw_name); 1102 fni_->PushEnclosingName(raw_name);
1045 1103
1046 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 1104 ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
1047 1105
1048 // Place holder for the result. 1106 // Place holder for the result.
1049 FunctionLiteral* result = NULL; 1107 FunctionLiteral* result = NULL;
1050 1108
1051 { 1109 {
1052 // Parse the function literal. 1110 // Parse the function literal.
1053 Scope* scope = NewScope(scope_, SCRIPT_SCOPE); 1111 Scope* scope = NewScope(scope_, SCRIPT_SCOPE);
1054 info->SetScriptScope(scope); 1112 info->set_script_scope(scope);
1055 if (!info->closure().is_null()) { 1113 if (!info->closure().is_null()) {
1056 // Ok to use Isolate here, since lazy function parsing is only done in the 1114 // Ok to use Isolate here, since lazy function parsing is only done in the
1057 // main thread. 1115 // main thread.
1058 DCHECK(parsing_on_main_thread_); 1116 DCHECK(parsing_on_main_thread_);
1059 scope = Scope::DeserializeScopeChain(isolate, zone(), 1117 scope = Scope::DeserializeScopeChain(isolate, zone(),
1060 info->closure()->context(), scope); 1118 info->closure()->context(), scope);
1061 } 1119 }
1062 original_scope_ = scope; 1120 original_scope_ = scope;
1063 AstNodeFactory function_factory(ast_value_factory()); 1121 AstNodeFactory function_factory(ast_value_factory());
1064 FunctionState function_state(&function_state_, &scope_, scope, 1122 FunctionState function_state(&function_state_, &scope_, scope,
(...skipping 4175 matching lines...) Expand 10 before | Expand all | Expand 10 after
5240 result->tree = tree; 5298 result->tree = tree;
5241 int capture_count = parser.captures_started(); 5299 int capture_count = parser.captures_started();
5242 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0; 5300 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0;
5243 result->contains_anchor = parser.contains_anchor(); 5301 result->contains_anchor = parser.contains_anchor();
5244 result->capture_count = capture_count; 5302 result->capture_count = capture_count;
5245 } 5303 }
5246 return !parser.failed(); 5304 return !parser.failed();
5247 } 5305 }
5248 5306
5249 5307
5250 bool Parser::ParseStatic(CompilationInfo* info, bool allow_lazy) { 5308 bool Parser::ParseStatic(ParseInfo* info) {
5251 Parser parser(info, info->isolate()->stack_guard()->real_climit(), 5309 Parser parser(info);
5252 info->isolate()->heap()->HashSeed(),
5253 info->isolate()->unicode_cache());
5254 parser.set_allow_lazy(allow_lazy);
5255 if (parser.Parse(info)) { 5310 if (parser.Parse(info)) {
5256 info->SetLanguageMode(info->function()->language_mode()); 5311 info->set_language_mode(info->function()->language_mode());
5257 return true; 5312 return true;
5258 } 5313 }
5259 return false; 5314 return false;
5260 } 5315 }
5261 5316
5262 5317
5263 bool Parser::Parse(CompilationInfo* info) { 5318 bool Parser::Parse(ParseInfo* info) {
5264 DCHECK(info->function() == NULL); 5319 DCHECK(info->function() == NULL);
5265 FunctionLiteral* result = NULL; 5320 FunctionLiteral* result = NULL;
5266 // Ok to use Isolate here; this function is only called in the main thread. 5321 // Ok to use Isolate here; this function is only called in the main thread.
5267 DCHECK(parsing_on_main_thread_); 5322 DCHECK(parsing_on_main_thread_);
5268 Isolate* isolate = info->isolate(); 5323 Isolate* isolate = info->isolate();
5269 pre_parse_timer_ = isolate->counters()->pre_parse(); 5324 pre_parse_timer_ = isolate->counters()->pre_parse();
5270 if (FLAG_trace_parse || allow_natives() || extension_ != NULL) { 5325 if (FLAG_trace_parse || allow_natives() || extension_ != NULL) {
5271 // If intrinsics are allowed, the Parser cannot operate independent of the 5326 // If intrinsics are allowed, the Parser cannot operate independent of the
5272 // V8 heap because of Runtime. Tell the string table to internalize strings 5327 // V8 heap because of Runtime. Tell the string table to internalize strings
5273 // and values right after they're created. 5328 // and values right after they're created.
5274 ast_value_factory()->Internalize(isolate); 5329 ast_value_factory()->Internalize(isolate);
5275 } 5330 }
5276 5331
5277 if (info->is_lazy()) { 5332 if (info->is_lazy()) {
5278 DCHECK(!info->is_eval()); 5333 DCHECK(!info->is_eval());
5279 if (info->shared_info()->is_function()) { 5334 if (info->shared_info()->is_function()) {
5280 result = ParseLazy(isolate, info); 5335 result = ParseLazy(isolate, info);
5281 } else { 5336 } else {
5282 result = ParseProgram(isolate, info); 5337 result = ParseProgram(isolate, info);
5283 } 5338 }
5284 } else { 5339 } else {
5285 SetCachedData(info); 5340 SetCachedData(info);
5286 result = ParseProgram(isolate, info); 5341 result = ParseProgram(isolate, info);
5287 } 5342 }
5288 info->SetFunction(result); 5343 info->set_literal(result);
5289 5344
5290 Internalize(isolate, info->script(), result == NULL); 5345 Internalize(isolate, info->script(), result == NULL);
5291 DCHECK(ast_value_factory()->IsInternalized()); 5346 DCHECK(ast_value_factory()->IsInternalized());
5292 return (result != NULL); 5347 return (result != NULL);
5293 } 5348 }
5294 5349
5295 5350
5296 void Parser::ParseOnBackground(CompilationInfo* info) { 5351 void Parser::ParseOnBackground(ParseInfo* info) {
5297 parsing_on_main_thread_ = false; 5352 parsing_on_main_thread_ = false;
5298 5353
5299 DCHECK(info->function() == NULL); 5354 DCHECK(info->function() == NULL);
5300 FunctionLiteral* result = NULL; 5355 FunctionLiteral* result = NULL;
5301 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone()); 5356 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone());
5302 5357
5303 CompleteParserRecorder recorder; 5358 CompleteParserRecorder recorder;
5304 if (produce_cached_parse_data()) log_ = &recorder; 5359 if (produce_cached_parse_data()) log_ = &recorder;
5305 5360
5306 DCHECK(info->source_stream() != NULL); 5361 DCHECK(info->source_stream() != NULL);
(...skipping 10 matching lines...) Expand all
5317 // scopes) and set their end position after we know the script length. 5372 // scopes) and set their end position after we know the script length.
5318 Scope* top_scope = NULL; 5373 Scope* top_scope = NULL;
5319 Scope* eval_scope = NULL; 5374 Scope* eval_scope = NULL;
5320 result = DoParseProgram(info, &top_scope, &eval_scope); 5375 result = DoParseProgram(info, &top_scope, &eval_scope);
5321 5376
5322 top_scope->set_end_position(scanner()->location().end_pos); 5377 top_scope->set_end_position(scanner()->location().end_pos);
5323 if (eval_scope != NULL) { 5378 if (eval_scope != NULL) {
5324 eval_scope->set_end_position(scanner()->location().end_pos); 5379 eval_scope->set_end_position(scanner()->location().end_pos);
5325 } 5380 }
5326 5381
5327 info->SetFunction(result); 5382 info->set_literal(result);
5328 5383
5329 // We cannot internalize on a background thread; a foreground task will take 5384 // We cannot internalize on a background thread; a foreground task will take
5330 // care of calling Parser::Internalize just before compilation. 5385 // care of calling Parser::Internalize just before compilation.
5331 5386
5332 if (produce_cached_parse_data()) { 5387 if (produce_cached_parse_data()) {
5333 if (result != NULL) *info->cached_data() = recorder.GetScriptData(); 5388 if (result != NULL) *info->cached_data() = recorder.GetScriptData();
5334 log_ = NULL; 5389 log_ = NULL;
5335 } 5390 }
5336 } 5391 }
5337 5392
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
5450 } else { 5505 } else {
5451 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5506 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5452 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5507 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5453 raw_string->length()); 5508 raw_string->length());
5454 } 5509 }
5455 } 5510 }
5456 5511
5457 return running_hash; 5512 return running_hash;
5458 } 5513 }
5459 } } // namespace v8::internal 5514 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/preparse-data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698