| Index: src/preparser.cc
 | 
| diff --git a/src/preparser.cc b/src/preparser.cc
 | 
| index ad0e05e2ef137101b4e98fbbbd3fa9a865bca6e6..6759550eb88c5bf9a19943bc828712166dfee88c 100644
 | 
| --- a/src/preparser.cc
 | 
| +++ b/src/preparser.cc
 | 
| @@ -81,8 +81,7 @@ void PreParserTraits::ReportMessageAt(int start_pos,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -PreParserIdentifier PreParserTraits::GetSymbol() {
 | 
| -  Scanner* scanner = pre_parser_->scanner();
 | 
| +PreParserIdentifier PreParserTraits::GetSymbol(Scanner* scanner) {
 | 
|    pre_parser_->LogSymbol();
 | 
|    if (scanner->current_token() == Token::FUTURE_RESERVED_WORD) {
 | 
|      return PreParserIdentifier::FutureReserved();
 | 
| @@ -107,6 +106,42 @@ PreParserIdentifier PreParserTraits::GetSymbol() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +PreParserExpression PreParserTraits::ExpressionFromString(
 | 
| +    int pos, Scanner* scanner, PreParserFactory* factory) {
 | 
| +  const int kUseStrictLength = 10;
 | 
| +  const char* kUseStrictChars = "use strict";
 | 
| +  pre_parser_->LogSymbol();
 | 
| +  if (scanner->is_literal_ascii() &&
 | 
| +      scanner->literal_length() == kUseStrictLength &&
 | 
| +      !scanner->literal_contains_escapes() &&
 | 
| +      !strncmp(scanner->literal_ascii_string().start(), kUseStrictChars,
 | 
| +               kUseStrictLength)) {
 | 
| +    return PreParserExpression::UseStrictStringLiteral();
 | 
| +  }
 | 
| +  return PreParserExpression::StringLiteral();
 | 
| +}
 | 
| +
 | 
| +
 | 
| +PreParserExpression PreParserTraits::ParseArrayLiteral(bool* ok) {
 | 
| +  return pre_parser_->ParseArrayLiteral(ok);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +PreParserExpression PreParserTraits::ParseObjectLiteral(bool* ok) {
 | 
| +  return pre_parser_->ParseObjectLiteral(ok);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +PreParserExpression PreParserTraits::ParseExpression(bool accept_IN, bool* ok) {
 | 
| +  return pre_parser_->ParseExpression(accept_IN, ok);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +PreParserExpression PreParserTraits::ParseV8Intrinsic(bool* ok) {
 | 
| +  return pre_parser_->ParseV8Intrinsic(ok);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  PreParser::PreParseResult PreParser::PreParseLazyFunction(
 | 
|      LanguageMode mode, bool is_generator, ParserRecorder* log) {
 | 
|    log_ = log;
 | 
| @@ -1111,90 +1146,6 @@ PreParser::Expression PreParser::ParseMemberWithNewPrefixesExpression(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -PreParser::Expression PreParser::ParsePrimaryExpression(bool* ok) {
 | 
| -  // PrimaryExpression ::
 | 
| -  //   'this'
 | 
| -  //   'null'
 | 
| -  //   'true'
 | 
| -  //   'false'
 | 
| -  //   Identifier
 | 
| -  //   Number
 | 
| -  //   String
 | 
| -  //   ArrayLiteral
 | 
| -  //   ObjectLiteral
 | 
| -  //   RegExpLiteral
 | 
| -  //   '(' Expression ')'
 | 
| -
 | 
| -  Expression result = Expression::Default();
 | 
| -  switch (peek()) {
 | 
| -    case Token::THIS: {
 | 
| -      Next();
 | 
| -      result = Expression::This();
 | 
| -      break;
 | 
| -    }
 | 
| -
 | 
| -    case Token::FUTURE_RESERVED_WORD:
 | 
| -    case Token::FUTURE_STRICT_RESERVED_WORD:
 | 
| -    case Token::YIELD:
 | 
| -    case Token::IDENTIFIER: {
 | 
| -      // Using eval or arguments in this context is OK even in strict mode.
 | 
| -      Identifier id = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
 | 
| -      result = Expression::FromIdentifier(id);
 | 
| -      break;
 | 
| -    }
 | 
| -
 | 
| -    case Token::NULL_LITERAL:
 | 
| -    case Token::TRUE_LITERAL:
 | 
| -    case Token::FALSE_LITERAL:
 | 
| -    case Token::NUMBER: {
 | 
| -      Next();
 | 
| -      break;
 | 
| -    }
 | 
| -    case Token::STRING: {
 | 
| -      Next();
 | 
| -      result = GetStringSymbol();
 | 
| -      break;
 | 
| -    }
 | 
| -
 | 
| -    case Token::ASSIGN_DIV:
 | 
| -      result = ParseRegExpLiteral(true, CHECK_OK);
 | 
| -      break;
 | 
| -
 | 
| -    case Token::DIV:
 | 
| -      result = ParseRegExpLiteral(false, CHECK_OK);
 | 
| -      break;
 | 
| -
 | 
| -    case Token::LBRACK:
 | 
| -      result = ParseArrayLiteral(CHECK_OK);
 | 
| -      break;
 | 
| -
 | 
| -    case Token::LBRACE:
 | 
| -      result = ParseObjectLiteral(CHECK_OK);
 | 
| -      break;
 | 
| -
 | 
| -    case Token::LPAREN:
 | 
| -      Consume(Token::LPAREN);
 | 
| -      parenthesized_function_ = (peek() == Token::FUNCTION);
 | 
| -      result = ParseExpression(true, CHECK_OK);
 | 
| -      Expect(Token::RPAREN, CHECK_OK);
 | 
| -      break;
 | 
| -
 | 
| -    case Token::MOD:
 | 
| -      result = ParseV8Intrinsic(CHECK_OK);
 | 
| -      break;
 | 
| -
 | 
| -    default: {
 | 
| -      Token::Value next = Next();
 | 
| -      ReportUnexpectedToken(next);
 | 
| -      *ok = false;
 | 
| -      return Expression::Default();
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  return result;
 | 
| -}
 | 
| -
 | 
| -
 | 
|  PreParser::Expression PreParser::ParseArrayLiteral(bool* ok) {
 | 
|    // ArrayLiteral ::
 | 
|    //   '[' Expression? (',' Expression?)* ']'
 | 
| @@ -1266,7 +1217,7 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
 | 
|        case Token::STRING:
 | 
|          Consume(next);
 | 
|          checker.CheckProperty(next, kValueProperty, CHECK_OK);
 | 
| -        GetStringSymbol();
 | 
| +        LogSymbol();
 | 
|          break;
 | 
|        case Token::NUMBER:
 | 
|          Consume(next);
 | 
| @@ -1475,19 +1426,4 @@ void PreParser::LogSymbol() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -PreParser::Expression PreParser::GetStringSymbol() {
 | 
| -  const int kUseStrictLength = 10;
 | 
| -  const char* kUseStrictChars = "use strict";
 | 
| -  LogSymbol();
 | 
| -  if (scanner()->is_literal_ascii() &&
 | 
| -      scanner()->literal_length() == kUseStrictLength &&
 | 
| -      !scanner()->literal_contains_escapes() &&
 | 
| -      !strncmp(scanner()->literal_ascii_string().start(), kUseStrictChars,
 | 
| -               kUseStrictLength)) {
 | 
| -    return Expression::UseStrictStringLiteral();
 | 
| -  }
 | 
| -  return Expression::StringLiteral();
 | 
| -}
 | 
| -
 | 
| -
 | 
|  } }  // v8::internal
 | 
| 
 |