OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 return !scanner().stack_overflow(); | 730 return !scanner().stack_overflow(); |
731 } | 731 } |
732 | 732 |
733 | 733 |
734 FunctionLiteral* Parser::ParseProgram(Handle<String> source, | 734 FunctionLiteral* Parser::ParseProgram(Handle<String> source, |
735 unibrow::CharacterStream* stream, | 735 unibrow::CharacterStream* stream, |
736 bool in_global_context) { | 736 bool in_global_context) { |
737 ZoneScope zone_scope(DONT_DELETE_ON_EXIT); | 737 ZoneScope zone_scope(DONT_DELETE_ON_EXIT); |
738 | 738 |
739 StatsRateScope timer(&Counters::parse); | 739 StatsRateScope timer(&Counters::parse); |
740 Counters::total_parse_size.Increment(source->length()); | 740 StringShape shape(*source); |
| 741 Counters::total_parse_size.Increment(source->length(shape)); |
741 | 742 |
742 // Initialize parser state. | 743 // Initialize parser state. |
743 source->TryFlatten(); | 744 source->TryFlatten(shape); |
744 scanner_.Init(source, stream, 0); | 745 scanner_.Init(source, stream, 0); |
745 ASSERT(target_stack_ == NULL); | 746 ASSERT(target_stack_ == NULL); |
746 | 747 |
747 // Compute the parsing mode. | 748 // Compute the parsing mode. |
748 mode_ = FLAG_lazy ? PARSE_LAZILY : PARSE_EAGERLY; | 749 mode_ = FLAG_lazy ? PARSE_LAZILY : PARSE_EAGERLY; |
749 if (allow_natives_syntax_ || extension_ != NULL) mode_ = PARSE_EAGERLY; | 750 if (allow_natives_syntax_ || extension_ != NULL) mode_ = PARSE_EAGERLY; |
750 | 751 |
751 Scope::Type type = | 752 Scope::Type type = |
752 in_global_context | 753 in_global_context |
753 ? Scope::GLOBAL_SCOPE | 754 ? Scope::GLOBAL_SCOPE |
754 : Scope::EVAL_SCOPE; | 755 : Scope::EVAL_SCOPE; |
755 Handle<String> no_name = factory()->EmptySymbol(); | 756 Handle<String> no_name = factory()->EmptySymbol(); |
756 | 757 |
757 FunctionLiteral* result = NULL; | 758 FunctionLiteral* result = NULL; |
758 { Scope* scope = factory()->NewScope(top_scope_, type, inside_with()); | 759 { Scope* scope = factory()->NewScope(top_scope_, type, inside_with()); |
759 LexicalScope lexical_scope(this, scope); | 760 LexicalScope lexical_scope(this, scope); |
760 TemporaryScope temp_scope(this); | 761 TemporaryScope temp_scope(this); |
761 ZoneListWrapper<Statement> body(16); | 762 ZoneListWrapper<Statement> body(16); |
762 bool ok = true; | 763 bool ok = true; |
763 ParseSourceElements(&body, Token::EOS, &ok); | 764 ParseSourceElements(&body, Token::EOS, &ok); |
764 if (ok) { | 765 if (ok) { |
765 result = NEW(FunctionLiteral(no_name, top_scope_, | 766 result = NEW(FunctionLiteral(no_name, top_scope_, |
766 body.elements(), | 767 body.elements(), |
767 temp_scope.materialized_literal_count(), | 768 temp_scope.materialized_literal_count(), |
768 temp_scope.contains_array_literal(), | 769 temp_scope.contains_array_literal(), |
769 temp_scope.expected_property_count(), | 770 temp_scope.expected_property_count(), |
770 0, 0, source->length(), false)); | 771 0, 0, source->length(shape), false)); |
771 } else if (scanner().stack_overflow()) { | 772 } else if (scanner().stack_overflow()) { |
772 Top::StackOverflow(); | 773 Top::StackOverflow(); |
773 } | 774 } |
774 } | 775 } |
775 | 776 |
776 // Make sure the target stack is empty. | 777 // Make sure the target stack is empty. |
777 ASSERT(target_stack_ == NULL); | 778 ASSERT(target_stack_ == NULL); |
778 | 779 |
779 // If there was a syntax error we have to get rid of the AST | 780 // If there was a syntax error we have to get rid of the AST |
780 // and it is not safe to do so before the scope has been deleted. | 781 // and it is not safe to do so before the scope has been deleted. |
781 if (result == NULL) zone_scope.DeleteOnExit(); | 782 if (result == NULL) zone_scope.DeleteOnExit(); |
782 return result; | 783 return result; |
783 } | 784 } |
784 | 785 |
785 | 786 |
786 FunctionLiteral* Parser::ParseLazy(Handle<String> source, | 787 FunctionLiteral* Parser::ParseLazy(Handle<String> source, |
787 Handle<String> name, | 788 Handle<String> name, |
788 int start_position, | 789 int start_position, |
789 bool is_expression) { | 790 bool is_expression) { |
790 ZoneScope zone_scope(DONT_DELETE_ON_EXIT); | 791 ZoneScope zone_scope(DONT_DELETE_ON_EXIT); |
791 StatsRateScope timer(&Counters::parse_lazy); | 792 StatsRateScope timer(&Counters::parse_lazy); |
792 Counters::total_parse_size.Increment(source->length()); | 793 StringShape shape(*source); |
| 794 source->TryFlatten(shape); |
| 795 Counters::total_parse_size.Increment(source->length(shape)); |
793 SafeStringInputBuffer buffer(source.location()); | 796 SafeStringInputBuffer buffer(source.location()); |
794 | 797 |
795 // Initialize parser state. | 798 // Initialize parser state. |
796 source->TryFlatten(); | |
797 scanner_.Init(source, &buffer, start_position); | 799 scanner_.Init(source, &buffer, start_position); |
798 ASSERT(target_stack_ == NULL); | 800 ASSERT(target_stack_ == NULL); |
799 mode_ = PARSE_EAGERLY; | 801 mode_ = PARSE_EAGERLY; |
800 | 802 |
801 // Place holder for the result. | 803 // Place holder for the result. |
802 FunctionLiteral* result = NULL; | 804 FunctionLiteral* result = NULL; |
803 | 805 |
804 { | 806 { |
805 // Parse the function literal. | 807 // Parse the function literal. |
806 Handle<String> no_name = factory()->EmptySymbol(); | 808 Handle<String> no_name = factory()->EmptySymbol(); |
(...skipping 2447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3254 start_position, | 3256 start_position, |
3255 is_expression); | 3257 is_expression); |
3256 return result; | 3258 return result; |
3257 } | 3259 } |
3258 | 3260 |
3259 | 3261 |
3260 #undef NEW | 3262 #undef NEW |
3261 | 3263 |
3262 | 3264 |
3263 } } // namespace v8::internal | 3265 } } // namespace v8::internal |
OLD | NEW |