OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); | 559 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); |
560 set_allow_modules(!info->is_native() && FLAG_harmony_modules); | 560 set_allow_modules(!info->is_native() && FLAG_harmony_modules); |
561 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); | 561 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); |
562 set_allow_lazy(false); // Must be explicitly enabled. | 562 set_allow_lazy(false); // Must be explicitly enabled. |
563 set_allow_generators(FLAG_harmony_generators); | 563 set_allow_generators(FLAG_harmony_generators); |
564 set_allow_for_of(FLAG_harmony_iteration); | 564 set_allow_for_of(FLAG_harmony_iteration); |
565 } | 565 } |
566 | 566 |
567 | 567 |
568 FunctionLiteral* Parser::ParseProgram() { | 568 FunctionLiteral* Parser::ParseProgram() { |
569 ZoneScope zone_scope(zone(), DONT_DELETE_ON_EXIT); | |
570 HistogramTimerScope timer(isolate()->counters()->parse()); | 569 HistogramTimerScope timer(isolate()->counters()->parse()); |
571 Handle<String> source(String::cast(script_->source())); | 570 Handle<String> source(String::cast(script_->source())); |
572 isolate()->counters()->total_parse_size()->Increment(source->length()); | 571 isolate()->counters()->total_parse_size()->Increment(source->length()); |
573 int64_t start = FLAG_trace_parse ? OS::Ticks() : 0; | 572 int64_t start = FLAG_trace_parse ? OS::Ticks() : 0; |
574 fni_ = new(zone()) FuncNameInferrer(isolate(), zone()); | 573 fni_ = new(zone()) FuncNameInferrer(isolate(), zone()); |
575 | 574 |
576 // Initialize parser state. | 575 // Initialize parser state. |
577 source->TryFlatten(); | 576 source->TryFlatten(); |
578 FunctionLiteral* result; | 577 FunctionLiteral* result; |
579 if (source->IsExternalTwoByteString()) { | 578 if (source->IsExternalTwoByteString()) { |
580 // Notice that the stream is destroyed at the end of the branch block. | 579 // Notice that the stream is destroyed at the end of the branch block. |
581 // The last line of the blocks can't be moved outside, even though they're | 580 // The last line of the blocks can't be moved outside, even though they're |
582 // identical calls. | 581 // identical calls. |
583 ExternalTwoByteStringUtf16CharacterStream stream( | 582 ExternalTwoByteStringUtf16CharacterStream stream( |
584 Handle<ExternalTwoByteString>::cast(source), 0, source->length()); | 583 Handle<ExternalTwoByteString>::cast(source), 0, source->length()); |
585 scanner_.Initialize(&stream); | 584 scanner_.Initialize(&stream); |
586 result = DoParseProgram(info(), source, &zone_scope); | 585 result = DoParseProgram(info(), source); |
587 } else { | 586 } else { |
588 GenericStringUtf16CharacterStream stream(source, 0, source->length()); | 587 GenericStringUtf16CharacterStream stream(source, 0, source->length()); |
589 scanner_.Initialize(&stream); | 588 scanner_.Initialize(&stream); |
590 result = DoParseProgram(info(), source, &zone_scope); | 589 result = DoParseProgram(info(), source); |
591 } | 590 } |
592 | 591 |
593 if (FLAG_trace_parse && result != NULL) { | 592 if (FLAG_trace_parse && result != NULL) { |
594 double ms = static_cast<double>(OS::Ticks() - start) / 1000; | 593 double ms = static_cast<double>(OS::Ticks() - start) / 1000; |
595 if (info()->is_eval()) { | 594 if (info()->is_eval()) { |
596 PrintF("[parsing eval"); | 595 PrintF("[parsing eval"); |
597 } else if (info()->script()->name()->IsString()) { | 596 } else if (info()->script()->name()->IsString()) { |
598 String* name = String::cast(info()->script()->name()); | 597 String* name = String::cast(info()->script()->name()); |
599 SmartArrayPointer<char> name_chars = name->ToCString(); | 598 SmartArrayPointer<char> name_chars = name->ToCString(); |
600 PrintF("[parsing script: %s", *name_chars); | 599 PrintF("[parsing script: %s", *name_chars); |
601 } else { | 600 } else { |
602 PrintF("[parsing script"); | 601 PrintF("[parsing script"); |
603 } | 602 } |
604 PrintF(" - took %0.3f ms]\n", ms); | 603 PrintF(" - took %0.3f ms]\n", ms); |
605 } | 604 } |
606 return result; | 605 return result; |
607 } | 606 } |
608 | 607 |
609 | 608 |
610 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, | 609 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, |
611 Handle<String> source, | 610 Handle<String> source) { |
612 ZoneScope* zone_scope) { | |
613 ASSERT(top_scope_ == NULL); | 611 ASSERT(top_scope_ == NULL); |
614 ASSERT(target_stack_ == NULL); | 612 ASSERT(target_stack_ == NULL); |
615 if (pre_parse_data_ != NULL) pre_parse_data_->Initialize(); | 613 if (pre_parse_data_ != NULL) pre_parse_data_->Initialize(); |
616 | 614 |
617 Handle<String> no_name = isolate()->factory()->empty_string(); | 615 Handle<String> no_name = isolate()->factory()->empty_string(); |
618 | 616 |
619 FunctionLiteral* result = NULL; | 617 FunctionLiteral* result = NULL; |
620 { Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); | 618 { Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); |
621 info->SetGlobalScope(scope); | 619 info->SetGlobalScope(scope); |
622 if (!info->context().is_null()) { | 620 if (!info->context().is_null()) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 FunctionLiteral::kNotGenerator); | 681 FunctionLiteral::kNotGenerator); |
684 result->set_ast_properties(factory()->visitor()->ast_properties()); | 682 result->set_ast_properties(factory()->visitor()->ast_properties()); |
685 } else if (stack_overflow_) { | 683 } else if (stack_overflow_) { |
686 isolate()->StackOverflow(); | 684 isolate()->StackOverflow(); |
687 } | 685 } |
688 } | 686 } |
689 | 687 |
690 // Make sure the target stack is empty. | 688 // Make sure the target stack is empty. |
691 ASSERT(target_stack_ == NULL); | 689 ASSERT(target_stack_ == NULL); |
692 | 690 |
693 // If there was a syntax error we have to get rid of the AST | |
694 // and it is not safe to do so before the scope has been deleted. | |
695 if (result == NULL) zone_scope->DeleteOnExit(); | |
696 return result; | 691 return result; |
697 } | 692 } |
698 | 693 |
699 | 694 |
700 FunctionLiteral* Parser::ParseLazy() { | 695 FunctionLiteral* Parser::ParseLazy() { |
701 ZoneScope zone_scope(zone(), DONT_DELETE_ON_EXIT); | |
702 HistogramTimerScope timer(isolate()->counters()->parse_lazy()); | 696 HistogramTimerScope timer(isolate()->counters()->parse_lazy()); |
703 Handle<String> source(String::cast(script_->source())); | 697 Handle<String> source(String::cast(script_->source())); |
704 isolate()->counters()->total_parse_size()->Increment(source->length()); | 698 isolate()->counters()->total_parse_size()->Increment(source->length()); |
705 int64_t start = FLAG_trace_parse ? OS::Ticks() : 0; | 699 int64_t start = FLAG_trace_parse ? OS::Ticks() : 0; |
706 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); | 700 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); |
707 | 701 |
708 // Initialize parser state. | 702 // Initialize parser state. |
709 source->TryFlatten(); | 703 source->TryFlatten(); |
710 FunctionLiteral* result; | 704 FunctionLiteral* result; |
711 if (source->IsExternalTwoByteString()) { | 705 if (source->IsExternalTwoByteString()) { |
712 ExternalTwoByteStringUtf16CharacterStream stream( | 706 ExternalTwoByteStringUtf16CharacterStream stream( |
713 Handle<ExternalTwoByteString>::cast(source), | 707 Handle<ExternalTwoByteString>::cast(source), |
714 shared_info->start_position(), | 708 shared_info->start_position(), |
715 shared_info->end_position()); | 709 shared_info->end_position()); |
716 result = ParseLazy(&stream, &zone_scope); | 710 result = ParseLazy(&stream); |
717 } else { | 711 } else { |
718 GenericStringUtf16CharacterStream stream(source, | 712 GenericStringUtf16CharacterStream stream(source, |
719 shared_info->start_position(), | 713 shared_info->start_position(), |
720 shared_info->end_position()); | 714 shared_info->end_position()); |
721 result = ParseLazy(&stream, &zone_scope); | 715 result = ParseLazy(&stream); |
722 } | 716 } |
723 | 717 |
724 if (FLAG_trace_parse && result != NULL) { | 718 if (FLAG_trace_parse && result != NULL) { |
725 double ms = static_cast<double>(OS::Ticks() - start) / 1000; | 719 double ms = static_cast<double>(OS::Ticks() - start) / 1000; |
726 SmartArrayPointer<char> name_chars = result->debug_name()->ToCString(); | 720 SmartArrayPointer<char> name_chars = result->debug_name()->ToCString(); |
727 PrintF("[parsing function: %s - took %0.3f ms]\n", *name_chars, ms); | 721 PrintF("[parsing function: %s - took %0.3f ms]\n", *name_chars, ms); |
728 } | 722 } |
729 return result; | 723 return result; |
730 } | 724 } |
731 | 725 |
732 | 726 |
733 FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source, | 727 FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) { |
734 ZoneScope* zone_scope) { | |
735 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); | 728 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); |
736 scanner_.Initialize(source); | 729 scanner_.Initialize(source); |
737 ASSERT(top_scope_ == NULL); | 730 ASSERT(top_scope_ == NULL); |
738 ASSERT(target_stack_ == NULL); | 731 ASSERT(target_stack_ == NULL); |
739 | 732 |
740 Handle<String> name(String::cast(shared_info->name())); | 733 Handle<String> name(String::cast(shared_info->name())); |
741 fni_ = new(zone()) FuncNameInferrer(isolate(), zone()); | 734 fni_ = new(zone()) FuncNameInferrer(isolate(), zone()); |
742 fni_->PushEnclosingName(name); | 735 fni_->PushEnclosingName(name); |
743 | 736 |
744 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 737 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
(...skipping 27 matching lines...) Expand all Loading... |
772 RelocInfo::kNoPosition, | 765 RelocInfo::kNoPosition, |
773 function_type, | 766 function_type, |
774 &ok); | 767 &ok); |
775 // Make sure the results agree. | 768 // Make sure the results agree. |
776 ASSERT(ok == (result != NULL)); | 769 ASSERT(ok == (result != NULL)); |
777 } | 770 } |
778 | 771 |
779 // Make sure the target stack is empty. | 772 // Make sure the target stack is empty. |
780 ASSERT(target_stack_ == NULL); | 773 ASSERT(target_stack_ == NULL); |
781 | 774 |
782 // If there was a stack overflow we have to get rid of AST and it is | |
783 // not safe to do before scope has been deleted. | |
784 if (result == NULL) { | 775 if (result == NULL) { |
785 zone_scope->DeleteOnExit(); | |
786 if (stack_overflow_) isolate()->StackOverflow(); | 776 if (stack_overflow_) isolate()->StackOverflow(); |
787 } else { | 777 } else { |
788 Handle<String> inferred_name(shared_info->inferred_name()); | 778 Handle<String> inferred_name(shared_info->inferred_name()); |
789 result->set_inferred_name(inferred_name); | 779 result->set_inferred_name(inferred_name); |
790 } | 780 } |
791 return result; | 781 return result; |
792 } | 782 } |
793 | 783 |
794 | 784 |
795 Handle<String> Parser::GetSymbol() { | 785 Handle<String> Parser::GetSymbol() { |
(...skipping 5129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5925 ASSERT(info()->isolate()->has_pending_exception()); | 5915 ASSERT(info()->isolate()->has_pending_exception()); |
5926 } else { | 5916 } else { |
5927 result = ParseProgram(); | 5917 result = ParseProgram(); |
5928 } | 5918 } |
5929 } | 5919 } |
5930 info()->SetFunction(result); | 5920 info()->SetFunction(result); |
5931 return (result != NULL); | 5921 return (result != NULL); |
5932 } | 5922 } |
5933 | 5923 |
5934 } } // namespace v8::internal | 5924 } } // namespace v8::internal |
OLD | NEW |