Index: src/parsing/expression-classifier.h |
diff --git a/src/parsing/expression-classifier.h b/src/parsing/expression-classifier.h |
index 7b31a2143f281149e3751564ee5c0f8adcfbe6e2..c561ba619a28b61b500e8175142c2d826a85834e 100644 |
--- a/src/parsing/expression-classifier.h |
+++ b/src/parsing/expression-classifier.h |
@@ -371,62 +371,43 @@ class ExpressionClassifier { |
DCHECK_EQ(inner->reported_errors_, reported_errors_); |
DCHECK_EQ(inner->reported_errors_begin_, reported_errors_end_); |
DCHECK_EQ(inner->reported_errors_end_, reported_errors_->length()); |
+ |
if (merge_non_patterns) MergeNonPatterns(inner); |
- // Propagate errors from inner, but don't overwrite already recorded |
- // errors. |
- unsigned non_arrow_inner_invalid_productions = |
- inner->invalid_productions_ & ~ArrowFormalParametersProduction; |
- if (non_arrow_inner_invalid_productions) { |
- unsigned errors = non_arrow_inner_invalid_productions & productions & |
- ~invalid_productions_; |
- // As an exception to the above, the result continues to be a valid arrow |
- // formal parameters if the inner expression is a valid binding pattern. |
- if (productions & ArrowFormalParametersProduction && |
- is_valid_arrow_formal_parameters()) { |
- // Also copy function properties if expecting an arrow function |
- // parameter. |
- function_properties_ |= inner->function_properties_; |
- |
- if (!inner->is_valid_binding_pattern()) |
- errors |= ArrowFormalParametersProduction; |
+ |
+ // Propagate errors from inner, excluding arrow formal parameters. |
+ unsigned errors = inner->invalid_productions_ & productions & |
+ ~ArrowFormalParametersProduction; |
+ bool keep_inner = errors & ~invalid_productions_; |
+ bool copy_arrow = false; |
+ |
+ // If there's nothing to add, the inner classifier's array can be dropped. |
+ if (keep_inner) invalid_productions_ |= errors; |
+ |
+ // As an exception to error propagation, the result continues to be valid |
+ // as arrow formal parameters if the inner expression is a valid binding |
+ // pattern. |
+ if (productions & ArrowFormalParametersProduction && |
+ is_valid_arrow_formal_parameters()) { |
+ // Also copy function properties if expecting an arrow function |
+ // parameter. |
+ function_properties_ |= inner->function_properties_; |
+ if (!inner->is_valid_binding_pattern()) { |
+ keep_inner = copy_arrow = true; |
+ invalid_productions_ |= ArrowFormalParametersProduction; |
} |
+ } |
- if (errors != 0) { |
- invalid_productions_ |= errors; |
- int arrow_index = inner->reported_errors_end_; |
- for (int i = inner->reported_errors_begin_; |
- i < inner->reported_errors_end_; i++) { |
- if (reported_errors_->at(i).kind == kUnusedError || |
- reported_errors_->at(i).kind == kArrowFormalParametersProduction) |
- continue; |
- if (errors & (1 << reported_errors_->at(i).kind)) |
- Move(i); |
- if (reported_errors_->at(i).kind == kBindingPatternProduction && |
- errors & ArrowFormalParametersProduction) { |
- if (reported_errors_end_ <= i) { |
- Move(i); |
- reported_errors_->at(reported_errors_end_-1).kind = |
- kArrowFormalParametersProduction; |
- } else { |
- DCHECK_EQ(reported_errors_end_, i+1); |
- arrow_index = i; |
- } |
- } |
- } |
- if (arrow_index < inner->reported_errors_end_) { |
- if (reported_errors_end_ < inner->reported_errors_end_) { |
- Replace(reported_errors_end_, arrow_index); |
- reported_errors_->at(reported_errors_end_++).kind = |
- kArrowFormalParametersProduction; |
- } else { |
- Add(reported_errors_->at(arrow_index)); |
- reported_errors_->at(reported_errors_end_-1).kind = |
- kArrowFormalParametersProduction; |
- } |
- } |
+ if (keep_inner) { |
+ reported_errors_end_ = inner->reported_errors_end_; |
+ if (copy_arrow) { |
+ Add(inner->reported_error(kBindingPatternProduction)); |
+ reported_errors_->at(reported_errors_end_-1).kind = |
+ kArrowFormalParametersProduction; |
} |
+ } else { |
+ reported_errors_->Rewind(reported_errors_end_); |
} |
- reported_errors_->Rewind(reported_errors_end_); |
+ |
inner->reported_errors_begin_ = inner->reported_errors_end_ = |
reported_errors_end_; |
} |
@@ -469,22 +450,6 @@ class ExpressionClassifier { |
reported_errors_end_++; |
} |
- V8_INLINE void Move(int i) { |
- DCHECK_LE(reported_errors_end_, i); |
- DCHECK_LT(i, reported_errors_->length()); |
- if (reported_errors_end_ < i) |
- reported_errors_->at(reported_errors_end_) = reported_errors_->at(i); |
- reported_errors_end_++; |
- } |
- |
- V8_INLINE void Replace(int j, int i) { |
- DCHECK_LT(i, reported_errors_->length()); |
- DCHECK_LE(j, reported_errors_end_); |
- DCHECK(j == reported_errors_end_ || |
- reported_errors_->at(j).kind == kUnusedError); |
- if (i != j) reported_errors_->at(j) = reported_errors_->at(i); |
- } |
- |
Zone* zone_; |
ZoneList<typename Traits::Type::Expression>* non_patterns_to_rewrite_; |
int non_pattern_begin_; |