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); |