Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index b04a2f93b2dfbee458be86b2c5545094cfc8bda2..59b436cc615b90b556918d47182f254968e97c10 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -1445,10 +1445,11 @@ Statement* Parser::ParseFunctionDeclaration(bool* ok) { |
| // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
| Expect(Token::FUNCTION, CHECK_OK); |
| int function_token_position = scanner().location().beg_pos; |
| - bool is_reserved = false; |
| - Handle<String> name = ParseIdentifierOrReservedWord(&is_reserved, CHECK_OK); |
| + bool is_strict_reserved = false; |
| + Handle<String> name = ParseIdentifierOrStrictReservedWord( |
| + &is_strict_reserved, CHECK_OK); |
| FunctionLiteral* fun = ParseFunctionLiteral(name, |
| - is_reserved, |
| + is_strict_reserved, |
| function_token_position, |
| DECLARATION, |
| CHECK_OK); |
| @@ -2770,11 +2771,12 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack, |
| Expect(Token::FUNCTION, CHECK_OK); |
| int function_token_position = scanner().location().beg_pos; |
| Handle<String> name; |
| - bool is_reserved_name = false; |
| + bool is_strict_reserved_name = false; |
| if (peek_any_identifier()) { |
| - name = ParseIdentifierOrReservedWord(&is_reserved_name, CHECK_OK); |
| + name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, |
| + CHECK_OK); |
| } |
| - result = ParseFunctionLiteral(name, is_reserved_name, |
| + result = ParseFunctionLiteral(name, is_strict_reserved_name, |
| function_token_position, NESTED, CHECK_OK); |
| } else { |
| result = ParsePrimaryExpression(CHECK_OK); |
| @@ -2845,6 +2847,9 @@ void Parser::ReportUnexpectedToken(Token::Value token) { |
| return ReportMessage("unexpected_token_identifier", |
| Vector<const char*>::empty()); |
| case Token::FUTURE_RESERVED_WORD: |
| + return ReportMessage("unexpected_reserved", |
| + Vector<const char*>::empty()); |
| + case Token::FUTURE_STRICT_RESERVED_WORD: |
| return ReportMessage(top_scope_->is_strict_mode() ? |
| "unexpected_strict_reserved" : |
| "unexpected_token_identifier", |
| @@ -2904,9 +2909,16 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) { |
| result = new(zone()) Literal(isolate()->factory()->false_value()); |
| break; |
| - case Token::IDENTIFIER: |
| - case Token::FUTURE_RESERVED_WORD: { |
| - Handle<String> name = ParseIdentifier(CHECK_OK); |
| + case Token::FUTURE_STRICT_RESERVED_WORD: |
| + if (top_scope_->is_strict_mode()) { |
| + Token::Value tok = Next(); |
| + ReportUnexpectedToken(tok); |
| + *ok = false; |
| + return NULL; |
| + } |
| + // FALLTHROUGH |
| + case Token::IDENTIFIER: { |
| + Handle<String> name = ParseIdentifierName(CHECK_OK); |
|
Lasse Reichstein
2011/06/22 20:29:33
It seems ParseIdentifier would be more correct her
Steven
2011/06/24 11:34:59
Better still: revert the change and just replace F
|
| if (fni_ != NULL) fni_->PushVariableName(name); |
| result = top_scope_->NewUnresolved(name, |
| inside_with(), |
| @@ -3316,6 +3328,7 @@ ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter, |
| bool is_keyword = Token::IsKeyword(next); |
| if (next == Token::IDENTIFIER || next == Token::NUMBER || |
| next == Token::FUTURE_RESERVED_WORD || |
| + next == Token::FUTURE_STRICT_RESERVED_WORD || |
| next == Token::STRING || is_keyword) { |
| Handle<String> name; |
| if (is_keyword) { |
| @@ -3370,11 +3383,12 @@ Expression* Parser::ParseObjectLiteral(bool* ok) { |
| switch (next) { |
| case Token::FUTURE_RESERVED_WORD: |
| + case Token::FUTURE_STRICT_RESERVED_WORD: |
| case Token::IDENTIFIER: { |
| bool is_getter = false; |
| bool is_setter = false; |
| Handle<String> id = |
| - ParseIdentifierOrGetOrSet(&is_getter, &is_setter, CHECK_OK); |
| + ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK); |
| if (fni_ != NULL) fni_->PushLiteralName(id); |
| if ((is_getter || is_setter) && peek() != Token::COLON) { |
| @@ -3533,7 +3547,7 @@ ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { |
| FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
| - bool name_is_reserved, |
| + bool name_is_strict_reserved, |
| int function_token_position, |
| FunctionLiteralType type, |
| bool* ok) { |
| @@ -3577,9 +3591,10 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
| bool done = (peek() == Token::RPAREN); |
| while (!done) { |
| - bool is_reserved = false; |
| + bool is_strict_reserved = false; |
| Handle<String> param_name = |
| - ParseIdentifierOrReservedWord(&is_reserved, CHECK_OK); |
| + ParseIdentifierOrStrictReservedWord(&is_strict_reserved, |
| + CHECK_OK); |
| // Store locations for possible future error reports. |
| if (!name_loc.IsValid() && IsEvalOrArguments(param_name)) { |
| @@ -3589,7 +3604,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
| has_duplicate_parameters = true; |
| dupe_loc = scanner().location(); |
| } |
| - if (!reserved_loc.IsValid() && is_reserved) { |
| + if (!reserved_loc.IsValid() && is_strict_reserved) { |
| reserved_loc = scanner().location(); |
| } |
| @@ -3691,7 +3706,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
| *ok = false; |
| return NULL; |
| } |
| - if (name_is_reserved) { |
| + if (name_is_strict_reserved) { |
| int position = function_token_position != RelocInfo::kNoPosition |
| ? function_token_position |
| : (start_pos > 0 ? start_pos - 1 : start_pos); |
| @@ -3780,7 +3795,8 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) { |
| bool Parser::peek_any_identifier() { |
| Token::Value next = peek(); |
| return next == Token::IDENTIFIER || |
| - next == Token::FUTURE_RESERVED_WORD; |
| + next == Token::FUTURE_RESERVED_WORD || |
| + next == Token::FUTURE_STRICT_RESERVED_WORD; |
| } |
| @@ -3843,21 +3859,22 @@ Literal* Parser::GetLiteralNumber(double value) { |
| Handle<String> Parser::ParseIdentifier(bool* ok) { |
|
Lasse Reichstein
2011/06/22 20:29:33
This also (like the next function) parse identifie
Steven
2011/06/24 11:34:59
Because they implement a different behavior. And t
Lasse Reichstein
2011/06/24 12:38:04
Makes sense when explained :)
|
| - bool is_reserved; |
| - return ParseIdentifierOrReservedWord(&is_reserved, ok); |
| + if (top_scope_->is_strict_mode()) { |
| + Expect(Token::IDENTIFIER, ok); |
| + } else if (!Check(Token::IDENTIFIER)) { |
| + Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); |
| + } |
| + if (!*ok) return Handle<String>(); |
| + return GetSymbol(ok); |
| } |
| -Handle<String> Parser::ParseIdentifierOrReservedWord(bool* is_reserved, |
| - bool* ok) { |
| - *is_reserved = false; |
| - if (top_scope_->is_strict_mode()) { |
| - Expect(Token::IDENTIFIER, ok); |
| - } else { |
| - if (!Check(Token::IDENTIFIER)) { |
| - Expect(Token::FUTURE_RESERVED_WORD, ok); |
| - *is_reserved = true; |
| - } |
| +Handle<String> Parser::ParseIdentifierOrStrictReservedWord( |
| + bool* is_strict_reserved, bool* ok) { |
| + *is_strict_reserved = false; |
| + if (!Check(Token::IDENTIFIER)) { |
| + Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); |
| + *is_strict_reserved = true; |
| } |
| if (!*ok) return Handle<String>(); |
| return GetSymbol(ok); |
| @@ -3867,8 +3884,9 @@ Handle<String> Parser::ParseIdentifierOrReservedWord(bool* is_reserved, |
| Handle<String> Parser::ParseIdentifierName(bool* ok) { |
| Token::Value next = Next(); |
| if (next != Token::IDENTIFIER && |
| - next != Token::FUTURE_RESERVED_WORD && |
| - !Token::IsKeyword(next)) { |
| + next != Token::FUTURE_RESERVED_WORD && |
| + next != Token::FUTURE_STRICT_RESERVED_WORD && |
| + !Token::IsKeyword(next)) { |
| ReportUnexpectedToken(next); |
| *ok = false; |
| return Handle<String>(); |
| @@ -3911,10 +3929,10 @@ void Parser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) { |
| // This function reads an identifier and determines whether or not it |
| // is 'get' or 'set'. |
| -Handle<String> Parser::ParseIdentifierOrGetOrSet(bool* is_get, |
| - bool* is_set, |
| - bool* ok) { |
| - Handle<String> result = ParseIdentifier(ok); |
| +Handle<String> Parser::ParseIdentifierNameOrGetOrSet(bool* is_get, |
| + bool* is_set, |
| + bool* ok) { |
| + Handle<String> result = ParseIdentifierName(ok); |
| if (!*ok) return Handle<String>(); |
| if (scanner().is_literal_ascii() && scanner().literal_length() == 3) { |
| const char* token = scanner().literal_ascii_string().start(); |