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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "api.h" | 7 #include "api.h" |
8 #include "ast.h" | 8 #include "ast.h" |
9 #include "bootstrapper.h" | 9 #include "bootstrapper.h" |
10 #include "char-predicates-inl.h" | 10 #include "char-predicates-inl.h" |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 623 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
624 const char* message, | 624 const char* message, |
625 const char* arg, | 625 const char* arg, |
626 bool is_reference_error) { | 626 bool is_reference_error) { |
627 if (parser_->stack_overflow()) { | 627 if (parser_->stack_overflow()) { |
628 // Suppress the error message (syntax error or such) in the presence of a | 628 // Suppress the error message (syntax error or such) in the presence of a |
629 // stack overflow. The isolate allows only one pending exception at at time | 629 // stack overflow. The isolate allows only one pending exception at at time |
630 // and we want to report the stack overflow later. | 630 // and we want to report the stack overflow later. |
631 return; | 631 return; |
632 } | 632 } |
633 MessageLocation location(parser_->script_, | 633 parser_->has_pending_error_ = true; |
634 source_location.beg_pos, | 634 parser_->pending_error_location_ = source_location; |
635 source_location.end_pos); | 635 parser_->pending_error_message_ = message; |
636 Factory* factory = parser_->isolate()->factory(); | 636 parser_->pending_error_char_arg_ = arg; |
637 Handle<FixedArray> elements = factory->NewFixedArray(arg == NULL ? 0 : 1); | 637 parser_->pending_error_arg_ = Handle<String>(); |
638 if (arg != NULL) { | 638 parser_->pending_error_is_reference_error_ = is_reference_error; |
639 Handle<String> arg_string = | |
640 factory->NewStringFromUtf8(CStrVector(arg)).ToHandleChecked(); | |
641 elements->set(0, *arg_string); | |
642 } | |
643 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); | |
644 Handle<Object> result = is_reference_error | |
645 ? factory->NewReferenceError(message, array) | |
646 : factory->NewSyntaxError(message, array); | |
647 parser_->isolate()->Throw(*result, &location); | |
648 } | 639 } |
649 | 640 |
650 | 641 |
651 void ParserTraits::ReportMessage(const char* message, | 642 void ParserTraits::ReportMessage(const char* message, |
652 MaybeHandle<String> arg, | 643 MaybeHandle<String> arg, |
653 bool is_reference_error) { | 644 bool is_reference_error) { |
654 Scanner::Location source_location = parser_->scanner()->location(); | 645 Scanner::Location source_location = parser_->scanner()->location(); |
655 ReportMessageAt(source_location, message, arg, is_reference_error); | 646 ReportMessageAt(source_location, message, arg, is_reference_error); |
656 } | 647 } |
657 | 648 |
658 | 649 |
659 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 650 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
660 const char* message, | 651 const char* message, |
661 MaybeHandle<String> arg, | 652 MaybeHandle<String> arg, |
662 bool is_reference_error) { | 653 bool is_reference_error) { |
663 if (parser_->stack_overflow()) { | 654 if (parser_->stack_overflow()) { |
664 // Suppress the error message (syntax error or such) in the presence of a | 655 // Suppress the error message (syntax error or such) in the presence of a |
665 // stack overflow. The isolate allows only one pending exception at at time | 656 // stack overflow. The isolate allows only one pending exception at at time |
666 // and we want to report the stack overflow later. | 657 // and we want to report the stack overflow later. |
667 return; | 658 return; |
668 } | 659 } |
669 MessageLocation location(parser_->script_, | 660 parser_->has_pending_error_ = true; |
670 source_location.beg_pos, | 661 parser_->pending_error_location_ = source_location; |
671 source_location.end_pos); | 662 parser_->pending_error_message_ = message; |
672 Factory* factory = parser_->isolate()->factory(); | 663 parser_->pending_error_char_arg_ = NULL; |
673 Handle<FixedArray> elements = factory->NewFixedArray(arg.is_null() ? 0 : 1); | 664 parser_->pending_error_arg_ = arg; |
674 if (!arg.is_null()) { | 665 parser_->pending_error_is_reference_error_ = is_reference_error; |
675 elements->set(0, *(arg.ToHandleChecked())); | |
676 } | |
677 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); | |
678 Handle<Object> result = is_reference_error | |
679 ? factory->NewReferenceError(message, array) | |
680 : factory->NewSyntaxError(message, array); | |
681 parser_->isolate()->Throw(*result, &location); | |
682 } | 666 } |
683 | 667 |
684 | 668 |
685 Handle<String> ParserTraits::GetSymbol(Scanner* scanner) { | 669 Handle<String> ParserTraits::GetSymbol(Scanner* scanner) { |
686 Handle<String> result = | 670 Handle<String> result = |
687 parser_->scanner()->AllocateInternalizedString(parser_->isolate()); | 671 parser_->scanner()->AllocateInternalizedString(parser_->isolate()); |
688 ASSERT(!result.is_null()); | 672 ASSERT(!result.is_null()); |
689 return result; | 673 return result; |
690 } | 674 } |
691 | 675 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 info->zone(), | 767 info->zone(), |
784 this), | 768 this), |
785 isolate_(info->isolate()), | 769 isolate_(info->isolate()), |
786 script_(info->script()), | 770 script_(info->script()), |
787 scanner_(isolate_->unicode_cache()), | 771 scanner_(isolate_->unicode_cache()), |
788 reusable_preparser_(NULL), | 772 reusable_preparser_(NULL), |
789 original_scope_(NULL), | 773 original_scope_(NULL), |
790 target_stack_(NULL), | 774 target_stack_(NULL), |
791 cached_data_(NULL), | 775 cached_data_(NULL), |
792 cached_data_mode_(NO_CACHED_DATA), | 776 cached_data_mode_(NO_CACHED_DATA), |
793 info_(info) { | 777 info_(info), |
| 778 has_pending_error_(false), |
| 779 pending_error_message_(NULL), |
| 780 pending_error_char_arg_(NULL) { |
794 ASSERT(!script_.is_null()); | 781 ASSERT(!script_.is_null()); |
795 isolate_->set_ast_node_id(0); | 782 isolate_->set_ast_node_id(0); |
796 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); | 783 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); |
797 set_allow_modules(!info->is_native() && FLAG_harmony_modules); | 784 set_allow_modules(!info->is_native() && FLAG_harmony_modules); |
798 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); | 785 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); |
799 set_allow_lazy(false); // Must be explicitly enabled. | 786 set_allow_lazy(false); // Must be explicitly enabled. |
800 set_allow_generators(FLAG_harmony_generators); | 787 set_allow_generators(FLAG_harmony_generators); |
801 set_allow_for_of(FLAG_harmony_iteration); | 788 set_allow_for_of(FLAG_harmony_iteration); |
802 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); | 789 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); |
803 } | 790 } |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 FunctionLiteral::ANONYMOUS_EXPRESSION, | 922 FunctionLiteral::ANONYMOUS_EXPRESSION, |
936 FunctionLiteral::kGlobalOrEval, | 923 FunctionLiteral::kGlobalOrEval, |
937 FunctionLiteral::kNotParenthesized, | 924 FunctionLiteral::kNotParenthesized, |
938 FunctionLiteral::kNotGenerator, | 925 FunctionLiteral::kNotGenerator, |
939 0); | 926 0); |
940 result->set_ast_properties(factory()->visitor()->ast_properties()); | 927 result->set_ast_properties(factory()->visitor()->ast_properties()); |
941 result->set_dont_optimize_reason( | 928 result->set_dont_optimize_reason( |
942 factory()->visitor()->dont_optimize_reason()); | 929 factory()->visitor()->dont_optimize_reason()); |
943 } else if (stack_overflow()) { | 930 } else if (stack_overflow()) { |
944 isolate()->StackOverflow(); | 931 isolate()->StackOverflow(); |
| 932 } else { |
| 933 ThrowPendingError(); |
945 } | 934 } |
946 } | 935 } |
947 | 936 |
948 // Make sure the target stack is empty. | 937 // Make sure the target stack is empty. |
949 ASSERT(target_stack_ == NULL); | 938 ASSERT(target_stack_ == NULL); |
950 | 939 |
951 return result; | 940 return result; |
952 } | 941 } |
953 | 942 |
954 | 943 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 function_type, | 1018 function_type, |
1030 &ok); | 1019 &ok); |
1031 // Make sure the results agree. | 1020 // Make sure the results agree. |
1032 ASSERT(ok == (result != NULL)); | 1021 ASSERT(ok == (result != NULL)); |
1033 } | 1022 } |
1034 | 1023 |
1035 // Make sure the target stack is empty. | 1024 // Make sure the target stack is empty. |
1036 ASSERT(target_stack_ == NULL); | 1025 ASSERT(target_stack_ == NULL); |
1037 | 1026 |
1038 if (result == NULL) { | 1027 if (result == NULL) { |
1039 if (stack_overflow()) isolate()->StackOverflow(); | 1028 if (stack_overflow()) { |
| 1029 isolate()->StackOverflow(); |
| 1030 } else { |
| 1031 ThrowPendingError(); |
| 1032 } |
1040 } else { | 1033 } else { |
1041 Handle<String> inferred_name(shared_info->inferred_name()); | 1034 Handle<String> inferred_name(shared_info->inferred_name()); |
1042 result->set_inferred_name(inferred_name); | 1035 result->set_inferred_name(inferred_name); |
1043 } | 1036 } |
1044 return result; | 1037 return result; |
1045 } | 1038 } |
1046 | 1039 |
1047 | 1040 |
1048 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, | 1041 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, |
1049 int end_token, | 1042 int end_token, |
(...skipping 2622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3672 // Register that a break target found at the given stop in the | 3665 // Register that a break target found at the given stop in the |
3673 // target stack has been used from the top of the target stack. Add | 3666 // target stack has been used from the top of the target stack. Add |
3674 // the break target to any TargetCollectors passed on the stack. | 3667 // the break target to any TargetCollectors passed on the stack. |
3675 for (Target* t = target_stack_; t != stop; t = t->previous()) { | 3668 for (Target* t = target_stack_; t != stop; t = t->previous()) { |
3676 TargetCollector* collector = t->node()->AsTargetCollector(); | 3669 TargetCollector* collector = t->node()->AsTargetCollector(); |
3677 if (collector != NULL) collector->AddTarget(target, zone()); | 3670 if (collector != NULL) collector->AddTarget(target, zone()); |
3678 } | 3671 } |
3679 } | 3672 } |
3680 | 3673 |
3681 | 3674 |
| 3675 void Parser::ThrowPendingError() { |
| 3676 if (has_pending_error_) { |
| 3677 MessageLocation location(script_, |
| 3678 pending_error_location_.beg_pos, |
| 3679 pending_error_location_.end_pos); |
| 3680 Factory* factory = isolate()->factory(); |
| 3681 bool has_arg = |
| 3682 !pending_error_arg_.is_null() || pending_error_char_arg_ != NULL; |
| 3683 Handle<FixedArray> elements = factory->NewFixedArray(has_arg ? 1 : 0); |
| 3684 if (!pending_error_arg_.is_null()) { |
| 3685 elements->set(0, *(pending_error_arg_.ToHandleChecked())); |
| 3686 } else if (pending_error_char_arg_ != NULL) { |
| 3687 Handle<String> arg_string = |
| 3688 factory->NewStringFromUtf8(CStrVector(pending_error_char_arg_)) |
| 3689 .ToHandleChecked(); |
| 3690 elements->set(0, *arg_string); |
| 3691 } |
| 3692 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); |
| 3693 Handle<Object> result = pending_error_is_reference_error_ |
| 3694 ? factory->NewReferenceError(pending_error_message_, array) |
| 3695 : factory->NewSyntaxError(pending_error_message_, array); |
| 3696 isolate()->Throw(*result, &location); |
| 3697 } |
| 3698 } |
| 3699 |
| 3700 |
3682 // ---------------------------------------------------------------------------- | 3701 // ---------------------------------------------------------------------------- |
3683 // Regular expressions | 3702 // Regular expressions |
3684 | 3703 |
3685 | 3704 |
3686 RegExpParser::RegExpParser(FlatStringReader* in, | 3705 RegExpParser::RegExpParser(FlatStringReader* in, |
3687 Handle<String>* error, | 3706 Handle<String>* error, |
3688 bool multiline, | 3707 bool multiline, |
3689 Zone* zone) | 3708 Zone* zone) |
3690 : isolate_(zone->isolate()), | 3709 : isolate_(zone->isolate()), |
3691 zone_(zone), | 3710 zone_(zone), |
(...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4599 ASSERT(info()->isolate()->has_pending_exception()); | 4618 ASSERT(info()->isolate()->has_pending_exception()); |
4600 } else { | 4619 } else { |
4601 result = ParseProgram(); | 4620 result = ParseProgram(); |
4602 } | 4621 } |
4603 } | 4622 } |
4604 info()->SetFunction(result); | 4623 info()->SetFunction(result); |
4605 return (result != NULL); | 4624 return (result != NULL); |
4606 } | 4625 } |
4607 | 4626 |
4608 } } // namespace v8::internal | 4627 } } // namespace v8::internal |
OLD | NEW |