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 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 zone_scope->DeleteOnExit(); | 787 zone_scope->DeleteOnExit(); |
788 if (stack_overflow_) isolate()->StackOverflow(); | 788 if (stack_overflow_) isolate()->StackOverflow(); |
789 } else { | 789 } else { |
790 Handle<String> inferred_name(shared_info->inferred_name()); | 790 Handle<String> inferred_name(shared_info->inferred_name()); |
791 result->set_inferred_name(inferred_name); | 791 result->set_inferred_name(inferred_name); |
792 } | 792 } |
793 return result; | 793 return result; |
794 } | 794 } |
795 | 795 |
796 | 796 |
797 Handle<String> Parser::GetSymbol(bool* ok) { | 797 Handle<String> Parser::GetSymbol() { |
798 int symbol_id = -1; | 798 int symbol_id = -1; |
799 if (pre_parse_data() != NULL) { | 799 if (pre_parse_data() != NULL) { |
800 symbol_id = pre_parse_data()->GetSymbolIdentifier(); | 800 symbol_id = pre_parse_data()->GetSymbolIdentifier(); |
801 } | 801 } |
802 return LookupSymbol(symbol_id); | 802 return LookupSymbol(symbol_id); |
803 } | 803 } |
804 | 804 |
805 | 805 |
806 void Parser::ReportMessage(const char* type, Vector<const char*> args) { | 806 void Parser::ReportMessage(const char* type, Vector<const char*> args) { |
807 Scanner::Location source_location = scanner().location(); | 807 Scanner::Location source_location = scanner().location(); |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1334 | 1334 |
1335 return factory()->NewModuleVariable(proxy); | 1335 return factory()->NewModuleVariable(proxy); |
1336 } | 1336 } |
1337 | 1337 |
1338 | 1338 |
1339 Module* Parser::ParseModuleUrl(bool* ok) { | 1339 Module* Parser::ParseModuleUrl(bool* ok) { |
1340 // Module: | 1340 // Module: |
1341 // String | 1341 // String |
1342 | 1342 |
1343 Expect(Token::STRING, CHECK_OK); | 1343 Expect(Token::STRING, CHECK_OK); |
1344 Handle<String> symbol = GetSymbol(CHECK_OK); | 1344 Handle<String> symbol = GetSymbol(); |
1345 | 1345 |
1346 // TODO(ES6): Request JS resource from environment... | 1346 // TODO(ES6): Request JS resource from environment... |
1347 | 1347 |
1348 #ifdef DEBUG | 1348 #ifdef DEBUG |
1349 if (FLAG_print_interface_details) PrintF("# Url "); | 1349 if (FLAG_print_interface_details) PrintF("# Url "); |
1350 #endif | 1350 #endif |
1351 | 1351 |
1352 // Create an empty literal as long as the feature isn't finished. | 1352 // Create an empty literal as long as the feature isn't finished. |
1353 USE(symbol); | 1353 USE(symbol); |
1354 Scope* scope = NewScope(top_scope_, MODULE_SCOPE); | 1354 Scope* scope = NewScope(top_scope_, MODULE_SCOPE); |
(...skipping 2330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3685 ASSERT(scanner().is_literal_ascii()); | 3685 ASSERT(scanner().is_literal_ascii()); |
3686 double value = StringToDouble(isolate()->unicode_cache(), | 3686 double value = StringToDouble(isolate()->unicode_cache(), |
3687 scanner().literal_ascii_string(), | 3687 scanner().literal_ascii_string(), |
3688 ALLOW_HEX | ALLOW_OCTALS); | 3688 ALLOW_HEX | ALLOW_OCTALS); |
3689 result = factory()->NewNumberLiteral(value); | 3689 result = factory()->NewNumberLiteral(value); |
3690 break; | 3690 break; |
3691 } | 3691 } |
3692 | 3692 |
3693 case Token::STRING: { | 3693 case Token::STRING: { |
3694 Consume(Token::STRING); | 3694 Consume(Token::STRING); |
3695 Handle<String> symbol = GetSymbol(CHECK_OK); | 3695 Handle<String> symbol = GetSymbol(); |
3696 result = factory()->NewLiteral(symbol); | 3696 result = factory()->NewLiteral(symbol); |
3697 if (fni_ != NULL) fni_->PushLiteralName(symbol); | 3697 if (fni_ != NULL) fni_->PushLiteralName(symbol); |
3698 break; | 3698 break; |
3699 } | 3699 } |
3700 | 3700 |
3701 case Token::ASSIGN_DIV: | 3701 case Token::ASSIGN_DIV: |
3702 result = ParseRegExpLiteral(true, CHECK_OK); | 3702 result = ParseRegExpLiteral(true, CHECK_OK); |
3703 break; | 3703 break; |
3704 | 3704 |
3705 case Token::DIV: | 3705 case Token::DIV: |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4040 Token::Value next = Next(); | 4040 Token::Value next = Next(); |
4041 bool is_keyword = Token::IsKeyword(next); | 4041 bool is_keyword = Token::IsKeyword(next); |
4042 if (next == Token::IDENTIFIER || next == Token::NUMBER || | 4042 if (next == Token::IDENTIFIER || next == Token::NUMBER || |
4043 next == Token::FUTURE_RESERVED_WORD || | 4043 next == Token::FUTURE_RESERVED_WORD || |
4044 next == Token::FUTURE_STRICT_RESERVED_WORD || | 4044 next == Token::FUTURE_STRICT_RESERVED_WORD || |
4045 next == Token::STRING || is_keyword) { | 4045 next == Token::STRING || is_keyword) { |
4046 Handle<String> name; | 4046 Handle<String> name; |
4047 if (is_keyword) { | 4047 if (is_keyword) { |
4048 name = isolate_->factory()->InternalizeUtf8String(Token::String(next)); | 4048 name = isolate_->factory()->InternalizeUtf8String(Token::String(next)); |
4049 } else { | 4049 } else { |
4050 name = GetSymbol(CHECK_OK); | 4050 name = GetSymbol(); |
4051 } | 4051 } |
4052 FunctionLiteral* value = | 4052 FunctionLiteral* value = |
4053 ParseFunctionLiteral(name, | 4053 ParseFunctionLiteral(name, |
4054 false, // reserved words are allowed here | 4054 false, // reserved words are allowed here |
4055 false, // not a generator | 4055 false, // not a generator |
4056 RelocInfo::kNoPosition, | 4056 RelocInfo::kNoPosition, |
4057 FunctionLiteral::ANONYMOUS_EXPRESSION, | 4057 FunctionLiteral::ANONYMOUS_EXPRESSION, |
4058 CHECK_OK); | 4058 CHECK_OK); |
4059 // Allow any number of parameters for compatibilty with JSC. | 4059 // Allow any number of parameters for compatibilty with JSC. |
4060 // Specification only allows zero parameters for get and one for set. | 4060 // Specification only allows zero parameters for get and one for set. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4121 } | 4121 } |
4122 continue; // restart the while | 4122 continue; // restart the while |
4123 } | 4123 } |
4124 // Failed to parse as get/set property, so it's just a property | 4124 // Failed to parse as get/set property, so it's just a property |
4125 // called "get" or "set". | 4125 // called "get" or "set". |
4126 key = factory()->NewLiteral(id); | 4126 key = factory()->NewLiteral(id); |
4127 break; | 4127 break; |
4128 } | 4128 } |
4129 case Token::STRING: { | 4129 case Token::STRING: { |
4130 Consume(Token::STRING); | 4130 Consume(Token::STRING); |
4131 Handle<String> string = GetSymbol(CHECK_OK); | 4131 Handle<String> string = GetSymbol(); |
4132 if (fni_ != NULL) fni_->PushLiteralName(string); | 4132 if (fni_ != NULL) fni_->PushLiteralName(string); |
4133 uint32_t index; | 4133 uint32_t index; |
4134 if (!string.is_null() && string->AsArrayIndex(&index)) { | 4134 if (!string.is_null() && string->AsArrayIndex(&index)) { |
4135 key = factory()->NewNumberLiteral(index); | 4135 key = factory()->NewNumberLiteral(index); |
4136 break; | 4136 break; |
4137 } | 4137 } |
4138 key = factory()->NewLiteral(string); | 4138 key = factory()->NewLiteral(string); |
4139 break; | 4139 break; |
4140 } | 4140 } |
4141 case Token::NUMBER: { | 4141 case Token::NUMBER: { |
4142 Consume(Token::NUMBER); | 4142 Consume(Token::NUMBER); |
4143 ASSERT(scanner().is_literal_ascii()); | 4143 ASSERT(scanner().is_literal_ascii()); |
4144 double value = StringToDouble(isolate()->unicode_cache(), | 4144 double value = StringToDouble(isolate()->unicode_cache(), |
4145 scanner().literal_ascii_string(), | 4145 scanner().literal_ascii_string(), |
4146 ALLOW_HEX | ALLOW_OCTALS); | 4146 ALLOW_HEX | ALLOW_OCTALS); |
4147 key = factory()->NewNumberLiteral(value); | 4147 key = factory()->NewNumberLiteral(value); |
4148 break; | 4148 break; |
4149 } | 4149 } |
4150 default: | 4150 default: |
4151 if (Token::IsKeyword(next)) { | 4151 if (Token::IsKeyword(next)) { |
4152 Consume(next); | 4152 Consume(next); |
4153 Handle<String> string = GetSymbol(CHECK_OK); | 4153 Handle<String> string = GetSymbol(); |
4154 key = factory()->NewLiteral(string); | 4154 key = factory()->NewLiteral(string); |
4155 } else { | 4155 } else { |
4156 // Unexpected token. | 4156 // Unexpected token. |
4157 Token::Value next = Next(); | 4157 Token::Value next = Next(); |
4158 ReportUnexpectedToken(next); | 4158 ReportUnexpectedToken(next); |
4159 *ok = false; | 4159 *ok = false; |
4160 return NULL; | 4160 return NULL; |
4161 } | 4161 } |
4162 } | 4162 } |
4163 | 4163 |
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4816 tok == Token::EOS) { | 4816 tok == Token::EOS) { |
4817 return; | 4817 return; |
4818 } | 4818 } |
4819 Expect(Token::SEMICOLON, ok); | 4819 Expect(Token::SEMICOLON, ok); |
4820 } | 4820 } |
4821 | 4821 |
4822 | 4822 |
4823 void Parser::ExpectContextualKeyword(const char* keyword, bool* ok) { | 4823 void Parser::ExpectContextualKeyword(const char* keyword, bool* ok) { |
4824 Expect(Token::IDENTIFIER, ok); | 4824 Expect(Token::IDENTIFIER, ok); |
4825 if (!*ok) return; | 4825 if (!*ok) return; |
4826 Handle<String> symbol = GetSymbol(ok); | 4826 Handle<String> symbol = GetSymbol(); |
4827 if (!*ok) return; | 4827 if (!*ok) return; |
4828 if (!symbol->IsUtf8EqualTo(CStrVector(keyword))) { | 4828 if (!symbol->IsUtf8EqualTo(CStrVector(keyword))) { |
4829 *ok = false; | 4829 *ok = false; |
4830 ReportUnexpectedToken(scanner().current_token()); | 4830 ReportUnexpectedToken(scanner().current_token()); |
4831 } | 4831 } |
4832 } | 4832 } |
4833 | 4833 |
4834 | 4834 |
4835 Literal* Parser::GetLiteralUndefined() { | 4835 Literal* Parser::GetLiteralUndefined() { |
4836 return factory()->NewLiteral(isolate()->factory()->undefined_value()); | 4836 return factory()->NewLiteral(isolate()->factory()->undefined_value()); |
4837 } | 4837 } |
4838 | 4838 |
4839 | 4839 |
4840 Literal* Parser::GetLiteralTheHole() { | 4840 Literal* Parser::GetLiteralTheHole() { |
4841 return factory()->NewLiteral(isolate()->factory()->the_hole_value()); | 4841 return factory()->NewLiteral(isolate()->factory()->the_hole_value()); |
4842 } | 4842 } |
4843 | 4843 |
4844 | 4844 |
4845 // Parses an identifier that is valid for the current scope, in particular it | 4845 // Parses an identifier that is valid for the current scope, in particular it |
4846 // fails on strict mode future reserved keywords in a strict scope. | 4846 // fails on strict mode future reserved keywords in a strict scope. |
4847 Handle<String> Parser::ParseIdentifier(bool* ok) { | 4847 Handle<String> Parser::ParseIdentifier(bool* ok) { |
4848 Token::Value next = Next(); | 4848 Token::Value next = Next(); |
4849 if (next == Token::IDENTIFIER || | 4849 if (next == Token::IDENTIFIER || |
4850 (top_scope_->is_classic_mode() && | 4850 (top_scope_->is_classic_mode() && |
4851 (next == Token::FUTURE_STRICT_RESERVED_WORD || | 4851 (next == Token::FUTURE_STRICT_RESERVED_WORD || |
4852 (next == Token::YIELD && !is_generator())))) { | 4852 (next == Token::YIELD && !is_generator())))) { |
4853 return GetSymbol(ok); | 4853 return GetSymbol(); |
4854 } else { | 4854 } else { |
4855 ReportUnexpectedToken(next); | 4855 ReportUnexpectedToken(next); |
4856 *ok = false; | 4856 *ok = false; |
4857 return Handle<String>(); | 4857 return Handle<String>(); |
4858 } | 4858 } |
4859 } | 4859 } |
4860 | 4860 |
4861 | 4861 |
4862 // Parses and identifier or a strict mode future reserved word, and indicate | 4862 // Parses and identifier or a strict mode future reserved word, and indicate |
4863 // whether it is strict mode future reserved. | 4863 // whether it is strict mode future reserved. |
4864 Handle<String> Parser::ParseIdentifierOrStrictReservedWord( | 4864 Handle<String> Parser::ParseIdentifierOrStrictReservedWord( |
4865 bool* is_strict_reserved, bool* ok) { | 4865 bool* is_strict_reserved, bool* ok) { |
4866 Token::Value next = Next(); | 4866 Token::Value next = Next(); |
4867 if (next == Token::IDENTIFIER) { | 4867 if (next == Token::IDENTIFIER) { |
4868 *is_strict_reserved = false; | 4868 *is_strict_reserved = false; |
4869 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || | 4869 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || |
4870 (next == Token::YIELD && !is_generator())) { | 4870 (next == Token::YIELD && !is_generator())) { |
4871 *is_strict_reserved = true; | 4871 *is_strict_reserved = true; |
4872 } else { | 4872 } else { |
4873 ReportUnexpectedToken(next); | 4873 ReportUnexpectedToken(next); |
4874 *ok = false; | 4874 *ok = false; |
4875 return Handle<String>(); | 4875 return Handle<String>(); |
4876 } | 4876 } |
4877 return GetSymbol(ok); | 4877 return GetSymbol(); |
4878 } | 4878 } |
4879 | 4879 |
4880 | 4880 |
4881 Handle<String> Parser::ParseIdentifierName(bool* ok) { | 4881 Handle<String> Parser::ParseIdentifierName(bool* ok) { |
4882 Token::Value next = Next(); | 4882 Token::Value next = Next(); |
4883 if (next != Token::IDENTIFIER && | 4883 if (next != Token::IDENTIFIER && |
4884 next != Token::FUTURE_RESERVED_WORD && | 4884 next != Token::FUTURE_RESERVED_WORD && |
4885 next != Token::FUTURE_STRICT_RESERVED_WORD && | 4885 next != Token::FUTURE_STRICT_RESERVED_WORD && |
4886 !Token::IsKeyword(next)) { | 4886 !Token::IsKeyword(next)) { |
4887 ReportUnexpectedToken(next); | 4887 ReportUnexpectedToken(next); |
4888 *ok = false; | 4888 *ok = false; |
4889 return Handle<String>(); | 4889 return Handle<String>(); |
4890 } | 4890 } |
4891 return GetSymbol(ok); | 4891 return GetSymbol(); |
4892 } | 4892 } |
4893 | 4893 |
4894 | 4894 |
4895 void Parser::MarkAsLValue(Expression* expression) { | 4895 void Parser::MarkAsLValue(Expression* expression) { |
4896 VariableProxy* proxy = expression != NULL | 4896 VariableProxy* proxy = expression != NULL |
4897 ? expression->AsVariableProxy() | 4897 ? expression->AsVariableProxy() |
4898 : NULL; | 4898 : NULL; |
4899 | 4899 |
4900 if (proxy != NULL) proxy->MarkAsLValue(); | 4900 if (proxy != NULL) proxy->MarkAsLValue(); |
4901 } | 4901 } |
(...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6025 ASSERT(info()->isolate()->has_pending_exception()); | 6025 ASSERT(info()->isolate()->has_pending_exception()); |
6026 } else { | 6026 } else { |
6027 result = ParseProgram(); | 6027 result = ParseProgram(); |
6028 } | 6028 } |
6029 } | 6029 } |
6030 info()->SetFunction(result); | 6030 info()->SetFunction(result); |
6031 return (result != NULL); | 6031 return (result != NULL); |
6032 } | 6032 } |
6033 | 6033 |
6034 } } // namespace v8::internal | 6034 } } // namespace v8::internal |
OLD | NEW |