Commit 87c48d31 authored by Toon Verwaest's avatar Toon Verwaest Committed by Commit Bot

[parser] Simplify copying BP to AFP

Simpliy track arrow-formal-parameters through errors and copy it from binding
pattern errors in AccumulateImpl rather than using a separate flag.

Change-Id: I8146718f490f3c9a5de3c30dec2aa3218831523f
Reviewed-on: https://chromium-review.googlesource.com/c/1275816
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56568}
parent 2b4c6a41
...@@ -182,21 +182,19 @@ class ExpressionClassifierBase { ...@@ -182,21 +182,19 @@ class ExpressionClassifierBase {
~this->invalid_productions_; ~this->invalid_productions_;
// The result will continue to be a valid arrow formal parameters if the // The result will continue to be a valid arrow formal parameters if the
// inner expression is a valid binding pattern. // inner expression is a valid binding pattern.
bool copy_BP_to_AFP = false; if (productions & ArrowFormalParametersProduction) {
if (productions & ArrowFormalParametersProduction &&
this->is_valid_arrow_formal_parameters()) {
// Also whether we've seen any non-simple parameters // Also whether we've seen any non-simple parameters
// if expecting an arrow function parameter. // if expecting an arrow function parameter.
this->is_non_simple_parameter_list_ |= this->is_non_simple_parameter_list_ |=
inner->is_non_simple_parameter_list_; inner->is_non_simple_parameter_list_;
if (!inner->is_valid_binding_pattern()) { if (is_valid_arrow_formal_parameters() &&
copy_BP_to_AFP = true; !inner->is_valid_binding_pattern()) {
this->invalid_productions_ |= ArrowFormalParametersProduction; errors |= ArrowFormalParametersProduction;
} }
} }
if (errors != 0 || copy_BP_to_AFP) { if (errors != 0) {
static_cast<ErrorTracker*>(this)->AccumulateErrorImpl( static_cast<ErrorTracker*>(this)->AccumulateErrorImpl(
inner, productions, errors, copy_BP_to_AFP); inner, productions, errors);
this->invalid_productions_ |= errors; this->invalid_productions_ |= errors;
} }
} }
...@@ -239,7 +237,7 @@ class ExpressionClassifierErrorTracker ...@@ -239,7 +237,7 @@ class ExpressionClassifierErrorTracker
protected: protected:
V8_INLINE const Error& reported_error(ErrorKind kind) const { V8_INLINE const Error& reported_error(ErrorKind kind) const {
if (this->invalid_productions_ & (1 << kind)) { if (!this->is_valid(1 << kind)) {
for (int i = reported_errors_begin_; i < reported_errors_end_; i++) { for (int i = reported_errors_begin_; i < reported_errors_end_; i++) {
if (reported_errors_->at(i).kind == kind) if (reported_errors_->at(i).kind == kind)
return reported_errors_->at(i); return reported_errors_->at(i);
...@@ -259,7 +257,7 @@ class ExpressionClassifierErrorTracker ...@@ -259,7 +257,7 @@ class ExpressionClassifierErrorTracker
// Adds e to the end of the list of reported errors for this classifier. // Adds e to the end of the list of reported errors for this classifier.
// It is expected that this classifier is the last one in the stack. // It is expected that this classifier is the last one in the stack.
V8_INLINE void Add(TP production, const Error& e) { V8_INLINE void Add(TP production, const Error& e) {
if ((this->invalid_productions_ & production) != 0) return; if (!this->is_valid(production)) return;
this->invalid_productions_ |= production; this->invalid_productions_ |= production;
DCHECK_EQ(reported_errors_end_, reported_errors_->length()); DCHECK_EQ(reported_errors_end_, reported_errors_->length());
reported_errors_->Add(e, this->base_->impl()->zone()); reported_errors_->Add(e, this->base_->impl()->zone());
...@@ -294,8 +292,7 @@ class ExpressionClassifierErrorTracker ...@@ -294,8 +292,7 @@ class ExpressionClassifierErrorTracker
} }
void AccumulateErrorImpl(ExpressionClassifier<Types>* const inner, void AccumulateErrorImpl(ExpressionClassifier<Types>* const inner,
unsigned productions, unsigned errors, unsigned productions, unsigned errors) {
bool copy_BP_to_AFP) {
// Traverse the list of errors reported by the inner classifier // Traverse the list of errors reported by the inner classifier
// to copy what's necessary. // to copy what's necessary.
int binding_pattern_index = inner->reported_errors_end_; int binding_pattern_index = inner->reported_errors_end_;
...@@ -304,7 +301,8 @@ class ExpressionClassifierErrorTracker ...@@ -304,7 +301,8 @@ class ExpressionClassifierErrorTracker
int k = this->reported_errors_->at(i).kind; int k = this->reported_errors_->at(i).kind;
if (errors & (1 << k)) this->Copy(i); if (errors & (1 << k)) this->Copy(i);
// Check if it's a BP error that has to be copied to an AFP error. // Check if it's a BP error that has to be copied to an AFP error.
if (k == ErrorKind::kBindingPatternProduction && copy_BP_to_AFP) { if (k == ErrorKind::kBindingPatternProduction &&
(errors & TP::ArrowFormalParametersProduction) != 0) {
if (this->reported_errors_end_ <= i) { if (this->reported_errors_end_ <= i) {
// If the BP error itself has not already been copied, // If the BP error itself has not already been copied,
// copy it now and change it to an AFP error. // copy it now and change it to an AFP error.
...@@ -383,8 +381,7 @@ class ExpressionClassifierEmptyErrorTracker ...@@ -383,8 +381,7 @@ class ExpressionClassifierEmptyErrorTracker
#endif #endif
V8_INLINE void RewindErrors(ExpressionClassifier<Types>* const inner) {} V8_INLINE void RewindErrors(ExpressionClassifier<Types>* const inner) {}
V8_INLINE void AccumulateErrorImpl(ExpressionClassifier<Types>* const inner, V8_INLINE void AccumulateErrorImpl(ExpressionClassifier<Types>* const inner,
unsigned productions, unsigned errors, unsigned productions, unsigned errors) {}
bool copy_BP_to_AFP) {}
friend BaseClassType; friend BaseClassType;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment