| 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 #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/base/platform/platform.h" | 9 #include "src/base/platform/platform.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 return Data()[PreparseDataConstants::kVersionOffset]; | 247 return Data()[PreparseDataConstants::kVersionOffset]; |
| 248 } | 248 } |
| 249 | 249 |
| 250 | 250 |
| 251 int ParseData::FunctionsSize() { | 251 int ParseData::FunctionsSize() { |
| 252 return static_cast<int>(Data()[PreparseDataConstants::kFunctionsSizeOffset]); | 252 return static_cast<int>(Data()[PreparseDataConstants::kFunctionsSizeOffset]); |
| 253 } | 253 } |
| 254 | 254 |
| 255 | 255 |
| 256 void Parser::SetCachedData() { | 256 void Parser::SetCachedData() { |
| 257 if (cached_data_mode() == NO_CACHED_DATA) { | 257 if (compile_options() == ScriptCompiler::kNoCompileOptions) { |
| 258 cached_parse_data_ = NULL; | 258 cached_parse_data_ = NULL; |
| 259 } else { | 259 } else { |
| 260 ASSERT(info_->cached_data() != NULL); | 260 ASSERT(info_->cached_data() != NULL); |
| 261 if (cached_data_mode() == CONSUME_CACHED_DATA) { | 261 if (compile_options() == ScriptCompiler::kConsumeParserCache) { |
| 262 cached_parse_data_ = new ParseData(*info_->cached_data()); | 262 cached_parse_data_ = new ParseData(*info_->cached_data()); |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 | 266 |
| 267 | 267 |
| 268 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) { | 268 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) { |
| 269 ASSERT(ast_value_factory_); | 269 ASSERT(ast_value_factory_); |
| 270 Scope* result = | 270 Scope* result = |
| 271 new (zone()) Scope(parent, scope_type, ast_value_factory_, zone()); | 271 new (zone()) Scope(parent, scope_type, ast_value_factory_, zone()); |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 Handle<String> source(String::cast(script_->source())); | 734 Handle<String> source(String::cast(script_->source())); |
| 735 isolate()->counters()->total_parse_size()->Increment(source->length()); | 735 isolate()->counters()->total_parse_size()->Increment(source->length()); |
| 736 base::ElapsedTimer timer; | 736 base::ElapsedTimer timer; |
| 737 if (FLAG_trace_parse) { | 737 if (FLAG_trace_parse) { |
| 738 timer.Start(); | 738 timer.Start(); |
| 739 } | 739 } |
| 740 fni_ = new(zone()) FuncNameInferrer(ast_value_factory_, zone()); | 740 fni_ = new(zone()) FuncNameInferrer(ast_value_factory_, zone()); |
| 741 | 741 |
| 742 // Initialize parser state. | 742 // Initialize parser state. |
| 743 CompleteParserRecorder recorder; | 743 CompleteParserRecorder recorder; |
| 744 if (cached_data_mode() == PRODUCE_CACHED_DATA) { | 744 |
| 745 if (compile_options() == ScriptCompiler::kProduceParserCache) { |
| 745 log_ = &recorder; | 746 log_ = &recorder; |
| 746 } else if (cached_data_mode() == CONSUME_CACHED_DATA) { | 747 } else if (compile_options() == ScriptCompiler::kConsumeParserCache) { |
| 747 cached_parse_data_->Initialize(); | 748 cached_parse_data_->Initialize(); |
| 748 } | 749 } |
| 749 | 750 |
| 750 source = String::Flatten(source); | 751 source = String::Flatten(source); |
| 751 FunctionLiteral* result; | 752 FunctionLiteral* result; |
| 752 if (source->IsExternalTwoByteString()) { | 753 if (source->IsExternalTwoByteString()) { |
| 753 // Notice that the stream is destroyed at the end of the branch block. | 754 // Notice that the stream is destroyed at the end of the branch block. |
| 754 // The last line of the blocks can't be moved outside, even though they're | 755 // The last line of the blocks can't be moved outside, even though they're |
| 755 // identical calls. | 756 // identical calls. |
| 756 ExternalTwoByteStringUtf16CharacterStream stream( | 757 ExternalTwoByteStringUtf16CharacterStream stream( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 769 PrintF("[parsing eval"); | 770 PrintF("[parsing eval"); |
| 770 } else if (info()->script()->name()->IsString()) { | 771 } else if (info()->script()->name()->IsString()) { |
| 771 String* name = String::cast(info()->script()->name()); | 772 String* name = String::cast(info()->script()->name()); |
| 772 SmartArrayPointer<char> name_chars = name->ToCString(); | 773 SmartArrayPointer<char> name_chars = name->ToCString(); |
| 773 PrintF("[parsing script: %s", name_chars.get()); | 774 PrintF("[parsing script: %s", name_chars.get()); |
| 774 } else { | 775 } else { |
| 775 PrintF("[parsing script"); | 776 PrintF("[parsing script"); |
| 776 } | 777 } |
| 777 PrintF(" - took %0.3f ms]\n", ms); | 778 PrintF(" - took %0.3f ms]\n", ms); |
| 778 } | 779 } |
| 779 if (cached_data_mode() == PRODUCE_CACHED_DATA) { | 780 if (compile_options() == ScriptCompiler::kProduceParserCache) { |
| 780 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); | 781 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); |
| 781 log_ = NULL; | 782 log_ = NULL; |
| 782 } | 783 } |
| 783 return result; | 784 return result; |
| 784 } | 785 } |
| 785 | 786 |
| 786 | 787 |
| 787 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, | 788 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, |
| 788 Handle<String> source) { | 789 Handle<String> source) { |
| 789 ASSERT(scope_ == NULL); | 790 ASSERT(scope_ == NULL); |
| (...skipping 2811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3601 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); | 3602 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
| 3602 return function_literal; | 3603 return function_literal; |
| 3603 } | 3604 } |
| 3604 | 3605 |
| 3605 | 3606 |
| 3606 void Parser::SkipLazyFunctionBody(const AstRawString* function_name, | 3607 void Parser::SkipLazyFunctionBody(const AstRawString* function_name, |
| 3607 int* materialized_literal_count, | 3608 int* materialized_literal_count, |
| 3608 int* expected_property_count, | 3609 int* expected_property_count, |
| 3609 bool* ok) { | 3610 bool* ok) { |
| 3610 int function_block_pos = position(); | 3611 int function_block_pos = position(); |
| 3611 if (cached_data_mode() == CONSUME_CACHED_DATA) { | 3612 if (compile_options() == ScriptCompiler::kConsumeParserCache) { |
| 3612 // If we have cached data, we use it to skip parsing the function body. The | 3613 // If we have cached data, we use it to skip parsing the function body. The |
| 3613 // data contains the information we need to construct the lazy function. | 3614 // data contains the information we need to construct the lazy function. |
| 3614 FunctionEntry entry = | 3615 FunctionEntry entry = |
| 3615 cached_parse_data_->GetFunctionEntry(function_block_pos); | 3616 cached_parse_data_->GetFunctionEntry(function_block_pos); |
| 3616 // Check that cached data is valid. | 3617 // Check that cached data is valid. |
| 3617 CHECK(entry.is_valid()); | 3618 CHECK(entry.is_valid()); |
| 3618 // End position greater than end of stream is safe, and hard to check. | 3619 // End position greater than end of stream is safe, and hard to check. |
| 3619 CHECK(entry.end_pos() > function_block_pos); | 3620 CHECK(entry.end_pos() > function_block_pos); |
| 3620 scanner()->SeekForward(entry.end_pos() - 1); | 3621 scanner()->SeekForward(entry.end_pos() - 1); |
| 3621 | 3622 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3651 scope_->set_end_position(logger.end()); | 3652 scope_->set_end_position(logger.end()); |
| 3652 Expect(Token::RBRACE, ok); | 3653 Expect(Token::RBRACE, ok); |
| 3653 if (!*ok) { | 3654 if (!*ok) { |
| 3654 return; | 3655 return; |
| 3655 } | 3656 } |
| 3656 isolate()->counters()->total_preparse_skipped()->Increment( | 3657 isolate()->counters()->total_preparse_skipped()->Increment( |
| 3657 scope_->end_position() - function_block_pos); | 3658 scope_->end_position() - function_block_pos); |
| 3658 *materialized_literal_count = logger.literals(); | 3659 *materialized_literal_count = logger.literals(); |
| 3659 *expected_property_count = logger.properties(); | 3660 *expected_property_count = logger.properties(); |
| 3660 scope_->SetStrictMode(logger.strict_mode()); | 3661 scope_->SetStrictMode(logger.strict_mode()); |
| 3661 if (cached_data_mode() == PRODUCE_CACHED_DATA) { | 3662 if (compile_options() == ScriptCompiler::kProduceParserCache) { |
| 3662 ASSERT(log_); | 3663 ASSERT(log_); |
| 3663 // Position right after terminal '}'. | 3664 // Position right after terminal '}'. |
| 3664 int body_end = scanner()->location().end_pos; | 3665 int body_end = scanner()->location().end_pos; |
| 3665 log_->LogFunction(function_block_pos, body_end, | 3666 log_->LogFunction(function_block_pos, body_end, |
| 3666 *materialized_literal_count, | 3667 *materialized_literal_count, |
| 3667 *expected_property_count, | 3668 *expected_property_count, |
| 3668 scope_->strict_mode()); | 3669 scope_->strict_mode()); |
| 3669 } | 3670 } |
| 3670 } | 3671 } |
| 3671 } | 3672 } |
| (...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4807 info()->SetAstValueFactory(ast_value_factory_); | 4808 info()->SetAstValueFactory(ast_value_factory_); |
| 4808 } | 4809 } |
| 4809 ast_value_factory_ = NULL; | 4810 ast_value_factory_ = NULL; |
| 4810 | 4811 |
| 4811 InternalizeUseCounts(); | 4812 InternalizeUseCounts(); |
| 4812 | 4813 |
| 4813 return (result != NULL); | 4814 return (result != NULL); |
| 4814 } | 4815 } |
| 4815 | 4816 |
| 4816 } } // namespace v8::internal | 4817 } } // namespace v8::internal |
| OLD | NEW |