| Index: src/preparser.cc
|
| diff --git a/src/preparser.cc b/src/preparser.cc
|
| index 2d670ac623d631ace4d62ce7cc5233e9ded90cc5..f9c13860ed4d42bd97c727b11c4ad710f92b9754 100644
|
| --- a/src/preparser.cc
|
| +++ b/src/preparser.cc
|
| @@ -65,7 +65,7 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction(
|
| function_scope.set_is_generator(is_generator);
|
| ASSERT_EQ(i::Token::LBRACE, scanner()->current_token());
|
| bool ok = true;
|
| - int start_position = scanner()->peek_location().beg_pos;
|
| + int start_position = peek_position();
|
| ParseLazyFunctionLiteralBody(&ok);
|
| if (stack_overflow()) return kPreParseStackOverflow;
|
| if (!ok) {
|
| @@ -129,18 +129,6 @@ void PreParser::ReportUnexpectedToken(i::Token::Value token) {
|
| }
|
|
|
|
|
| -// Checks whether octal literal last seen is between beg_pos and end_pos.
|
| -// If so, reports an error.
|
| -void PreParser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) {
|
| - i::Scanner::Location octal = scanner()->octal_position();
|
| - if (beg_pos <= octal.beg_pos && octal.end_pos <= end_pos) {
|
| - ReportMessageAt(octal, "strict_octal_literal", NULL);
|
| - scanner()->clear_octal_position();
|
| - *ok = false;
|
| - }
|
| -}
|
| -
|
| -
|
| #define CHECK_OK ok); \
|
| if (!*ok) return kUnknownSourceElements; \
|
| ((void)0
|
| @@ -659,10 +647,9 @@ PreParser::Statement PreParser::ParseWhileStatement(bool* ok) {
|
|
|
|
|
| bool PreParser::CheckInOrOf(bool accept_OF) {
|
| - if (peek() == i::Token::IN ||
|
| - (allow_for_of() && accept_OF && peek() == i::Token::IDENTIFIER &&
|
| - scanner()->is_next_contextual_keyword(v8::internal::CStrVector("of")))) {
|
| - Next();
|
| + if (Check(Token::IN) ||
|
| + (allow_for_of() && accept_OF &&
|
| + CheckContextualKeyword(CStrVector("of")))) {
|
| return true;
|
| }
|
| return false;
|
| @@ -901,14 +888,6 @@ PreParser::Expression PreParser::ParseConditionalExpression(bool accept_IN,
|
| }
|
|
|
|
|
| -int PreParser::Precedence(i::Token::Value tok, bool accept_IN) {
|
| - if (tok == i::Token::IN && !accept_IN)
|
| - return 0; // 0 precedence will terminate binary expression parsing
|
| -
|
| - return i::Token::Precedence(tok);
|
| -}
|
| -
|
| -
|
| // Precedence >= 4
|
| PreParser::Expression PreParser::ParseBinaryExpression(int prec,
|
| bool accept_IN,
|
| @@ -1238,7 +1217,7 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
|
| // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
|
| // )*[','] '}'
|
|
|
| - i::ObjectLiteralChecker<PreParser> checker(this, scanner(), language_mode());
|
| + ObjectLiteralChecker checker(this, language_mode());
|
|
|
| Expect(i::Token::LBRACE, CHECK_OK);
|
| while (peek() != i::Token::RBRACE) {
|
| @@ -1265,8 +1244,7 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
|
| if (!is_keyword) {
|
| LogSymbol();
|
| }
|
| - i::PropertyKind type = is_getter ? i::kGetterProperty
|
| - : i::kSetterProperty;
|
| + PropertyKind type = is_getter ? kGetterProperty : kSetterProperty;
|
| checker.CheckProperty(name, type, CHECK_OK);
|
| ParseFunctionLiteral(false, CHECK_OK);
|
| if (peek() != i::Token::RBRACE) {
|
| @@ -1274,22 +1252,22 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
|
| }
|
| continue; // restart the while
|
| }
|
| - checker.CheckProperty(next, i::kValueProperty, CHECK_OK);
|
| + checker.CheckProperty(next, kValueProperty, CHECK_OK);
|
| break;
|
| }
|
| case i::Token::STRING:
|
| Consume(next);
|
| - checker.CheckProperty(next, i::kValueProperty, CHECK_OK);
|
| + checker.CheckProperty(next, kValueProperty, CHECK_OK);
|
| GetStringSymbol();
|
| break;
|
| case i::Token::NUMBER:
|
| Consume(next);
|
| - checker.CheckProperty(next, i::kValueProperty, CHECK_OK);
|
| + checker.CheckProperty(next, kValueProperty, CHECK_OK);
|
| break;
|
| default:
|
| if (i::Token::IsKeyword(next)) {
|
| Consume(next);
|
| - checker.CheckProperty(next, i::kValueProperty, CHECK_OK);
|
| + checker.CheckProperty(next, kValueProperty, CHECK_OK);
|
| } else {
|
| // Unexpected token.
|
| *ok = false;
|
| @@ -1368,7 +1346,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral(bool is_generator,
|
| // FormalParameterList ::
|
| // '(' (Identifier)*[','] ')'
|
| Expect(i::Token::LPAREN, CHECK_OK);
|
| - int start_position = scanner()->location().beg_pos;
|
| + int start_position = position();
|
| bool done = (peek() == i::Token::RPAREN);
|
| i::DuplicateFinder duplicate_finder(scanner()->unicode_cache());
|
| while (!done) {
|
| @@ -1428,7 +1406,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral(bool is_generator,
|
|
|
|
|
| void PreParser::ParseLazyFunctionLiteralBody(bool* ok) {
|
| - int body_start = scanner()->location().beg_pos;
|
| + int body_start = position();
|
| log_->PauseRecording();
|
| ParseSourceElements(i::Token::RBRACE, ok);
|
| log_->ResumeRecording();
|
| @@ -1462,7 +1440,7 @@ PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) {
|
|
|
|
|
| void PreParser::LogSymbol() {
|
| - int identifier_pos = scanner()->location().beg_pos;
|
| + int identifier_pos = position();
|
| if (scanner()->is_literal_ascii()) {
|
| log_->LogAsciiSymbol(identifier_pos, scanner()->literal_ascii_string());
|
| } else {
|
| @@ -1602,7 +1580,7 @@ void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location,
|
| PreParser::Identifier PreParser::ParseIdentifierName(bool* ok) {
|
| i::Token::Value next = Next();
|
| if (i::Token::IsKeyword(next)) {
|
| - int pos = scanner()->location().beg_pos;
|
| + int pos = position();
|
| const char* keyword = i::Token::String(next);
|
| log_->LogAsciiSymbol(pos, i::Vector<const char>(keyword,
|
| i::StrLength(keyword)));
|
| @@ -1637,4 +1615,36 @@ PreParser::Identifier PreParser::ParseIdentifierNameOrGetOrSet(bool* is_get,
|
| }
|
|
|
|
|
| +void PreParser::ObjectLiteralChecker::CheckProperty(Token::Value property,
|
| + PropertyKind type,
|
| + bool* ok) {
|
| + int old;
|
| + if (property == Token::NUMBER) {
|
| + old = finder_.AddNumber(scanner()->literal_ascii_string(), type);
|
| + } else if (scanner()->is_literal_ascii()) {
|
| + old = finder_.AddAsciiSymbol(scanner()->literal_ascii_string(), type);
|
| + } else {
|
| + old = finder_.AddUtf16Symbol(scanner()->literal_utf16_string(), type);
|
| + }
|
| + PropertyKind old_type = static_cast<PropertyKind>(old);
|
| + if (HasConflict(old_type, type)) {
|
| + if (IsDataDataConflict(old_type, type)) {
|
| + // Both are data properties.
|
| + if (language_mode_ == CLASSIC_MODE) return;
|
| + parser()->ReportMessageAt(scanner()->location(),
|
| + "strict_duplicate_property");
|
| + } else if (IsDataAccessorConflict(old_type, type)) {
|
| + // Both a data and an accessor property with the same name.
|
| + parser()->ReportMessageAt(scanner()->location(),
|
| + "accessor_data_property");
|
| + } else {
|
| + ASSERT(IsAccessorAccessorConflict(old_type, type));
|
| + // Both accessors of the same type.
|
| + parser()->ReportMessageAt(scanner()->location(),
|
| + "accessor_get_set");
|
| + }
|
| + *ok = false;
|
| + }
|
| +}
|
| +
|
| } } // v8::internal
|
|
|