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

Side by Side Diff: src/parser.cc

Issue 781203003: Handle invalid parser cache gracefully (move invalid cache handling to embedder). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: streaminglining the test Created 6 years 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') | test/cctest/test-api.cc » ('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"
(...skipping 3813 matching lines...) Expand 10 before | Expand all | Expand 10 after
3824 } 3824 }
3825 3825
3826 3826
3827 void Parser::SkipLazyFunctionBody(const AstRawString* function_name, 3827 void Parser::SkipLazyFunctionBody(const AstRawString* function_name,
3828 int* materialized_literal_count, 3828 int* materialized_literal_count,
3829 int* expected_property_count, 3829 int* expected_property_count,
3830 bool* ok) { 3830 bool* ok) {
3831 if (produce_cached_parse_data()) CHECK(log_); 3831 if (produce_cached_parse_data()) CHECK(log_);
3832 3832
3833 int function_block_pos = position(); 3833 int function_block_pos = position();
3834 if (consume_cached_parse_data()) { 3834 if (consume_cached_parse_data() && !cached_parse_data_->rejected()) {
3835 // If we have cached data, we use it to skip parsing the function body. The 3835 // If we have cached data, we use it to skip parsing the function body. The
3836 // data contains the information we need to construct the lazy function. 3836 // data contains the information we need to construct the lazy function.
3837 FunctionEntry entry = 3837 FunctionEntry entry =
3838 cached_parse_data_->GetFunctionEntry(function_block_pos); 3838 cached_parse_data_->GetFunctionEntry(function_block_pos);
3839 // Check that cached data is valid. 3839 // Check that cached data is valid. If not, mark it as invalid (the embedder
3840 CHECK(entry.is_valid()); 3840 // handles it). Note that end position greater than end of stream is safe,
3841 // End position greater than end of stream is safe, and hard to check. 3841 // and hard to check.
3842 CHECK(entry.end_pos() > function_block_pos); 3842 if (entry.is_valid() && entry.end_pos() > function_block_pos) {
3843 scanner()->SeekForward(entry.end_pos() - 1); 3843 scanner()->SeekForward(entry.end_pos() - 1);
3844 3844
3845 scope_->set_end_position(entry.end_pos()); 3845 scope_->set_end_position(entry.end_pos());
3846 Expect(Token::RBRACE, ok); 3846 Expect(Token::RBRACE, ok);
3847 if (!*ok) { 3847 if (!*ok) {
3848 return;
3849 }
3850 total_preparse_skipped_ += scope_->end_position() - function_block_pos;
3851 *materialized_literal_count = entry.literal_count();
3852 *expected_property_count = entry.property_count();
3853 scope_->SetStrictMode(entry.strict_mode());
3848 return; 3854 return;
3849 } 3855 }
3850 total_preparse_skipped_ += scope_->end_position() - function_block_pos; 3856 cached_parse_data_->Reject();
3851 *materialized_literal_count = entry.literal_count(); 3857 }
3852 *expected_property_count = entry.property_count(); 3858 // With no cached data, we partially parse the function, without building an
3853 scope_->SetStrictMode(entry.strict_mode()); 3859 // AST. This gathers the data needed to build a lazy function.
3854 } else { 3860 SingletonLogger logger;
3855 // With no cached data, we partially parse the function, without building an 3861 PreParser::PreParseResult result =
3856 // AST. This gathers the data needed to build a lazy function. 3862 ParseLazyFunctionBodyWithPreParser(&logger);
3857 SingletonLogger logger; 3863 if (result == PreParser::kPreParseStackOverflow) {
3858 PreParser::PreParseResult result = 3864 // Propagate stack overflow.
3859 ParseLazyFunctionBodyWithPreParser(&logger); 3865 set_stack_overflow();
3860 if (result == PreParser::kPreParseStackOverflow) { 3866 *ok = false;
3861 // Propagate stack overflow. 3867 return;
3862 set_stack_overflow(); 3868 }
3863 *ok = false; 3869 if (logger.has_error()) {
3864 return; 3870 ParserTraits::ReportMessageAt(
3865 } 3871 Scanner::Location(logger.start(), logger.end()), logger.message(),
3866 if (logger.has_error()) { 3872 logger.argument_opt(), logger.is_reference_error());
3867 ParserTraits::ReportMessageAt( 3873 *ok = false;
3868 Scanner::Location(logger.start(), logger.end()), 3874 return;
3869 logger.message(), logger.argument_opt(), logger.is_reference_error()); 3875 }
3870 *ok = false; 3876 scope_->set_end_position(logger.end());
3871 return; 3877 Expect(Token::RBRACE, ok);
3872 } 3878 if (!*ok) {
3873 scope_->set_end_position(logger.end()); 3879 return;
3874 Expect(Token::RBRACE, ok); 3880 }
3875 if (!*ok) { 3881 total_preparse_skipped_ += scope_->end_position() - function_block_pos;
3876 return; 3882 *materialized_literal_count = logger.literals();
3877 } 3883 *expected_property_count = logger.properties();
3878 total_preparse_skipped_ += scope_->end_position() - function_block_pos; 3884 scope_->SetStrictMode(logger.strict_mode());
3879 *materialized_literal_count = logger.literals(); 3885 if (produce_cached_parse_data()) {
3880 *expected_property_count = logger.properties(); 3886 DCHECK(log_);
3881 scope_->SetStrictMode(logger.strict_mode()); 3887 // Position right after terminal '}'.
3882 if (produce_cached_parse_data()) { 3888 int body_end = scanner()->location().end_pos;
3883 DCHECK(log_); 3889 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count,
3884 // Position right after terminal '}'. 3890 *expected_property_count, scope_->strict_mode());
3885 int body_end = scanner()->location().end_pos;
3886 log_->LogFunction(function_block_pos, body_end,
3887 *materialized_literal_count,
3888 *expected_property_count,
3889 scope_->strict_mode());
3890 }
3891 } 3891 }
3892 } 3892 }
3893 3893
3894 3894
3895 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( 3895 ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
3896 const AstRawString* function_name, int pos, Variable* fvar, 3896 const AstRawString* function_name, int pos, Variable* fvar,
3897 Token::Value fvar_init_op, bool is_generator, bool* ok) { 3897 Token::Value fvar_init_op, bool is_generator, bool* ok) {
3898 // Everything inside an eagerly parsed function will be parsed eagerly 3898 // Everything inside an eagerly parsed function will be parsed eagerly
3899 // (see comment above). 3899 // (see comment above).
3900 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 3900 ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
(...skipping 1390 matching lines...) Expand 10 before | Expand all | Expand 10 after
5291 } else { 5291 } else {
5292 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5292 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5293 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5293 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5294 raw_string->length()); 5294 raw_string->length());
5295 } 5295 }
5296 } 5296 }
5297 5297
5298 return running_hash; 5298 return running_hash;
5299 } 5299 }
5300 } } // namespace v8::internal 5300 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698