| Index: src/preparser.cc
|
| diff --git a/src/preparser.cc b/src/preparser.cc
|
| index 847d2c2935ef9905daf17fed6796e7a9aabc9e66..2978cdda987478361601409b2756c1168fa0dc3e 100644
|
| --- a/src/preparser.cc
|
| +++ b/src/preparser.cc
|
| @@ -4,8 +4,6 @@
|
|
|
| #include <cmath>
|
|
|
| -#include "include/v8stdint.h"
|
| -
|
| #include "src/allocation.h"
|
| #include "src/base/logging.h"
|
| #include "src/conversions-inl.h"
|
| @@ -19,16 +17,6 @@
|
| #include "src/unicode.h"
|
| #include "src/utils.h"
|
|
|
| -#if V8_LIBC_MSVCRT && (_MSC_VER < 1800)
|
| -namespace std {
|
| -
|
| -// Usually defined in math.h, but not in MSVC until VS2013+.
|
| -// Abstracted to work
|
| -int isfinite(double value);
|
| -
|
| -} // namespace std
|
| -#endif
|
| -
|
| namespace v8 {
|
| namespace internal {
|
|
|
| @@ -71,10 +59,10 @@ PreParserIdentifier PreParserTraits::GetSymbol(Scanner* scanner) {
|
| if (scanner->UnescapedLiteralMatches("arguments", 9)) {
|
| return PreParserIdentifier::Arguments();
|
| }
|
| - if (scanner->UnescapedLiteralMatches("prototype", 9)) {
|
| + if (scanner->LiteralMatches("prototype", 9)) {
|
| return PreParserIdentifier::Prototype();
|
| }
|
| - if (scanner->UnescapedLiteralMatches("constructor", 11)) {
|
| + if (scanner->LiteralMatches("constructor", 11)) {
|
| return PreParserIdentifier::Constructor();
|
| }
|
| return PreParserIdentifier::Default();
|
| @@ -116,11 +104,11 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction(
|
| log_ = log;
|
| // Lazy functions always have trivial outer scopes (no with/catch scopes).
|
| PreParserScope top_scope(scope_, GLOBAL_SCOPE);
|
| - PreParserFactory top_factory(NULL, NULL, NULL);
|
| + PreParserFactory top_factory(NULL);
|
| FunctionState top_state(&function_state_, &scope_, &top_scope, &top_factory);
|
| scope_->SetStrictMode(strict_mode);
|
| PreParserScope function_scope(scope_, FUNCTION_SCOPE);
|
| - PreParserFactory function_factory(NULL, NULL, NULL);
|
| + PreParserFactory function_factory(NULL);
|
| FunctionState function_state(&function_state_, &scope_, &function_scope,
|
| &function_factory);
|
| function_state.set_is_generator(is_generator);
|
| @@ -421,6 +409,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
|
| // ConstBinding ::
|
| // BindingPattern '=' AssignmentExpression
|
| bool require_initializer = false;
|
| + bool is_strict_const = false;
|
| if (peek() == Token::VAR) {
|
| Consume(Token::VAR);
|
| } else if (peek() == Token::CONST) {
|
| @@ -442,7 +431,8 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
|
| *ok = false;
|
| return Statement::Default();
|
| }
|
| - require_initializer = true;
|
| + is_strict_const = true;
|
| + require_initializer = var_context != kForStatement;
|
| } else {
|
| Scanner::Location location = scanner()->peek_location();
|
| ReportMessageAt(location, "strict_const");
|
| @@ -472,7 +462,9 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
|
| if (nvars > 0) Consume(Token::COMMA);
|
| ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
|
| nvars++;
|
| - if (peek() == Token::ASSIGN || require_initializer) {
|
| + if (peek() == Token::ASSIGN || require_initializer ||
|
| + // require initializers for multiple consts.
|
| + (is_strict_const && peek() == Token::COMMA)) {
|
| Expect(Token::ASSIGN, CHECK_OK);
|
| ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
|
| if (decl_props != NULL) *decl_props = kHasInitializers;
|
| @@ -690,13 +682,14 @@ PreParser::Statement PreParser::ParseForStatement(bool* ok) {
|
| if (peek() != Token::SEMICOLON) {
|
| if (peek() == Token::VAR || peek() == Token::CONST ||
|
| (peek() == Token::LET && strict_mode() == STRICT)) {
|
| - bool is_let = peek() == Token::LET;
|
| + bool is_lexical = peek() == Token::LET ||
|
| + (peek() == Token::CONST && strict_mode() == STRICT);
|
| int decl_count;
|
| VariableDeclarationProperties decl_props = kHasNoInitializers;
|
| ParseVariableDeclarations(
|
| kForStatement, &decl_props, &decl_count, CHECK_OK);
|
| bool has_initializers = decl_props == kHasInitializers;
|
| - bool accept_IN = decl_count == 1 && !(is_let && has_initializers);
|
| + bool accept_IN = decl_count == 1 && !(is_lexical && has_initializers);
|
| bool accept_OF = !has_initializers;
|
| if (accept_IN && CheckInOrOf(accept_OF)) {
|
| ParseExpression(true, CHECK_OK);
|
| @@ -825,7 +818,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
|
| // Parse function body.
|
| ScopeType outer_scope_type = scope_->type();
|
| PreParserScope function_scope(scope_, FUNCTION_SCOPE);
|
| - PreParserFactory factory(NULL, NULL, NULL);
|
| + PreParserFactory factory(NULL);
|
| FunctionState function_state(&function_state_, &scope_, &function_scope,
|
| &factory);
|
| function_state.set_is_generator(IsGeneratorFunction(kind));
|
|
|