| Index: src/preparser.cc | 
| diff --git a/src/preparser.cc b/src/preparser.cc | 
| index 492ae7b214df79b0d804d35bc0a8c0ab5872d3fc..86d9d9bd34e50a1c06b045024348470b8ce82cf8 100644 | 
| --- a/src/preparser.cc | 
| +++ b/src/preparser.cc | 
| @@ -125,12 +125,18 @@ PreParser::Statement PreParser::ParseSourceElement(bool* ok) { | 
| // In harmony mode we allow additionally the following productions | 
| // SourceElement: | 
| //    LetDeclaration | 
| +  //    ConstDeclaration | 
|  | 
| switch (peek()) { | 
| case i::Token::FUNCTION: | 
| return ParseFunctionDeclaration(ok); | 
| case i::Token::LET: | 
| return ParseVariableStatement(kSourceElement, ok); | 
| +    case i::Token::CONST: | 
| +      if (harmony_scoping_) { | 
| +        return ParseHarmonyConstDeclaration(ok); | 
| +      } | 
| +      // FALLTHROUGH | 
| default: | 
| return ParseStatement(ok); | 
| } | 
| @@ -335,6 +341,15 @@ PreParser::Statement PreParser::ParseVariableDeclarations( | 
| if (peek() == i::Token::VAR) { | 
| Consume(i::Token::VAR); | 
| } else if (peek() == i::Token::CONST) { | 
| +    if (harmony_scoping_) { | 
| +      ASSERT(var_context == kForStatement || | 
| +             var_context == kStatement); | 
| +      i::Scanner::Location location = scanner_->peek_location(); | 
| +      ReportMessageAt(location.beg_pos, location.end_pos, | 
| +                      "unprotected_const", NULL); | 
| +      *ok = false; | 
| +      return Statement::Default(); | 
| +    } | 
| if (strict_mode()) { | 
| i::Scanner::Location location = scanner_->peek_location(); | 
| ReportMessageAt(location, "strict_const", NULL); | 
| @@ -386,6 +401,39 @@ PreParser::Statement PreParser::ParseVariableDeclarations( | 
| } | 
|  | 
|  | 
| +PreParser::Statement PreParser::ParseHarmonyConstDeclaration(bool* ok) { | 
| +  // ES6 Draft Rev3 | 
| +  // | 
| +  // ConstDeclaration :: | 
| +  //   const ConstBinding (',' ConstBinding)* ';' | 
| +  // ConstBinding :: | 
| +  //   Identifier '=' AssignmentExpression | 
| +  // | 
| +  // TODO(ES6): | 
| +  // ConstBinding :: | 
| +  //   BindingPattern '=' AssignmentExpression | 
| + | 
| +  Consume(i::Token::CONST); | 
| +  do { | 
| +    // Parse variable name. | 
| +    Identifier identifier  = ParseIdentifier(CHECK_OK); | 
| +    if (!identifier.IsValidStrictVariable()) { | 
| +      StrictModeIdentifierViolation(scanner_->location(), | 
| +                                    "strict_var_name", | 
| +                                    identifier, | 
| +                                    ok); | 
| +      return Statement::Default(); | 
| +    } | 
| + | 
| +    Expect(i::Token::ASSIGN, CHECK_OK); | 
| +    ParseAssignmentExpression(false, CHECK_OK); | 
| +  } while (Check(i::Token::COMMA)); | 
| + | 
| +  ExpectSemicolon(CHECK_OK); | 
| +  return Statement::Default(); | 
| +} | 
| + | 
| + | 
| PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { | 
| // ExpressionStatement | LabelledStatement :: | 
| //   Expression ';' | 
|  |