| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index 1868ee0618069a578c91789f278ef238c58a391a..43e0203c98e5ea57369e5030519f78ca65b4a114 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -783,7 +783,6 @@ Parser::Parser(ParseInfo* info)
|
| set_allow_harmony_destructuring_bind(FLAG_harmony_destructuring_bind);
|
| set_allow_harmony_destructuring_assignment(
|
| FLAG_harmony_destructuring_assignment);
|
| - set_allow_strong_mode(FLAG_strong_mode);
|
| set_allow_legacy_const(FLAG_legacy_const);
|
| set_allow_harmony_do_expressions(FLAG_harmony_do_expressions);
|
| set_allow_harmony_function_name(FLAG_harmony_function_name);
|
| @@ -917,7 +916,7 @@ FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) {
|
| kNormalFunction, &function_factory);
|
|
|
| // Don't count the mode in the use counters--give the program a chance
|
| - // to enable script/module-wide strict/strong mode below.
|
| + // to enable script/module-wide strict mode below.
|
| scope_->SetLanguageMode(info->language_mode());
|
| ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
|
| bool ok = true;
|
| @@ -1170,28 +1169,7 @@ void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
|
| }
|
|
|
| Scanner::Location token_loc = scanner()->peek_location();
|
| - Scanner::Location old_this_loc = function_state_->this_location();
|
| - Scanner::Location old_super_loc = function_state_->super_location();
|
| Statement* stat = ParseStatementListItem(CHECK_OK);
|
| -
|
| - if (is_strong(language_mode()) && scope_->is_function_scope() &&
|
| - IsClassConstructor(function_state_->kind())) {
|
| - Scanner::Location this_loc = function_state_->this_location();
|
| - Scanner::Location super_loc = function_state_->super_location();
|
| - if (this_loc.beg_pos != old_this_loc.beg_pos &&
|
| - this_loc.beg_pos != token_loc.beg_pos) {
|
| - ReportMessageAt(this_loc, MessageTemplate::kStrongConstructorThis);
|
| - *ok = false;
|
| - return nullptr;
|
| - }
|
| - if (super_loc.beg_pos != old_super_loc.beg_pos &&
|
| - super_loc.beg_pos != token_loc.beg_pos) {
|
| - ReportMessageAt(super_loc, MessageTemplate::kStrongConstructorSuper);
|
| - *ok = false;
|
| - return nullptr;
|
| - }
|
| - }
|
| -
|
| if (stat == NULL || stat->IsEmpty()) {
|
| directive_prologue = false; // End of directive prologue.
|
| continue;
|
| @@ -1205,43 +1183,21 @@ void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
|
| if ((e_stat = stat->AsExpressionStatement()) != NULL &&
|
| (literal = e_stat->expression()->AsLiteral()) != NULL &&
|
| literal->raw_value()->IsString()) {
|
| - // Check "use strict" directive (ES5 14.1), "use asm" directive, and
|
| - // "use strong" directive (experimental).
|
| + // Check "use strict" directive (ES5 14.1), "use asm" directive.
|
| bool use_strict_found =
|
| literal->raw_value()->AsString() ==
|
| ast_value_factory()->use_strict_string() &&
|
| token_loc.end_pos - token_loc.beg_pos ==
|
| ast_value_factory()->use_strict_string()->length() + 2;
|
| - bool use_strong_found =
|
| - allow_strong_mode() &&
|
| - literal->raw_value()->AsString() ==
|
| - ast_value_factory()->use_strong_string() &&
|
| - token_loc.end_pos - token_loc.beg_pos ==
|
| - ast_value_factory()->use_strong_string()->length() + 2;
|
| - if (use_strict_found || use_strong_found) {
|
| - // Strong mode implies strict mode. If there are several "use strict"
|
| - // / "use strong" directives, do the strict mode changes only once.
|
| + if (use_strict_found) {
|
| if (is_sloppy(scope_->language_mode())) {
|
| RaiseLanguageMode(STRICT);
|
| }
|
|
|
| - if (use_strong_found) {
|
| - RaiseLanguageMode(STRONG);
|
| - if (IsClassConstructor(function_state_->kind())) {
|
| - // "use strong" cannot occur in a class constructor body, to avoid
|
| - // unintuitive strong class object semantics.
|
| - ParserTraits::ReportMessageAt(
|
| - token_loc, MessageTemplate::kStrongConstructorDirective);
|
| - *ok = false;
|
| - return nullptr;
|
| - }
|
| - }
|
| if (!scope_->HasSimpleParameters()) {
|
| // TC39 deemed "use strict" directives to be an error when occurring
|
| // in the body of a function with non-simple parameter list, on
|
| // 29/7/2015. https://goo.gl/ueA7Ln
|
| - //
|
| - // In V8, this also applies to "use strong " directives.
|
| const AstRawString* string = literal->raw_value()->AsString();
|
| ParserTraits::ReportMessageAt(
|
| token_loc, MessageTemplate::kIllegalLanguageModeDirective,
|
| @@ -1461,10 +1417,6 @@ ZoneList<ImportDeclaration*>* Parser::ParseNamedImports(int pos, bool* ok) {
|
| *ok = false;
|
| ReportMessage(MessageTemplate::kStrictEvalArguments);
|
| return NULL;
|
| - } else if (is_strong(language_mode()) && IsUndefined(local_name)) {
|
| - *ok = false;
|
| - ReportMessage(MessageTemplate::kStrongUndefined);
|
| - return NULL;
|
| }
|
| VariableProxy* proxy = NewUnresolved(local_name, IMPORT);
|
| ImportDeclaration* declaration =
|
| @@ -1809,12 +1761,6 @@ Statement* Parser::ParseSubStatement(ZoneList<const AstRawString*>* labels,
|
| return ParseBlock(labels, ok);
|
|
|
| case Token::SEMICOLON:
|
| - if (is_strong(language_mode())) {
|
| - ReportMessageAt(scanner()->peek_location(),
|
| - MessageTemplate::kStrongEmpty);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| Next();
|
| return factory()->NewEmptyStatement(RelocInfo::kNoPosition);
|
|
|
| @@ -2168,12 +2114,10 @@ Statement* Parser::ParseFunctionDeclaration(
|
| // 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_strong(language_mode())
|
| - ? CONST
|
| - : (is_strict(language_mode()) || allow_harmony_sloppy_function()) &&
|
| - !scope_->is_declaration_scope()
|
| - ? LET
|
| - : VAR;
|
| + (is_strict(language_mode()) || allow_harmony_sloppy_function()) &&
|
| + !scope_->is_declaration_scope()
|
| + ? LET
|
| + : VAR;
|
| VariableProxy* proxy = NewUnresolved(name, mode);
|
| Declaration* declaration =
|
| factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
|
| @@ -2222,10 +2166,9 @@ Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names,
|
| ClassLiteral* value = ParseClassLiteral(name, scanner()->location(),
|
| is_strict_reserved, pos, CHECK_OK);
|
|
|
| - VariableMode mode = is_strong(language_mode()) ? CONST : LET;
|
| - VariableProxy* proxy = NewUnresolved(name, mode);
|
| + VariableProxy* proxy = NewUnresolved(name, LET);
|
| Declaration* declaration =
|
| - factory()->NewVariableDeclaration(proxy, mode, scope_, pos);
|
| + factory()->NewVariableDeclaration(proxy, LET, scope_, pos);
|
| Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
|
| proxy->var()->set_initializer_position(position());
|
| Assignment* assignment =
|
| @@ -2345,12 +2288,6 @@ Block* Parser::ParseVariableDeclarations(
|
| }
|
|
|
| if (peek() == Token::VAR) {
|
| - if (is_strong(language_mode())) {
|
| - Scanner::Location location = scanner()->peek_location();
|
| - ReportMessageAt(location, MessageTemplate::kStrongVar);
|
| - *ok = false;
|
| - return nullptr;
|
| - }
|
| Consume(Token::VAR);
|
| } else if (peek() == Token::CONST && allow_const()) {
|
| Consume(Token::CONST);
|
| @@ -2521,42 +2458,6 @@ Statement* Parser::ParseExpressionOrLabelledStatement(
|
| *ok = false;
|
| return nullptr;
|
|
|
| - case Token::THIS:
|
| - if (!FLAG_strong_this) break;
|
| - // Fall through.
|
| - case Token::SUPER:
|
| - if (is_strong(language_mode()) &&
|
| - IsClassConstructor(function_state_->kind())) {
|
| - bool is_this = peek() == Token::THIS;
|
| - Expression* expr;
|
| - ExpressionClassifier classifier(this);
|
| - if (is_this) {
|
| - expr = ParseStrongInitializationExpression(&classifier, CHECK_OK);
|
| - } else {
|
| - expr = ParseStrongSuperCallExpression(&classifier, CHECK_OK);
|
| - }
|
| - RewriteNonPattern(&classifier, CHECK_OK);
|
| - switch (peek()) {
|
| - case Token::SEMICOLON:
|
| - Consume(Token::SEMICOLON);
|
| - break;
|
| - case Token::RBRACE:
|
| - case Token::EOS:
|
| - break;
|
| - default:
|
| - if (!scanner()->HasAnyLineTerminatorBeforeNext()) {
|
| - ReportMessageAt(function_state_->this_location(),
|
| - is_this
|
| - ? MessageTemplate::kStrongConstructorThis
|
| - : MessageTemplate::kStrongConstructorSuper);
|
| - *ok = false;
|
| - return nullptr;
|
| - }
|
| - }
|
| - return factory()->NewExpressionStatement(expr, pos);
|
| - }
|
| - break;
|
| -
|
| default:
|
| break;
|
| }
|
| @@ -2736,15 +2637,6 @@ Statement* Parser::ParseReturnStatement(bool* ok) {
|
| return_value = GetLiteralUndefined(position());
|
| }
|
| } else {
|
| - if (is_strong(language_mode()) &&
|
| - IsClassConstructor(function_state_->kind())) {
|
| - int pos = peek_position();
|
| - ReportMessageAt(Scanner::Location(pos, pos + 1),
|
| - MessageTemplate::kStrongConstructorReturnValue);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| -
|
| int pos = peek_position();
|
| return_value = ParseExpression(true, CHECK_OK);
|
|
|
| @@ -2871,13 +2763,6 @@ CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) {
|
| stat = ParseStatementListItem(CHECK_OK);
|
| statements->Add(stat, zone());
|
| }
|
| - if (is_strong(language_mode()) && stat != NULL && !stat->IsJump() &&
|
| - peek() != Token::RBRACE) {
|
| - ReportMessageAt(scanner()->location(),
|
| - MessageTemplate::kStrongSwitchFallthrough);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| return factory()->NewCaseClause(label, statements, pos);
|
| }
|
|
|
| @@ -4372,16 +4257,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
| // Parsing the body may change the language mode in our scope.
|
| language_mode = scope->language_mode();
|
|
|
| - if (is_strong(language_mode) && IsSubclassConstructor(kind)) {
|
| - if (!function_state.super_location().IsValid()) {
|
| - ReportMessageAt(function_name_location,
|
| - MessageTemplate::kStrongSuperCallMissing,
|
| - kReferenceError);
|
| - *ok = false;
|
| - return nullptr;
|
| - }
|
| - }
|
| -
|
| // Validate name and parameter names. We can do this only after parsing the
|
| // function, since the function can declare itself strict.
|
| CheckFunctionName(language_mode, function_name, function_name_validity,
|
| @@ -4823,7 +4698,6 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
|
| SET_ALLOW(harmony_default_parameters);
|
| SET_ALLOW(harmony_destructuring_bind);
|
| SET_ALLOW(harmony_destructuring_assignment);
|
| - SET_ALLOW(strong_mode);
|
| SET_ALLOW(harmony_do_expressions);
|
| SET_ALLOW(harmony_function_name);
|
| SET_ALLOW(harmony_function_sent);
|
| @@ -4855,11 +4729,6 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name,
|
| *ok = false;
|
| return NULL;
|
| }
|
| - if (is_strong(language_mode()) && IsUndefined(name)) {
|
| - ReportMessageAt(class_name_location, MessageTemplate::kStrongUndefined);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
|
|
| Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
|
| BlockState block_state(&scope_, block_scope);
|
| @@ -4932,8 +4801,8 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name,
|
| end_pos, block_scope->language_mode());
|
| }
|
|
|
| - // Note that we do not finalize this block scope because strong
|
| - // mode uses it as a sentinel value indicating an anonymous class.
|
| + // Note that we do not finalize this block scope because it is
|
| + // used as a sentinel value indicating an anonymous class.
|
| block_scope->set_end_position(end_pos);
|
|
|
| if (name != NULL) {
|
| @@ -5503,8 +5372,6 @@ void Parser::SetLanguageMode(Scope* scope, LanguageMode mode) {
|
| v8::Isolate::UseCounterFeature feature;
|
| if (is_sloppy(mode))
|
| feature = v8::Isolate::kSloppyMode;
|
| - else if (is_strong(mode))
|
| - feature = v8::Isolate::kStrongMode;
|
| else if (is_strict(mode))
|
| feature = v8::Isolate::kStrictMode;
|
| else
|
| @@ -5515,8 +5382,8 @@ void Parser::SetLanguageMode(Scope* scope, LanguageMode mode) {
|
|
|
|
|
| void Parser::RaiseLanguageMode(LanguageMode mode) {
|
| - SetLanguageMode(scope_,
|
| - static_cast<LanguageMode>(scope_->language_mode() | mode));
|
| + LanguageMode old = scope_->language_mode();
|
| + SetLanguageMode(scope_, old > mode ? old : mode);
|
| }
|
|
|
|
|
|
|