Chromium Code Reviews| Index: src/parsing/preparser.h |
| diff --git a/src/parsing/preparser.h b/src/parsing/preparser.h |
| index e888d3e87e3fd23420e155460816a3e0d2f505e6..037c2d0376b6580bee226958db9117b94e2b30e9 100644 |
| --- a/src/parsing/preparser.h |
| +++ b/src/parsing/preparser.h |
| @@ -1049,7 +1049,22 @@ class PreParser : public ParserBase<PreParser> { |
| PreParserStatementList cases, Scope* scope) { |
| return PreParserStatement::Default(); |
| } |
| - V8_INLINE void RewriteCatchPattern(CatchInfo* catch_info, bool* ok) {} |
| + |
| + V8_INLINE void RewriteCatchPattern(CatchInfo* catch_info, bool* ok) { |
| + if (track_unresolved_variables_) { |
| + if (catch_info->name.string_ != nullptr) { |
| + // Unlike in the parser, we need to declare the catch variable as LET |
|
adamk
2017/01/06 19:05:04
High-level question...would it make sense, once th
|
| + // variable, so that it won't get hoisted out of the scope. |
| + catch_info->scope->DeclareVariableName(catch_info->name.string_, LET); |
| + } |
| + if (catch_info->pattern.variables_ != nullptr) { |
| + for (auto variable : *catch_info->pattern.variables_) { |
| + scope()->DeclareVariableName(variable->raw_name(), LET); |
| + } |
| + } |
| + } |
| + } |
| + |
| V8_INLINE void ValidateCatchBlock(const CatchInfo& catch_info, bool* ok) {} |
| V8_INLINE PreParserStatement RewriteTryStatement( |
| PreParserStatement try_block, PreParserStatement catch_block, |
| @@ -1084,6 +1099,12 @@ class PreParser : public ParserBase<PreParser> { |
| DeclareClass(PreParserIdentifier variable_name, PreParserExpression value, |
| ZoneList<const AstRawString*>* names, int class_token_pos, |
| int end_pos, bool* ok) { |
| + // Preparser shouldn't be used in contexts where we need to track the names. |
| + DCHECK_NULL(names); |
|
marja
2017/01/06 15:44:29
This DCHECK is also unrelated, but I'm adding it s
|
| + if (variable_name.string_ != nullptr) { |
| + DCHECK(track_unresolved_variables_); |
| + scope()->DeclareVariableName(variable_name.string_, LET); |
| + } |
| return PreParserStatement::Default(); |
| } |
| V8_INLINE void DeclareClassVariable(PreParserIdentifier name, |
| @@ -1264,9 +1285,18 @@ class PreParser : public ParserBase<PreParser> { |
| V8_INLINE PreParserStatement RewriteForVarInLegacy(const ForInfo& for_info) { |
| return PreParserStatement::Null(); |
| } |
| + |
| V8_INLINE void DesugarBindingInForEachStatement( |
| ForInfo* for_info, PreParserStatement* body_block, |
| - PreParserExpression* each_variable, bool* ok) {} |
| + PreParserExpression* each_variable, bool* ok) { |
| + if (track_unresolved_variables_) { |
| + DCHECK(for_info->parsing_result.declarations.length() == 1); |
| + DeclareAndInitializeVariables( |
| + PreParserStatement::Default(), &for_info->parsing_result.descriptor, |
| + &for_info->parsing_result.declarations[0], nullptr, ok); |
| + } |
| + } |
| + |
| V8_INLINE PreParserStatement CreateForEachStatementTDZ( |
| PreParserStatement init_block, const ForInfo& for_info, bool* ok) { |
| return init_block; |