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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 } | 340 } |
341 | 341 |
342 | 342 |
343 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { | 343 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { |
344 // FunctionDeclaration :: | 344 // FunctionDeclaration :: |
345 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | 345 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
346 // GeneratorDeclaration :: | 346 // GeneratorDeclaration :: |
347 // 'function' '*' Identifier '(' FormalParameterListopt ')' | 347 // 'function' '*' Identifier '(' FormalParameterListopt ')' |
348 // '{' FunctionBody '}' | 348 // '{' FunctionBody '}' |
349 Expect(Token::FUNCTION, CHECK_OK); | 349 Expect(Token::FUNCTION, CHECK_OK); |
350 | 350 int pos = position(); |
351 bool is_generator = allow_generators() && Check(Token::MUL); | 351 bool is_generator = allow_generators() && Check(Token::MUL); |
352 bool is_strict_reserved = false; | 352 bool is_strict_reserved = false; |
353 Identifier name = ParseIdentifierOrStrictReservedWord( | 353 Identifier name = ParseIdentifierOrStrictReservedWord( |
354 &is_strict_reserved, CHECK_OK); | 354 &is_strict_reserved, CHECK_OK); |
355 ParseFunctionLiteral(name, | 355 ParseFunctionLiteral(name, |
356 scanner()->location(), | 356 scanner()->location(), |
357 is_strict_reserved, | 357 is_strict_reserved, |
358 is_generator, | 358 is_generator, |
| 359 pos, |
| 360 FunctionLiteral::DECLARATION, |
359 CHECK_OK); | 361 CHECK_OK); |
360 return Statement::FunctionDeclaration(); | 362 return Statement::FunctionDeclaration(); |
361 } | 363 } |
362 | 364 |
363 | 365 |
364 PreParser::Statement PreParser::ParseBlock(bool* ok) { | 366 PreParser::Statement PreParser::ParseBlock(bool* ok) { |
365 // Block :: | 367 // Block :: |
366 // '{' Statement* '}' | 368 // '{' Statement* '}' |
367 | 369 |
368 // Note that a Block does not introduce a new execution scope! | 370 // Note that a Block does not introduce a new execution scope! |
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1056 // ('[' Expression ']' | '.' Identifier | Arguments)* | 1058 // ('[' Expression ']' | '.' Identifier | Arguments)* |
1057 | 1059 |
1058 // The '[' Expression ']' and '.' Identifier parts are parsed by | 1060 // The '[' Expression ']' and '.' Identifier parts are parsed by |
1059 // ParseMemberExpressionContinuation, and the Arguments part is parsed by the | 1061 // ParseMemberExpressionContinuation, and the Arguments part is parsed by the |
1060 // caller. | 1062 // caller. |
1061 | 1063 |
1062 // Parse the initial primary or function expression. | 1064 // Parse the initial primary or function expression. |
1063 Expression result = Expression::Default(); | 1065 Expression result = Expression::Default(); |
1064 if (peek() == Token::FUNCTION) { | 1066 if (peek() == Token::FUNCTION) { |
1065 Consume(Token::FUNCTION); | 1067 Consume(Token::FUNCTION); |
1066 | 1068 int function_token_position = position(); |
1067 bool is_generator = allow_generators() && Check(Token::MUL); | 1069 bool is_generator = allow_generators() && Check(Token::MUL); |
1068 Identifier name = Identifier::Default(); | 1070 Identifier name = Identifier::Default(); |
1069 bool is_strict_reserved_name = false; | 1071 bool is_strict_reserved_name = false; |
1070 Scanner::Location function_name_location = Scanner::Location::invalid(); | 1072 Scanner::Location function_name_location = Scanner::Location::invalid(); |
| 1073 FunctionLiteral::FunctionType function_type = |
| 1074 FunctionLiteral::ANONYMOUS_EXPRESSION; |
1071 if (peek_any_identifier()) { | 1075 if (peek_any_identifier()) { |
1072 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, | 1076 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, |
1073 CHECK_OK); | 1077 CHECK_OK); |
1074 function_name_location = scanner()->location(); | 1078 function_name_location = scanner()->location(); |
| 1079 function_type = FunctionLiteral::NAMED_EXPRESSION; |
1075 } | 1080 } |
1076 result = ParseFunctionLiteral(name, | 1081 result = ParseFunctionLiteral(name, |
1077 function_name_location, | 1082 function_name_location, |
1078 is_strict_reserved_name, | 1083 is_strict_reserved_name, |
1079 is_generator, | 1084 is_generator, |
| 1085 function_token_position, |
| 1086 function_type, |
1080 CHECK_OK); | 1087 CHECK_OK); |
1081 } else { | 1088 } else { |
1082 result = ParsePrimaryExpression(CHECK_OK); | 1089 result = ParsePrimaryExpression(CHECK_OK); |
1083 } | 1090 } |
1084 result = ParseMemberExpressionContinuation(result, CHECK_OK); | 1091 result = ParseMemberExpressionContinuation(result, CHECK_OK); |
1085 return result; | 1092 return result; |
1086 } | 1093 } |
1087 | 1094 |
1088 | 1095 |
1089 PreParser::Expression PreParser::ParseMemberExpressionContinuation( | 1096 PreParser::Expression PreParser::ParseMemberExpressionContinuation( |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 return Expression::Default(); | 1162 return Expression::Default(); |
1156 } | 1163 } |
1157 // Validate the property | 1164 // Validate the property |
1158 PropertyKind type = is_getter ? kGetterProperty : kSetterProperty; | 1165 PropertyKind type = is_getter ? kGetterProperty : kSetterProperty; |
1159 checker.CheckProperty(next, type, CHECK_OK); | 1166 checker.CheckProperty(next, type, CHECK_OK); |
1160 PreParserIdentifier name = GetSymbol(scanner()); | 1167 PreParserIdentifier name = GetSymbol(scanner()); |
1161 ParseFunctionLiteral(name, | 1168 ParseFunctionLiteral(name, |
1162 scanner()->location(), | 1169 scanner()->location(), |
1163 false, // reserved words are allowed here | 1170 false, // reserved words are allowed here |
1164 false, // not a generator | 1171 false, // not a generator |
| 1172 RelocInfo::kNoPosition, |
| 1173 FunctionLiteral::ANONYMOUS_EXPRESSION, |
1165 CHECK_OK); | 1174 CHECK_OK); |
1166 if (peek() != Token::RBRACE) { | 1175 if (peek() != Token::RBRACE) { |
1167 Expect(Token::COMMA, CHECK_OK); | 1176 Expect(Token::COMMA, CHECK_OK); |
1168 } | 1177 } |
1169 continue; // restart the while | 1178 continue; // restart the while |
1170 } | 1179 } |
1171 break; | 1180 break; |
1172 } | 1181 } |
1173 case Token::STRING: | 1182 case Token::STRING: |
1174 Consume(next); | 1183 Consume(next); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1225 } | 1234 } |
1226 Expect(Token::RPAREN, ok); | 1235 Expect(Token::RPAREN, ok); |
1227 return argc; | 1236 return argc; |
1228 } | 1237 } |
1229 | 1238 |
1230 PreParser::Expression PreParser::ParseFunctionLiteral( | 1239 PreParser::Expression PreParser::ParseFunctionLiteral( |
1231 Identifier function_name, | 1240 Identifier function_name, |
1232 Scanner::Location function_name_location, | 1241 Scanner::Location function_name_location, |
1233 bool name_is_strict_reserved, | 1242 bool name_is_strict_reserved, |
1234 bool is_generator, | 1243 bool is_generator, |
| 1244 int function_token_pos, |
| 1245 FunctionLiteral::FunctionType function_type, |
1235 bool* ok) { | 1246 bool* ok) { |
1236 // Function :: | 1247 // Function :: |
1237 // '(' FormalParameterList? ')' '{' FunctionBody '}' | 1248 // '(' FormalParameterList? ')' '{' FunctionBody '}' |
1238 | 1249 |
1239 // Parse function body. | 1250 // Parse function body. |
1240 ScopeType outer_scope_type = scope_->type(); | 1251 ScopeType outer_scope_type = scope_->type(); |
1241 bool inside_with = scope_->inside_with(); | 1252 bool inside_with = scope_->inside_with(); |
1242 PreParserScope function_scope(scope_, FUNCTION_SCOPE); | 1253 PreParserScope function_scope(scope_, FUNCTION_SCOPE); |
1243 FunctionState function_state(&function_state_, &scope_, &function_scope); | 1254 FunctionState function_state(&function_state_, &scope_, &function_scope); |
1244 function_state.set_is_generator(is_generator); | 1255 function_state.set_is_generator(is_generator); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1377 int identifier_pos = position(); | 1388 int identifier_pos = position(); |
1378 if (scanner()->is_literal_ascii()) { | 1389 if (scanner()->is_literal_ascii()) { |
1379 log_->LogAsciiSymbol(identifier_pos, scanner()->literal_ascii_string()); | 1390 log_->LogAsciiSymbol(identifier_pos, scanner()->literal_ascii_string()); |
1380 } else { | 1391 } else { |
1381 log_->LogUtf16Symbol(identifier_pos, scanner()->literal_utf16_string()); | 1392 log_->LogUtf16Symbol(identifier_pos, scanner()->literal_utf16_string()); |
1382 } | 1393 } |
1383 } | 1394 } |
1384 | 1395 |
1385 | 1396 |
1386 } } // v8::internal | 1397 } } // v8::internal |
OLD | NEW |