Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index 83f24273a7efd2c4a5449608efa2fb0a221cfb07..286e22d41f29dd71cfe04cb151e6bb70ff6fece5 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -785,6 +785,7 @@ Parser::Parser(ParseInfo* info) |
set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() && |
info->isolate()->is_tail_call_elimination_enabled()); |
set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); |
+ set_allow_harmony_for_in(FLAG_harmony_for_in); |
set_allow_harmony_function_name(FLAG_harmony_function_name); |
set_allow_harmony_function_sent(FLAG_harmony_function_sent); |
set_allow_harmony_restrictive_declarations( |
@@ -3486,7 +3487,12 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
if (parsing_result.first_initializer_loc.IsValid() && |
(is_strict(language_mode()) || mode == ForEachStatement::ITERATE || |
IsLexicalVariableMode(parsing_result.descriptor.mode) || |
- !decl.pattern->IsVariableProxy())) { |
+ !decl.pattern->IsVariableProxy() || allow_harmony_for_in())) { |
+ // Only increment the use count if we would have let this through |
+ // without the flag. |
+ if (allow_harmony_for_in()) { |
+ ++use_counts_[v8::Isolate::kForInInitializer]; |
+ } |
ParserTraits::ReportMessageAt( |
parsing_result.first_initializer_loc, |
MessageTemplate::kForInOfLoopInitializer, |
@@ -3500,19 +3506,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
// special case for legacy for (var/const x =.... in) |
if (!IsLexicalVariableMode(parsing_result.descriptor.mode) && |
decl.pattern->IsVariableProxy() && decl.initializer != nullptr) { |
+ DCHECK(!allow_harmony_for_in()); |
++use_counts_[v8::Isolate::kForInInitializer]; |
- if (FLAG_harmony_for_in) { |
- // TODO(rossberg): This error is not currently generated in the |
- // preparser, because that would lose some of the use counts |
- // recorded above. Once either the use counter or the flag is |
- // removed, the preparser should be adjusted. |
- ParserTraits::ReportMessageAt( |
- parsing_result.first_initializer_loc, |
- MessageTemplate::kForInOfLoopInitializer, |
- ForEachStatement::VisitModeString(mode)); |
- *ok = false; |
- return nullptr; |
- } |
const AstRawString* name = |
decl.pattern->AsVariableProxy()->raw_name(); |
VariableProxy* single_var = scope_->NewUnresolved( |
@@ -4604,6 +4599,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
#define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); |
SET_ALLOW(natives); |
SET_ALLOW(harmony_do_expressions); |
+ SET_ALLOW(harmony_for_in); |
SET_ALLOW(harmony_function_name); |
SET_ALLOW(harmony_function_sent); |
SET_ALLOW(harmony_exponentiation_operator); |
@@ -4612,7 +4608,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
} |
PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
language_mode(), function_state_->kind(), scope_->has_simple_parameters(), |
- logger, bookmark); |
+ logger, bookmark, use_counts_); |
if (pre_parse_timer_ != NULL) { |
pre_parse_timer_->Stop(); |
} |