Index: src/preparser.cc |
diff --git a/src/preparser.cc b/src/preparser.cc |
index a5de23ebeede10d2b59726f32d0294f6403555f1..caa00d9bb2449c6b6b40bb51f307fcf5c2e5aefb 100644 |
--- a/src/preparser.cc |
+++ b/src/preparser.cc |
@@ -1124,10 +1124,11 @@ PreParser::Expression PreParser::ParseMemberExpressionContinuation( |
PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) { |
// ObjectLiteral :: |
- // '{' ( |
- // ((IdentifierName | String | Number) ':' AssignmentExpression) |
- // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) |
- // )*[','] '}' |
+ // '{' (( |
+ // ((IdentifierName | String | Number) ':' AssignmentExpression) | |
+ // (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) |
+ // ) ',')* '}' |
+ // (Except that trailing comma is not required and not allowed.) |
ObjectLiteralChecker checker(this, scope_->language_mode()); |
@@ -1142,23 +1143,22 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) { |
bool is_setter = false; |
ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK); |
if ((is_getter || is_setter) && peek() != Token::COLON) { |
- Token::Value name = Next(); |
- bool is_keyword = Token::IsKeyword(name); |
- if (name != Token::IDENTIFIER && |
- name != Token::FUTURE_RESERVED_WORD && |
- name != Token::FUTURE_STRICT_RESERVED_WORD && |
- name != Token::NUMBER && |
- name != Token::STRING && |
- !is_keyword) { |
+ Token::Value next = Next(); |
+ if (next != Token::IDENTIFIER && |
+ next != Token::FUTURE_RESERVED_WORD && |
+ next != Token::FUTURE_STRICT_RESERVED_WORD && |
+ next != Token::NUMBER && |
+ next != Token::STRING && |
+ !Token::IsKeyword(next)) { |
+ ReportUnexpectedToken(next); |
*ok = false; |
return Expression::Default(); |
} |
- if (!is_keyword) { |
- LogSymbol(); |
- } |
+ // Validate the property |
PropertyKind type = is_getter ? kGetterProperty : kSetterProperty; |
- checker.CheckProperty(name, type, CHECK_OK); |
- ParseFunctionLiteral(Identifier::Default(), |
+ checker.CheckProperty(next, type, CHECK_OK); |
+ PreParserIdentifier name = GetSymbol(scanner()); |
+ ParseFunctionLiteral(name, |
scanner()->location(), |
false, // reserved words are allowed here |
false, // not a generator |
@@ -1168,30 +1168,30 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) { |
} |
continue; // restart the while |
} |
- checker.CheckProperty(next, kValueProperty, CHECK_OK); |
break; |
} |
case Token::STRING: |
Consume(next); |
- checker.CheckProperty(next, kValueProperty, CHECK_OK); |
LogSymbol(); |
break; |
case Token::NUMBER: |
Consume(next); |
- checker.CheckProperty(next, kValueProperty, CHECK_OK); |
break; |
default: |
if (Token::IsKeyword(next)) { |
Consume(next); |
- checker.CheckProperty(next, kValueProperty, CHECK_OK); |
LogSymbol(); |
} else { |
- // Unexpected token. |
+ Token::Value next = Next(); |
+ ReportUnexpectedToken(next); |
*ok = false; |
return Expression::Default(); |
} |
} |
+ // Validate the property |
+ checker.CheckProperty(next, kValueProperty, CHECK_OK); |
+ |
Expect(Token::COLON, CHECK_OK); |
ParseAssignmentExpression(true, CHECK_OK); |