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

Side by Side Diff: src/parser.cc

Issue 960543002: Move compilation error handling into a separate class. (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/pending-compilation-error-handler.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"
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 601
602 void ParserTraits::ReportMessageAt(Scanner::Location source_location, 602 void ParserTraits::ReportMessageAt(Scanner::Location source_location,
603 const char* message, const char* arg, 603 const char* message, const char* arg,
604 ParseErrorType error_type) { 604 ParseErrorType error_type) {
605 if (parser_->stack_overflow()) { 605 if (parser_->stack_overflow()) {
606 // Suppress the error message (syntax error or such) in the presence of a 606 // Suppress the error message (syntax error or such) in the presence of a
607 // stack overflow. The isolate allows only one pending exception at at time 607 // stack overflow. The isolate allows only one pending exception at at time
608 // and we want to report the stack overflow later. 608 // and we want to report the stack overflow later.
609 return; 609 return;
610 } 610 }
611 parser_->has_pending_error_ = true; 611 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos,
612 parser_->pending_error_location_ = source_location; 612 source_location.end_pos,
613 parser_->pending_error_message_ = message; 613 message, arg, error_type);
614 parser_->pending_error_char_arg_ = arg;
615 parser_->pending_error_arg_ = NULL;
616 parser_->pending_error_type_ = error_type;
617 } 614 }
618 615
619 616
620 void ParserTraits::ReportMessage(const char* message, const char* arg, 617 void ParserTraits::ReportMessage(const char* message, const char* arg,
621 ParseErrorType error_type) { 618 ParseErrorType error_type) {
622 Scanner::Location source_location = parser_->scanner()->location(); 619 Scanner::Location source_location = parser_->scanner()->location();
623 ReportMessageAt(source_location, message, arg, error_type); 620 ReportMessageAt(source_location, message, arg, error_type);
624 } 621 }
625 622
626 623
627 void ParserTraits::ReportMessage(const char* message, const AstRawString* arg, 624 void ParserTraits::ReportMessage(const char* message, const AstRawString* arg,
628 ParseErrorType error_type) { 625 ParseErrorType error_type) {
629 Scanner::Location source_location = parser_->scanner()->location(); 626 Scanner::Location source_location = parser_->scanner()->location();
630 ReportMessageAt(source_location, message, arg, error_type); 627 ReportMessageAt(source_location, message, arg, error_type);
631 } 628 }
632 629
633 630
634 void ParserTraits::ReportMessageAt(Scanner::Location source_location, 631 void ParserTraits::ReportMessageAt(Scanner::Location source_location,
635 const char* message, const AstRawString* arg, 632 const char* message, const AstRawString* arg,
636 ParseErrorType error_type) { 633 ParseErrorType error_type) {
637 if (parser_->stack_overflow()) { 634 if (parser_->stack_overflow()) {
638 // Suppress the error message (syntax error or such) in the presence of a 635 // Suppress the error message (syntax error or such) in the presence of a
639 // stack overflow. The isolate allows only one pending exception at at time 636 // stack overflow. The isolate allows only one pending exception at at time
640 // and we want to report the stack overflow later. 637 // and we want to report the stack overflow later.
641 return; 638 return;
642 } 639 }
643 parser_->has_pending_error_ = true; 640 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos,
644 parser_->pending_error_location_ = source_location; 641 source_location.end_pos,
645 parser_->pending_error_message_ = message; 642 message, arg, error_type);
646 parser_->pending_error_char_arg_ = NULL;
647 parser_->pending_error_arg_ = arg;
648 parser_->pending_error_type_ = error_type;
649 } 643 }
650 644
651 645
652 const AstRawString* ParserTraits::GetSymbol(Scanner* scanner) { 646 const AstRawString* ParserTraits::GetSymbol(Scanner* scanner) {
653 const AstRawString* result = 647 const AstRawString* result =
654 parser_->scanner()->CurrentSymbol(parser_->ast_value_factory()); 648 parser_->scanner()->CurrentSymbol(parser_->ast_value_factory());
655 DCHECK(result != NULL); 649 DCHECK(result != NULL);
656 return result; 650 return result;
657 } 651 }
658 652
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 : ParserBase<ParserTraits>(info->zone(), &scanner_, stack_limit, 776 : ParserBase<ParserTraits>(info->zone(), &scanner_, stack_limit,
783 info->extension(), info->ast_value_factory(), 777 info->extension(), info->ast_value_factory(),
784 NULL, this), 778 NULL, this),
785 scanner_(unicode_cache), 779 scanner_(unicode_cache),
786 reusable_preparser_(NULL), 780 reusable_preparser_(NULL),
787 original_scope_(NULL), 781 original_scope_(NULL),
788 target_stack_(NULL), 782 target_stack_(NULL),
789 compile_options_(info->compile_options()), 783 compile_options_(info->compile_options()),
790 cached_parse_data_(NULL), 784 cached_parse_data_(NULL),
791 parsing_lazy_arrow_parameters_(false), 785 parsing_lazy_arrow_parameters_(false),
792 has_pending_error_(false),
793 pending_error_message_(NULL),
794 pending_error_arg_(NULL),
795 pending_error_char_arg_(NULL),
796 pending_error_type_(kSyntaxError),
797 total_preparse_skipped_(0), 786 total_preparse_skipped_(0),
798 pre_parse_timer_(NULL), 787 pre_parse_timer_(NULL),
799 parsing_on_main_thread_(true) { 788 parsing_on_main_thread_(true) {
800 // Even though we were passed CompilationInfo, we should not store it in 789 // Even though we were passed CompilationInfo, we should not store it in
801 // Parser - this makes sure that Isolate is not accidentally accessed via 790 // Parser - this makes sure that Isolate is not accidentally accessed via
802 // CompilationInfo during background parsing. 791 // CompilationInfo during background parsing.
803 DCHECK(!info->script().is_null() || info->source_stream() != NULL); 792 DCHECK(!info->script().is_null() || info->source_stream() != NULL);
804 set_allow_lazy(false); // Must be explicitly enabled. 793 set_allow_lazy(false); // Must be explicitly enabled.
805 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); 794 set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
806 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); 795 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
(...skipping 3469 matching lines...) Expand 10 before | Expand all | Expand 10 after
4276 script->set_source_url(*source_url); 4265 script->set_source_url(*source_url);
4277 } 4266 }
4278 if (scanner_.source_mapping_url()->length() > 0) { 4267 if (scanner_.source_mapping_url()->length() > 0) {
4279 Handle<String> source_mapping_url = 4268 Handle<String> source_mapping_url =
4280 scanner_.source_mapping_url()->Internalize(isolate); 4269 scanner_.source_mapping_url()->Internalize(isolate);
4281 script->set_source_mapping_url(*source_mapping_url); 4270 script->set_source_mapping_url(*source_mapping_url);
4282 } 4271 }
4283 } 4272 }
4284 4273
4285 4274
4286 void Parser::ThrowPendingError(Isolate* isolate, Handle<Script> script) {
4287 DCHECK(ast_value_factory()->IsInternalized());
4288 if (has_pending_error_) {
4289 MessageLocation location(script, pending_error_location_.beg_pos,
4290 pending_error_location_.end_pos);
4291 Factory* factory = isolate->factory();
4292 bool has_arg =
4293 pending_error_arg_ != NULL || pending_error_char_arg_ != NULL;
4294 Handle<FixedArray> elements = factory->NewFixedArray(has_arg ? 1 : 0);
4295 if (pending_error_arg_ != NULL) {
4296 Handle<String> arg_string = pending_error_arg_->string();
4297 elements->set(0, *arg_string);
4298 } else if (pending_error_char_arg_ != NULL) {
4299 Handle<String> arg_string =
4300 factory->NewStringFromUtf8(CStrVector(pending_error_char_arg_))
4301 .ToHandleChecked();
4302 elements->set(0, *arg_string);
4303 }
4304 isolate->debug()->OnCompileError(script);
4305
4306 Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
4307 Handle<Object> error;
4308 switch (pending_error_type_) {
4309 case kReferenceError:
4310 error = factory->NewReferenceError(pending_error_message_, array);
4311 break;
4312 case kSyntaxError:
4313 error = factory->NewSyntaxError(pending_error_message_, array);
4314 break;
4315 }
4316
4317 Handle<JSObject> jserror = Handle<JSObject>::cast(error);
4318
4319 Handle<Name> key_start_pos = factory->error_start_pos_symbol();
4320 JSObject::SetProperty(jserror, key_start_pos,
4321 handle(Smi::FromInt(location.start_pos()), isolate),
4322 SLOPPY).Check();
4323
4324 Handle<Name> key_end_pos = factory->error_end_pos_symbol();
4325 JSObject::SetProperty(jserror, key_end_pos,
4326 handle(Smi::FromInt(location.end_pos()), isolate),
4327 SLOPPY).Check();
4328
4329 Handle<Name> key_script = factory->error_script_symbol();
4330 JSObject::SetProperty(jserror, key_script, script, SLOPPY).Check();
4331
4332 isolate->Throw(*error, &location);
4333 }
4334 }
4335
4336
4337 void Parser::Internalize(Isolate* isolate, Handle<Script> script, bool error) { 4275 void Parser::Internalize(Isolate* isolate, Handle<Script> script, bool error) {
4338 // Internalize strings. 4276 // Internalize strings.
4339 ast_value_factory()->Internalize(isolate); 4277 ast_value_factory()->Internalize(isolate);
4340 4278
4341 // Error processing. 4279 // Error processing.
4342 if (error) { 4280 if (error) {
4343 if (stack_overflow()) { 4281 if (stack_overflow()) {
4344 isolate->StackOverflow(); 4282 isolate->StackOverflow();
4345 } else { 4283 } else {
4346 ThrowPendingError(isolate, script); 4284 DCHECK(pending_error_handler_.has_pending_error());
4285 pending_error_handler_.ThrowPendingError(isolate, script);
4347 } 4286 }
4348 } 4287 }
4349 4288
4350 // Move statistics to Isolate. 4289 // Move statistics to Isolate.
4351 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; 4290 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
4352 ++feature) { 4291 ++feature) {
4353 for (int i = 0; i < use_counts_[feature]; ++i) { 4292 for (int i = 0; i < use_counts_[feature]; ++i) {
4354 isolate->CountUsage(v8::Isolate::UseCounterFeature(feature)); 4293 isolate->CountUsage(v8::Isolate::UseCounterFeature(feature));
4355 } 4294 }
4356 } 4295 }
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after
5475 } else { 5414 } else {
5476 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5415 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5477 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5416 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5478 raw_string->length()); 5417 raw_string->length());
5479 } 5418 }
5480 } 5419 }
5481 5420
5482 return running_hash; 5421 return running_hash;
5483 } 5422 }
5484 } } // namespace v8::internal 5423 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/pending-compilation-error-handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698