OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_PARSING_EXPRESSION_CLASSIFIER_H | 5 #ifndef V8_PARSING_EXPRESSION_CLASSIFIER_H |
6 #define V8_PARSING_EXPRESSION_CLASSIFIER_H | 6 #define V8_PARSING_EXPRESSION_CLASSIFIER_H |
7 | 7 |
8 #include "src/messages.h" | 8 #include "src/messages.h" |
9 #include "src/parsing/scanner.h" | 9 #include "src/parsing/scanner.h" |
10 #include "src/parsing/token.h" | 10 #include "src/parsing/token.h" |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
365 e.kind = kUnusedError; | 365 e.kind = kUnusedError; |
366 } | 366 } |
367 | 367 |
368 void Accumulate(ExpressionClassifier* inner, | 368 void Accumulate(ExpressionClassifier* inner, |
369 unsigned productions = StandardProductions, | 369 unsigned productions = StandardProductions, |
370 bool merge_non_patterns = true) { | 370 bool merge_non_patterns = true) { |
371 DCHECK_EQ(inner->reported_errors_, reported_errors_); | 371 DCHECK_EQ(inner->reported_errors_, reported_errors_); |
372 DCHECK_EQ(inner->reported_errors_begin_, reported_errors_end_); | 372 DCHECK_EQ(inner->reported_errors_begin_, reported_errors_end_); |
373 DCHECK_EQ(inner->reported_errors_end_, reported_errors_->length()); | 373 DCHECK_EQ(inner->reported_errors_end_, reported_errors_->length()); |
374 if (merge_non_patterns) MergeNonPatterns(inner); | 374 if (merge_non_patterns) MergeNonPatterns(inner); |
375 // Propagate errors from inner, but don't overwrite already recorded | 375 // Propagate errors from inner, excluding arrow formal parameters. |
376 // errors. | 376 unsigned errors = inner->invalid_productions_ & productions & |
377 unsigned non_arrow_inner_invalid_productions = | 377 ~ArrowFormalParametersProduction; |
378 inner->invalid_productions_ & ~ArrowFormalParametersProduction; | |
379 int next = inner->reported_errors_begin_; | |
380 if (non_arrow_inner_invalid_productions) { | |
381 unsigned non_arrow_productions = | |
382 productions & ~ArrowFormalParametersProduction; | |
383 unsigned errors = | |
384 non_arrow_productions & non_arrow_inner_invalid_productions; | |
385 errors &= ~invalid_productions_; | |
386 | 378 |
387 // As an exception to the above, the result continues to be a valid arrow | 379 // If there's nothing to add, the inner classifier's array can be dropped. |
388 // formal parameters if the inner expression is a valid binding pattern. | 380 if (errors & ~invalid_productions_) { |
nickie
2016/05/18 17:32:41
In this if-then-else, the condition is reversed.
| |
389 if (productions & ArrowFormalParametersProduction && | 381 reported_errors_->Rewind(reported_errors_end_); |
caitp (gmail)
2016/05/18 15:23:21
All this does is set the ring buffer's length_ to
| |
390 is_valid_arrow_formal_parameters()) { | 382 } else { |
391 // Also copy function properties if expecting an arrow function | 383 invalid_productions_ |= errors; |
392 // parameter. | 384 reported_errors_end_ = inner->reported_errors_end_; |
393 function_properties_ |= inner->function_properties_; | 385 } |
394 | 386 |
395 if (!inner->is_valid_binding_pattern()) | 387 // As an exception to error propagation, the result continues to be valid |
396 errors |= ArrowFormalParametersProduction; | 388 // as arrow formal parameters if the inner expression is a valid binding |
397 } | 389 // pattern. |
398 | 390 if (productions & ArrowFormalParametersProduction && |
399 if (errors != 0) { | 391 is_valid_arrow_formal_parameters()) { |
400 invalid_productions_ |= errors; | 392 // Also copy function properties if expecting an arrow function |
401 int arrow_index = inner->reported_errors_end_; | 393 // parameter. |
402 for (int i = inner->reported_errors_begin_; | 394 function_properties_ |= inner->function_properties_; |
403 i < inner->reported_errors_end_; i++) { | 395 if (!inner->is_valid_binding_pattern()) { |
404 if (reported_errors_->at(i).kind == kUnusedError || | 396 invalid_productions_ |= ArrowFormalParametersProduction; |
405 reported_errors_->at(i).kind == kArrowFormalParametersProduction) | 397 Add(inner->reported_error(kBindingPatternProduction)); |
406 continue; | |
407 if (errors & (1 << reported_errors_->at(i).kind)) | |
408 Move(next++, i); | |
409 if (reported_errors_->at(i).kind == kBindingPatternProduction && | |
410 errors & ArrowFormalParametersProduction) { | |
411 if (next <= i) { | |
412 Move(next, i); | |
413 reported_errors_->at(next++).kind = | |
414 kArrowFormalParametersProduction; | |
415 } else { | |
416 DCHECK_EQ(next, i+1); | |
417 arrow_index = i; | |
418 } | |
419 } | |
420 } | |
421 if (arrow_index < inner->reported_errors_end_) { | |
422 Add(reported_errors_->at(arrow_index)); | |
423 reported_errors_->at(next++).kind = kArrowFormalParametersProduction; | |
424 } | |
425 } | 398 } |
426 } | 399 } |
427 DCHECK_EQ(reported_errors_end_, next); | 400 inner->reported_errors_begin_ = inner->reported_errors_end_ = |
428 reported_errors_->Rewind(next); | 401 reported_errors_end_; |
429 inner->reported_errors_begin_ = inner->reported_errors_end_ = next; | |
430 } | 402 } |
431 | 403 |
432 V8_INLINE int GetNonPatternBegin() const { return non_pattern_begin_; } | 404 V8_INLINE int GetNonPatternBegin() const { return non_pattern_begin_; } |
433 | 405 |
434 V8_INLINE void Discard() { | 406 V8_INLINE void Discard() { |
435 if (reported_errors_end_ == reported_errors_->length()) { | 407 if (reported_errors_end_ == reported_errors_->length()) { |
436 reported_errors_->Rewind(reported_errors_begin_); | 408 reported_errors_->Rewind(reported_errors_begin_); |
437 reported_errors_end_ = reported_errors_begin_; | 409 reported_errors_end_ = reported_errors_begin_; |
438 } | 410 } |
439 DCHECK_EQ(reported_errors_begin_, reported_errors_end_); | 411 DCHECK_EQ(reported_errors_begin_, reported_errors_end_); |
(...skipping 20 matching lines...) Expand all Loading... | |
460 static Error none; | 432 static Error none; |
461 return none; | 433 return none; |
462 } | 434 } |
463 | 435 |
464 V8_INLINE void Add(const Error& e) { | 436 V8_INLINE void Add(const Error& e) { |
465 DCHECK_EQ(reported_errors_end_, reported_errors_->length()); | 437 DCHECK_EQ(reported_errors_end_, reported_errors_->length()); |
466 reported_errors_->Add(e, zone_); | 438 reported_errors_->Add(e, zone_); |
467 reported_errors_end_++; | 439 reported_errors_end_++; |
468 } | 440 } |
469 | 441 |
470 V8_INLINE void Move(int next, int i) { | |
471 DCHECK_EQ(reported_errors_end_, next); | |
472 DCHECK_LE(next, i); | |
473 DCHECK_LT(i, reported_errors_->length()); | |
474 if (next < i) reported_errors_->at(next++) = reported_errors_->at(i); | |
475 reported_errors_end_++; | |
476 } | |
477 | |
478 Zone* zone_; | 442 Zone* zone_; |
479 ZoneList<typename Traits::Type::Expression>* non_patterns_to_rewrite_; | 443 ZoneList<typename Traits::Type::Expression>* non_patterns_to_rewrite_; |
480 int non_pattern_begin_; | 444 int non_pattern_begin_; |
481 unsigned invalid_productions_ : 14; | 445 unsigned invalid_productions_ : 14; |
482 unsigned function_properties_ : 2; | 446 unsigned function_properties_ : 2; |
483 ZoneList<Error>* reported_errors_; | 447 ZoneList<Error>* reported_errors_; |
484 int reported_errors_begin_; | 448 int reported_errors_begin_; |
485 int reported_errors_end_; | 449 int reported_errors_end_; |
486 DuplicateFinder* duplicate_finder_; | 450 DuplicateFinder* duplicate_finder_; |
487 }; | 451 }; |
488 | 452 |
489 | 453 |
490 #undef ERROR_CODES | 454 #undef ERROR_CODES |
491 | 455 |
492 | 456 |
493 } // namespace internal | 457 } // namespace internal |
494 } // namespace v8 | 458 } // namespace v8 |
495 | 459 |
496 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H | 460 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H |
OLD | NEW |