| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index f564602fc1eac7e60c2e68f2acff4ff764d0122b..548c1093d739ac097e16719d9e8e1af2d8de7c36 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -786,9 +786,6 @@ Parser::Parser(ParseInfo* info)
|
| set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
|
| set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() &&
|
| info->isolate()->is_tail_call_elimination_enabled());
|
| - set_allow_harmony_sloppy(FLAG_harmony_sloppy);
|
| - set_allow_harmony_sloppy_function(FLAG_harmony_sloppy_function);
|
| - set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let);
|
| set_allow_harmony_do_expressions(FLAG_harmony_do_expressions);
|
| set_allow_harmony_function_name(FLAG_harmony_function_name);
|
| set_allow_harmony_function_sent(FLAG_harmony_function_sent);
|
| @@ -941,7 +938,7 @@ FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) {
|
| if (ok && is_strict(language_mode())) {
|
| CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok);
|
| }
|
| - if (ok && is_sloppy(language_mode()) && allow_harmony_sloppy_function()) {
|
| + if (ok && is_sloppy(language_mode())) {
|
| // TODO(littledan): Function bindings on the global object that modify
|
| // pre-existing bindings should be made writable, enumerable and
|
| // nonconfigurable if possible, whereas this code will leave attributes
|
| @@ -1258,10 +1255,7 @@ Statement* Parser::ParseStatementListItem(bool* ok) {
|
| Consume(Token::CLASS);
|
| return ParseClassDeclaration(NULL, ok);
|
| case Token::CONST:
|
| - if (allow_const()) {
|
| - return ParseVariableStatement(kStatementListItem, NULL, ok);
|
| - }
|
| - break;
|
| + return ParseVariableStatement(kStatementListItem, NULL, ok);
|
| case Token::VAR:
|
| return ParseVariableStatement(kStatementListItem, NULL, ok);
|
| case Token::LET:
|
| @@ -1909,11 +1903,8 @@ Variable* Parser::Declare(Declaration* declaration,
|
| }
|
| var = declaration_scope->DeclareLocal(
|
| name, mode, declaration->initialization(), kind, kNotAssigned);
|
| - } else if ((IsLexicalVariableMode(mode) ||
|
| - IsLexicalVariableMode(var->mode())) &&
|
| - // Lexical bindings may appear for some parameters in sloppy
|
| - // mode even with --harmony-sloppy off.
|
| - (is_strict(language_mode()) || allow_harmony_sloppy())) {
|
| + } else if (IsLexicalVariableMode(mode) ||
|
| + IsLexicalVariableMode(var->mode())) {
|
| // Allow duplicate function decls for web compat, see bug 4693.
|
| if (is_sloppy(language_mode()) && is_function_declaration &&
|
| var->is_function()) {
|
| @@ -2103,19 +2094,14 @@ Statement* Parser::ParseFunctionDeclaration(
|
| // initial value upon entering the corresponding scope.
|
| // In ES6, a function behaves as a lexical binding, except in
|
| // a script scope, or the initial scope of eval or another function.
|
| - VariableMode mode =
|
| - (is_strict(language_mode()) || allow_harmony_sloppy_function()) &&
|
| - !scope_->is_declaration_scope()
|
| - ? LET
|
| - : VAR;
|
| + VariableMode mode = !scope_->is_declaration_scope() ? LET : VAR;
|
| VariableProxy* proxy = NewUnresolved(name, mode);
|
| Declaration* declaration =
|
| factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
|
| Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
|
| if (names) names->Add(name, zone());
|
| EmptyStatement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
|
| - if (is_sloppy(language_mode()) && allow_harmony_sloppy_function() &&
|
| - !scope_->is_declaration_scope()) {
|
| + if (is_sloppy(language_mode()) && !scope_->is_declaration_scope()) {
|
| SloppyBlockFunctionStatement* delegate =
|
| factory()->NewSloppyBlockFunctionStatement(empty, scope_);
|
| scope_->DeclarationScope()->sloppy_block_function_map()->Declare(name,
|
| @@ -2143,12 +2129,6 @@ Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names,
|
| //
|
| // so rewrite it as such.
|
|
|
| - if (!allow_harmony_sloppy() && is_sloppy(language_mode())) {
|
| - ReportMessage(MessageTemplate::kSloppyLexical);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| -
|
| int pos = position();
|
| bool is_strict_reserved = false;
|
| const AstRawString* name =
|
| @@ -2279,12 +2259,11 @@ Block* Parser::ParseVariableDeclarations(
|
|
|
| if (peek() == Token::VAR) {
|
| Consume(Token::VAR);
|
| - } else if (peek() == Token::CONST && allow_const()) {
|
| + } else if (peek() == Token::CONST) {
|
| Consume(Token::CONST);
|
| - DCHECK(is_strict(language_mode()) || allow_harmony_sloppy());
|
| DCHECK(var_context != kStatement);
|
| parsing_result->descriptor.mode = CONST;
|
| - } else if (peek() == Token::LET && allow_let()) {
|
| + } else if (peek() == Token::LET) {
|
| Consume(Token::LET);
|
| DCHECK(var_context != kStatement);
|
| parsing_result->descriptor.mode = LET;
|
| @@ -2493,15 +2472,6 @@ Statement* Parser::ParseExpressionOrLabelledStatement(
|
| }
|
|
|
| // Parsed expression statement, followed by semicolon.
|
| - // Detect attempts at 'let' declarations in sloppy mode.
|
| - if (!allow_harmony_sloppy_let() && peek() == Token::IDENTIFIER &&
|
| - expr->AsVariableProxy() != NULL &&
|
| - expr->AsVariableProxy()->raw_name() ==
|
| - ast_value_factory()->let_string()) {
|
| - ReportMessage(MessageTemplate::kSloppyLexical, NULL);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| ExpectSemicolon(CHECK_OK);
|
| return factory()->NewExpressionStatement(expr, pos);
|
| }
|
| @@ -3497,10 +3467,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| Expect(Token::FOR, CHECK_OK);
|
| Expect(Token::LPAREN, CHECK_OK);
|
| for_scope->set_start_position(scanner()->location().beg_pos);
|
| - bool is_let_identifier_expression = false;
|
| DeclarationParsingResult parsing_result;
|
| if (peek() != Token::SEMICOLON) {
|
| - if (peek() == Token::VAR || (peek() == Token::CONST && allow_const()) ||
|
| + if (peek() == Token::VAR || peek() == Token::CONST ||
|
| (peek() == Token::LET && IsNextLetKeyword())) {
|
| ParseVariableDeclarations(kForStatement, &parsing_result, nullptr,
|
| CHECK_OK);
|
| @@ -3673,10 +3642,6 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| Expression* expression = ParseExpression(false, &classifier, CHECK_OK);
|
| int lhs_end_pos = scanner()->location().end_pos;
|
| ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE;
|
| - is_let_identifier_expression =
|
| - expression->IsVariableProxy() &&
|
| - expression->AsVariableProxy()->raw_name() ==
|
| - ast_value_factory()->let_string();
|
|
|
| bool is_for_each = CheckInOrOf(&mode, ok);
|
| if (!*ok) return nullptr;
|
| @@ -3737,13 +3702,6 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| Target target(&this->target_stack_, loop);
|
|
|
| // Parsed initializer at this point.
|
| - // Detect attempts at 'let' declarations in sloppy mode.
|
| - if (!allow_harmony_sloppy_let() && peek() == Token::IDENTIFIER &&
|
| - is_sloppy(language_mode()) && is_let_identifier_expression) {
|
| - ReportMessage(MessageTemplate::kSloppyLexical, NULL);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| Expect(Token::SEMICOLON, CHECK_OK);
|
|
|
| Expression* cond = NULL;
|
| @@ -4039,42 +3997,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| function_name = ast_value_factory()->empty_string();
|
| }
|
|
|
| - // Function declarations are function scoped in normal mode, so they are
|
| - // hoisted. In harmony block scoping mode they are block scoped, so they
|
| - // are not hoisted.
|
| - //
|
| - // One tricky case are function declarations in a local sloppy-mode eval:
|
| - // their declaration is hoisted, but they still see the local scope. E.g.,
|
| - //
|
| - // function() {
|
| - // var x = 0
|
| - // try { throw 1 } catch (x) { eval("function g() { return x }") }
|
| - // return g()
|
| - // }
|
| - //
|
| - // needs to return 1. To distinguish such cases, we need to detect
|
| - // (1) whether a function stems from a sloppy eval, and
|
| - // (2) whether it actually hoists across the eval.
|
| - // Unfortunately, we do not represent sloppy eval scopes, so we do not have
|
| - // either information available directly, especially not when lazily compiling
|
| - // a function like 'g'. We hence rely on the following invariants:
|
| - // - (1) is the case iff the innermost scope of the deserialized scope chain
|
| - // under which we compile is _not_ a declaration scope. This holds because
|
| - // in all normal cases, function declarations are fully hoisted to a
|
| - // declaration scope and compiled relative to that.
|
| - // - (2) is the case iff the current declaration scope is still the original
|
| - // one relative to the deserialized scope chain. Otherwise we must be
|
| - // compiling a function in an inner declaration scope in the eval, e.g. a
|
| - // nested function, and hoisting works normally relative to that.
|
| - Scope* declaration_scope = scope_->DeclarationScope();
|
| - Scope* original_declaration_scope = original_scope_->DeclarationScope();
|
| - Scope* scope = function_type == FunctionLiteral::kDeclaration &&
|
| - is_sloppy(language_mode) &&
|
| - !allow_harmony_sloppy_function() &&
|
| - (original_scope_ == original_declaration_scope ||
|
| - declaration_scope != original_declaration_scope)
|
| - ? NewScope(declaration_scope, FUNCTION_SCOPE, kind)
|
| - : NewScope(scope_, FUNCTION_SCOPE, kind);
|
| + Scope* scope = NewScope(scope_, FUNCTION_SCOPE, kind);
|
| SetLanguageMode(scope, language_mode);
|
| ZoneList<Statement*>* body = NULL;
|
| int arity = -1;
|
| @@ -4249,7 +4172,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| CheckStrictOctalLiteral(scope->start_position(), scope->end_position(),
|
| CHECK_OK);
|
| }
|
| - if (is_sloppy(language_mode) && allow_harmony_sloppy_function()) {
|
| + if (is_sloppy(language_mode)) {
|
| InsertSloppyBlockFunctionVarBindings(scope, CHECK_OK);
|
| }
|
| CheckConflictingVarDeclarations(scope, CHECK_OK);
|
| @@ -4673,9 +4596,6 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
|
| reusable_preparser_->set_allow_lazy(true);
|
| #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name());
|
| SET_ALLOW(natives);
|
| - SET_ALLOW(harmony_sloppy);
|
| - SET_ALLOW(harmony_sloppy_function);
|
| - SET_ALLOW(harmony_sloppy_let);
|
| SET_ALLOW(harmony_do_expressions);
|
| SET_ALLOW(harmony_function_name);
|
| SET_ALLOW(harmony_function_sent);
|
|
|