OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 // of a scope. We check the scope positions of exactly one scope | 751 // of a scope. We check the scope positions of exactly one scope |
752 // nested in the global scope of a program. 'inner source' is the | 752 // nested in the global scope of a program. 'inner source' is the |
753 // source code that determines the part of the source belonging | 753 // source code that determines the part of the source belonging |
754 // to the nested scope. 'outer_prefix' and 'outer_suffix' are | 754 // to the nested scope. 'outer_prefix' and 'outer_suffix' are |
755 // parts of the source that belong to the global scope. | 755 // parts of the source that belong to the global scope. |
756 struct SourceData { | 756 struct SourceData { |
757 const char* outer_prefix; | 757 const char* outer_prefix; |
758 const char* inner_source; | 758 const char* inner_source; |
759 const char* outer_suffix; | 759 const char* outer_suffix; |
760 i::ScopeType scope_type; | 760 i::ScopeType scope_type; |
| 761 i::LanguageMode language_mode; |
761 }; | 762 }; |
762 | 763 |
763 const SourceData source_data[] = { | 764 const SourceData source_data[] = { |
764 { " with ({}) ", "{ block; }", " more;", i::WITH_SCOPE }, | 765 { " with ({}) ", "{ block; }", " more;", i::WITH_SCOPE, i::CLASSIC_MODE }, |
765 { " with ({}) ", "{ block; }", "; more;", i::WITH_SCOPE }, | 766 { " with ({}) ", "{ block; }", "; more;", i::WITH_SCOPE, i::CLASSIC_MODE }, |
766 { " with ({}) ", "{\n" | 767 { " with ({}) ", "{\n" |
767 " block;\n" | 768 " block;\n" |
768 " }", "\n" | 769 " }", "\n" |
769 " more;", i::WITH_SCOPE }, | 770 " more;", i::WITH_SCOPE, i::CLASSIC_MODE }, |
770 { " with ({}) ", "statement;", " more;", i::WITH_SCOPE }, | 771 { " with ({}) ", "statement;", " more;", i::WITH_SCOPE, i::CLASSIC_MODE }, |
771 { " with ({}) ", "statement", "\n" | 772 { " with ({}) ", "statement", "\n" |
772 " more;", i::WITH_SCOPE }, | 773 " more;", i::WITH_SCOPE, i::CLASSIC_MODE }, |
773 { " with ({})\n" | 774 { " with ({})\n" |
774 " ", "statement;", "\n" | 775 " ", "statement;", "\n" |
775 " more;", i::WITH_SCOPE }, | 776 " more;", i::WITH_SCOPE, i::CLASSIC_MODE }, |
776 { " try {} catch ", "(e) { block; }", " more;", i::CATCH_SCOPE }, | 777 { " try {} catch ", "(e) { block; }", " more;", |
777 { " try {} catch ", "(e) { block; }", "; more;", i::CATCH_SCOPE }, | 778 i::CATCH_SCOPE, i::CLASSIC_MODE }, |
| 779 { " try {} catch ", "(e) { block; }", "; more;", |
| 780 i::CATCH_SCOPE, i::CLASSIC_MODE }, |
778 { " try {} catch ", "(e) {\n" | 781 { " try {} catch ", "(e) {\n" |
779 " block;\n" | 782 " block;\n" |
780 " }", "\n" | 783 " }", "\n" |
781 " more;", i::CATCH_SCOPE }, | 784 " more;", i::CATCH_SCOPE, i::CLASSIC_MODE }, |
782 { " try {} catch ", "(e) { block; }", " finally { block; } more;", | 785 { " try {} catch ", "(e) { block; }", " finally { block; } more;", |
783 i::CATCH_SCOPE }, | 786 i::CATCH_SCOPE, i::CLASSIC_MODE }, |
784 { " start;\n" | 787 { " start;\n" |
785 " ", "{ let block; }", " more;", i::BLOCK_SCOPE }, | 788 " ", "{ let block; }", " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
786 { " start;\n" | 789 { " start;\n" |
787 " ", "{ let block; }", "; more;", i::BLOCK_SCOPE }, | 790 " ", "{ let block; }", "; more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
788 { " start;\n" | 791 { " start;\n" |
789 " ", "{\n" | 792 " ", "{\n" |
790 " let block;\n" | 793 " let block;\n" |
791 " }", "\n" | 794 " }", "\n" |
792 " more;", i::BLOCK_SCOPE }, | 795 " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
793 { " start;\n" | 796 { " start;\n" |
794 " function fun", "(a,b) { infunction; }", " more;", | 797 " function fun", "(a,b) { infunction; }", " more;", |
795 i::FUNCTION_SCOPE }, | 798 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, |
796 { " start;\n" | 799 { " start;\n" |
797 " function fun", "(a,b) {\n" | 800 " function fun", "(a,b) {\n" |
798 " infunction;\n" | 801 " infunction;\n" |
799 " }", "\n" | 802 " }", "\n" |
800 " more;", i::FUNCTION_SCOPE }, | 803 " more;", i::FUNCTION_SCOPE, i::CLASSIC_MODE }, |
801 { " (function fun", "(a,b) { infunction; }", ")();", | 804 { " (function fun", "(a,b) { infunction; }", ")();", |
802 i::FUNCTION_SCOPE }, | 805 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, |
803 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", " more;", | 806 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", " more;", |
804 i::BLOCK_SCOPE }, | 807 i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
805 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", "; more;", | 808 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", "; more;", |
806 i::BLOCK_SCOPE }, | 809 i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
807 { " for ", "(let x = 1 ; x < 10; ++ x) {\n" | 810 { " for ", "(let x = 1 ; x < 10; ++ x) {\n" |
808 " block;\n" | 811 " block;\n" |
809 " }", "\n" | 812 " }", "\n" |
810 " more;", i::BLOCK_SCOPE }, | 813 " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
811 { " for ", "(let x = 1 ; x < 10; ++ x) statement;", " more;", | 814 { " for ", "(let x = 1 ; x < 10; ++ x) statement;", " more;", |
812 i::BLOCK_SCOPE }, | 815 i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
813 { " for ", "(let x = 1 ; x < 10; ++ x) statement", "\n" | 816 { " for ", "(let x = 1 ; x < 10; ++ x) statement", "\n" |
814 " more;", i::BLOCK_SCOPE }, | 817 " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
815 { " for ", "(let x = 1 ; x < 10; ++ x)\n" | 818 { " for ", "(let x = 1 ; x < 10; ++ x)\n" |
816 " statement;", "\n" | 819 " statement;", "\n" |
817 " more;", i::BLOCK_SCOPE }, | 820 " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
818 { " for ", "(let x in {}) { block; }", " more;", i::BLOCK_SCOPE }, | 821 { " for ", "(let x in {}) { block; }", " more;", |
819 { " for ", "(let x in {}) { block; }", "; more;", i::BLOCK_SCOPE }, | 822 i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
| 823 { " for ", "(let x in {}) { block; }", "; more;", |
| 824 i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
820 { " for ", "(let x in {}) {\n" | 825 { " for ", "(let x in {}) {\n" |
821 " block;\n" | 826 " block;\n" |
822 " }", "\n" | 827 " }", "\n" |
823 " more;", i::BLOCK_SCOPE }, | 828 " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
824 { " for ", "(let x in {}) statement;", " more;", i::BLOCK_SCOPE }, | 829 { " for ", "(let x in {}) statement;", " more;", |
| 830 i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
825 { " for ", "(let x in {}) statement", "\n" | 831 { " for ", "(let x in {}) statement", "\n" |
826 " more;", i::BLOCK_SCOPE }, | 832 " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
827 { " for ", "(let x in {})\n" | 833 { " for ", "(let x in {})\n" |
828 " statement;", "\n" | 834 " statement;", "\n" |
829 " more;", i::BLOCK_SCOPE }, | 835 " more;", i::BLOCK_SCOPE, i::EXTENDED_MODE }, |
830 { NULL, NULL, NULL, i::EVAL_SCOPE } | 836 { NULL, NULL, NULL, i::EVAL_SCOPE, i::CLASSIC_MODE } |
831 }; | 837 }; |
832 | 838 |
833 v8::HandleScope handles; | 839 v8::HandleScope handles; |
834 v8::Persistent<v8::Context> context = v8::Context::New(); | 840 v8::Persistent<v8::Context> context = v8::Context::New(); |
835 v8::Context::Scope context_scope(context); | 841 v8::Context::Scope context_scope(context); |
836 | 842 |
837 int marker; | 843 int marker; |
838 i::Isolate::Current()->stack_guard()->SetStackLimit( | 844 i::Isolate::Current()->stack_guard()->SetStackLimit( |
839 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 845 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
840 | 846 |
841 for (int i = 0; source_data[i].outer_prefix; i++) { | 847 for (int i = 0; source_data[i].outer_prefix; i++) { |
842 int kPrefixLen = i::StrLength(source_data[i].outer_prefix); | 848 int kPrefixLen = i::StrLength(source_data[i].outer_prefix); |
843 int kInnerLen = i::StrLength(source_data[i].inner_source); | 849 int kInnerLen = i::StrLength(source_data[i].inner_source); |
844 int kSuffixLen = i::StrLength(source_data[i].outer_suffix); | 850 int kSuffixLen = i::StrLength(source_data[i].outer_suffix); |
845 int kProgramSize = kPrefixLen + kInnerLen + kSuffixLen; | 851 int kProgramSize = kPrefixLen + kInnerLen + kSuffixLen; |
846 i::Vector<char> program = i::Vector<char>::New(kProgramSize + 1); | 852 i::Vector<char> program = i::Vector<char>::New(kProgramSize + 1); |
847 int length = i::OS::SNPrintF(program, "%s%s%s", | 853 int length = i::OS::SNPrintF(program, "%s%s%s", |
848 source_data[i].outer_prefix, | 854 source_data[i].outer_prefix, |
849 source_data[i].inner_source, | 855 source_data[i].inner_source, |
850 source_data[i].outer_suffix); | 856 source_data[i].outer_suffix); |
851 CHECK(length == kProgramSize); | 857 CHECK(length == kProgramSize); |
852 | 858 |
853 // Parse program source. | 859 // Parse program source. |
854 i::Handle<i::String> source( | 860 i::Handle<i::String> source( |
855 FACTORY->NewStringFromAscii(i::CStrVector(program.start()))); | 861 FACTORY->NewStringFromAscii(i::CStrVector(program.start()))); |
856 i::Handle<i::Script> script = FACTORY->NewScript(source); | 862 i::Handle<i::Script> script = FACTORY->NewScript(source); |
857 i::Parser parser(script, false, NULL, NULL); | 863 i::Parser parser(script, false, NULL, NULL); |
858 parser.SetHarmonyScoping(true); | 864 parser.SetHarmonyScoping(true); |
859 i::FunctionLiteral* function = | 865 i::FunctionLiteral* function = |
860 parser.ParseProgram(source, true, i::kNonStrictMode); | 866 parser.ParseProgram(source, true, source_data[i].language_mode); |
861 ASSERT(function != NULL); | 867 ASSERT(function != NULL); |
862 | 868 |
863 // Check scope types and positions. | 869 // Check scope types and positions. |
864 i::Scope* scope = function->scope(); | 870 i::Scope* scope = function->scope(); |
865 CHECK(scope->is_global_scope()); | 871 CHECK(scope->is_global_scope()); |
866 CHECK_EQ(scope->start_position(), 0); | 872 CHECK_EQ(scope->start_position(), 0); |
867 CHECK_EQ(scope->end_position(), kProgramSize); | 873 CHECK_EQ(scope->end_position(), kProgramSize); |
868 CHECK_EQ(scope->inner_scopes()->length(), 1); | 874 CHECK_EQ(scope->inner_scopes()->length(), 1); |
869 | 875 |
870 i::Scope* inner_scope = scope->inner_scopes()->at(0); | 876 i::Scope* inner_scope = scope->inner_scopes()->at(0); |
871 CHECK_EQ(inner_scope->type(), source_data[i].scope_type); | 877 CHECK_EQ(inner_scope->type(), source_data[i].scope_type); |
872 CHECK_EQ(inner_scope->start_position(), kPrefixLen); | 878 CHECK_EQ(inner_scope->start_position(), kPrefixLen); |
873 // The end position of a token is one position after the last | 879 // The end position of a token is one position after the last |
874 // character belonging to that token. | 880 // character belonging to that token. |
875 CHECK_EQ(inner_scope->end_position(), kPrefixLen + kInnerLen); | 881 CHECK_EQ(inner_scope->end_position(), kPrefixLen + kInnerLen); |
876 } | 882 } |
877 } | 883 } |
OLD | NEW |