| Index: src/parsing/preparser.h
|
| diff --git a/src/parsing/preparser.h b/src/parsing/preparser.h
|
| index 0120c2c5dffaf33bb24982f1447b6baa2d2b4dc2..38b3dc6faabe915ad677bf70244c107e7488d7c6 100644
|
| --- a/src/parsing/preparser.h
|
| +++ b/src/parsing/preparser.h
|
| @@ -1320,14 +1320,30 @@ class PreParser : public ParserBase<PreParser> {
|
| PreParserExpression* each_variable, bool* ok) {
|
| if (track_unresolved_variables_) {
|
| DCHECK(for_info->parsing_result.declarations.length() == 1);
|
| + bool is_for_var_of =
|
| + for_info->mode == ForEachStatement::ITERATE &&
|
| + for_info->parsing_result.descriptor.mode == VariableMode::VAR;
|
| + bool collect_names =
|
| + IsLexicalVariableMode(for_info->parsing_result.descriptor.mode) ||
|
| + is_for_var_of;
|
| +
|
| DeclareAndInitializeVariables(
|
| PreParserStatement::Default(), &for_info->parsing_result.descriptor,
|
| - &for_info->parsing_result.declarations[0], nullptr, ok);
|
| + &for_info->parsing_result.declarations[0],
|
| + collect_names ? &for_info->bound_names : nullptr, ok);
|
| }
|
| }
|
|
|
| V8_INLINE PreParserStatement CreateForEachStatementTDZ(
|
| PreParserStatement init_block, const ForInfo& for_info, bool* ok) {
|
| + if (track_unresolved_variables_) {
|
| + if (IsLexicalVariableMode(for_info.parsing_result.descriptor.mode)) {
|
| + for (auto name : for_info.bound_names) {
|
| + scope()->DeclareVariableName(name, LET);
|
| + }
|
| + return PreParserStatement::Default();
|
| + }
|
| + }
|
| return init_block;
|
| }
|
|
|
| @@ -1337,9 +1353,11 @@ class PreParser : public ParserBase<PreParser> {
|
| PreParserStatement body, Scope* inner_scope, const ForInfo& for_info,
|
| bool* ok) {
|
| // See Parser::DesugarLexicalBindingsInForStatement.
|
| - for (int i = 0; i < for_info.bound_names.length(); i++) {
|
| - inner_scope->DeclareVariableName(for_info.bound_names[i],
|
| - for_info.parsing_result.descriptor.mode);
|
| + if (track_unresolved_variables_) {
|
| + for (auto name : for_info.bound_names) {
|
| + inner_scope->DeclareVariableName(
|
| + name, for_info.parsing_result.descriptor.mode);
|
| + }
|
| }
|
| return loop;
|
| }
|
|
|