OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 // Features shared by parsing and pre-parsing scanners. | 5 // Features shared by parsing and pre-parsing scanners. |
6 | 6 |
7 #ifndef V8_SCANNER_H_ | 7 #ifndef V8_SCANNER_H_ |
8 #define V8_SCANNER_H_ | 8 #define V8_SCANNER_H_ |
9 | 9 |
10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 bool literal_contains_escapes() const { | 383 bool literal_contains_escapes() const { |
384 Location location = current_.location; | 384 Location location = current_.location; |
385 int source_length = (location.end_pos - location.beg_pos); | 385 int source_length = (location.end_pos - location.beg_pos); |
386 if (current_.token == Token::STRING) { | 386 if (current_.token == Token::STRING) { |
387 // Subtract delimiters. | 387 // Subtract delimiters. |
388 source_length -= 2; | 388 source_length -= 2; |
389 } | 389 } |
390 return current_.literal_chars->length() != source_length; | 390 return current_.literal_chars->length() != source_length; |
391 } | 391 } |
392 bool is_literal_contextual_keyword(Vector<const char> keyword) { | 392 bool is_literal_contextual_keyword(Vector<const char> keyword) { |
393 DCHECK_NOT_NULL(current_.literal_chars); | 393 DCHECK(current_.literal_chars); |
394 return current_.literal_chars->is_contextual_keyword(keyword); | 394 return current_.literal_chars->is_contextual_keyword(keyword); |
395 } | 395 } |
396 bool is_next_contextual_keyword(Vector<const char> keyword) { | 396 bool is_next_contextual_keyword(Vector<const char> keyword) { |
397 DCHECK_NOT_NULL(next_.literal_chars); | 397 DCHECK(next_.literal_chars); |
398 return next_.literal_chars->is_contextual_keyword(keyword); | 398 return next_.literal_chars->is_contextual_keyword(keyword); |
399 } | 399 } |
400 | 400 |
401 const AstRawString* CurrentSymbol(AstValueFactory* ast_value_factory); | 401 const AstRawString* CurrentSymbol(AstValueFactory* ast_value_factory); |
402 const AstRawString* NextSymbol(AstValueFactory* ast_value_factory); | 402 const AstRawString* NextSymbol(AstValueFactory* ast_value_factory); |
403 const AstRawString* CurrentRawSymbol(AstValueFactory* ast_value_factory); | 403 const AstRawString* CurrentRawSymbol(AstValueFactory* ast_value_factory); |
404 | 404 |
405 double DoubleValue(); | 405 double DoubleValue(); |
406 bool LiteralMatches(const char* data, int length, bool allow_escapes = true) { | 406 bool LiteralMatches(const char* data, int length, bool allow_escapes = true) { |
407 if (is_literal_one_byte() && | 407 if (is_literal_one_byte() && |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 free_buffer->Reset(); | 529 free_buffer->Reset(); |
530 next_.literal_chars = free_buffer; | 530 next_.literal_chars = free_buffer; |
531 } | 531 } |
532 | 532 |
533 inline void StartRawLiteral() { | 533 inline void StartRawLiteral() { |
534 raw_literal_buffer_.Reset(); | 534 raw_literal_buffer_.Reset(); |
535 next_.raw_literal_chars = &raw_literal_buffer_; | 535 next_.raw_literal_chars = &raw_literal_buffer_; |
536 } | 536 } |
537 | 537 |
538 INLINE(void AddLiteralChar(uc32 c)) { | 538 INLINE(void AddLiteralChar(uc32 c)) { |
539 DCHECK_NOT_NULL(next_.literal_chars); | 539 DCHECK(next_.literal_chars); |
540 next_.literal_chars->AddChar(c); | 540 next_.literal_chars->AddChar(c); |
541 } | 541 } |
542 | 542 |
543 INLINE(void AddRawLiteralChar(uc32 c)) { | 543 INLINE(void AddRawLiteralChar(uc32 c)) { |
544 DCHECK_NOT_NULL(next_.raw_literal_chars); | 544 DCHECK(next_.raw_literal_chars); |
545 next_.raw_literal_chars->AddChar(c); | 545 next_.raw_literal_chars->AddChar(c); |
546 } | 546 } |
547 | 547 |
548 INLINE(void ReduceRawLiteralLength(int delta)) { | 548 INLINE(void ReduceRawLiteralLength(int delta)) { |
549 DCHECK_NOT_NULL(next_.raw_literal_chars); | 549 DCHECK(next_.raw_literal_chars); |
550 next_.raw_literal_chars->ReduceLength(delta); | 550 next_.raw_literal_chars->ReduceLength(delta); |
551 } | 551 } |
552 | 552 |
553 // Stops scanning of a literal and drop the collected characters, | 553 // Stops scanning of a literal and drop the collected characters, |
554 // e.g., due to an encountered error. | 554 // e.g., due to an encountered error. |
555 inline void DropLiteral() { | 555 inline void DropLiteral() { |
556 next_.literal_chars = NULL; | 556 next_.literal_chars = NULL; |
557 next_.raw_literal_chars = NULL; | 557 next_.raw_literal_chars = NULL; |
558 } | 558 } |
559 | 559 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 } | 605 } |
606 | 606 |
607 // Returns the literal string, if any, for the current token (the | 607 // Returns the literal string, if any, for the current token (the |
608 // token last returned by Next()). The string is 0-terminated. | 608 // token last returned by Next()). The string is 0-terminated. |
609 // Literal strings are collected for identifiers, strings, numbers as well | 609 // Literal strings are collected for identifiers, strings, numbers as well |
610 // as for template literals. For template literals we also collect the raw | 610 // as for template literals. For template literals we also collect the raw |
611 // form. | 611 // form. |
612 // These functions only give the correct result if the literal was scanned | 612 // These functions only give the correct result if the literal was scanned |
613 // when a LiteralScope object is alive. | 613 // when a LiteralScope object is alive. |
614 Vector<const uint8_t> literal_one_byte_string() { | 614 Vector<const uint8_t> literal_one_byte_string() { |
615 DCHECK_NOT_NULL(current_.literal_chars); | 615 DCHECK(current_.literal_chars); |
616 return current_.literal_chars->one_byte_literal(); | 616 return current_.literal_chars->one_byte_literal(); |
617 } | 617 } |
618 Vector<const uint16_t> literal_two_byte_string() { | 618 Vector<const uint16_t> literal_two_byte_string() { |
619 DCHECK_NOT_NULL(current_.literal_chars); | 619 DCHECK(current_.literal_chars); |
620 return current_.literal_chars->two_byte_literal(); | 620 return current_.literal_chars->two_byte_literal(); |
621 } | 621 } |
622 bool is_literal_one_byte() { | 622 bool is_literal_one_byte() { |
623 DCHECK_NOT_NULL(current_.literal_chars); | 623 DCHECK(current_.literal_chars); |
624 return current_.literal_chars->is_one_byte(); | 624 return current_.literal_chars->is_one_byte(); |
625 } | 625 } |
626 int literal_length() const { | 626 int literal_length() const { |
627 DCHECK_NOT_NULL(current_.literal_chars); | 627 DCHECK(current_.literal_chars); |
628 return current_.literal_chars->length(); | 628 return current_.literal_chars->length(); |
629 } | 629 } |
630 // Returns the literal string for the next token (the token that | 630 // Returns the literal string for the next token (the token that |
631 // would be returned if Next() were called). | 631 // would be returned if Next() were called). |
632 Vector<const uint8_t> next_literal_one_byte_string() { | 632 Vector<const uint8_t> next_literal_one_byte_string() { |
633 DCHECK_NOT_NULL(next_.literal_chars); | 633 DCHECK(next_.literal_chars); |
634 return next_.literal_chars->one_byte_literal(); | 634 return next_.literal_chars->one_byte_literal(); |
635 } | 635 } |
636 Vector<const uint16_t> next_literal_two_byte_string() { | 636 Vector<const uint16_t> next_literal_two_byte_string() { |
637 DCHECK_NOT_NULL(next_.literal_chars); | 637 DCHECK(next_.literal_chars); |
638 return next_.literal_chars->two_byte_literal(); | 638 return next_.literal_chars->two_byte_literal(); |
639 } | 639 } |
640 bool is_next_literal_one_byte() { | 640 bool is_next_literal_one_byte() { |
641 DCHECK_NOT_NULL(next_.literal_chars); | 641 DCHECK(next_.literal_chars); |
642 return next_.literal_chars->is_one_byte(); | 642 return next_.literal_chars->is_one_byte(); |
643 } | 643 } |
644 Vector<const uint8_t> raw_literal_one_byte_string() { | 644 Vector<const uint8_t> raw_literal_one_byte_string() { |
645 DCHECK_NOT_NULL(current_.raw_literal_chars); | 645 DCHECK(current_.raw_literal_chars); |
646 return current_.raw_literal_chars->one_byte_literal(); | 646 return current_.raw_literal_chars->one_byte_literal(); |
647 } | 647 } |
648 Vector<const uint16_t> raw_literal_two_byte_string() { | 648 Vector<const uint16_t> raw_literal_two_byte_string() { |
649 DCHECK_NOT_NULL(current_.raw_literal_chars); | 649 DCHECK(current_.raw_literal_chars); |
650 return current_.raw_literal_chars->two_byte_literal(); | 650 return current_.raw_literal_chars->two_byte_literal(); |
651 } | 651 } |
652 bool is_raw_literal_one_byte() { | 652 bool is_raw_literal_one_byte() { |
653 DCHECK_NOT_NULL(current_.raw_literal_chars); | 653 DCHECK(current_.raw_literal_chars); |
654 return current_.raw_literal_chars->is_one_byte(); | 654 return current_.raw_literal_chars->is_one_byte(); |
655 } | 655 } |
656 | 656 |
657 template <bool capture_raw> | 657 template <bool capture_raw> |
658 uc32 ScanHexNumber(int expected_length); | 658 uc32 ScanHexNumber(int expected_length); |
659 // Scan a number of any length but not bigger than max_value. For example, the | 659 // Scan a number of any length but not bigger than max_value. For example, the |
660 // number can be 000000001, so it's very long in characters but its value is | 660 // number can be 000000001, so it's very long in characters but its value is |
661 // small. | 661 // small. |
662 template <bool capture_raw> | 662 template <bool capture_raw> |
663 uc32 ScanUnlimitedLengthHexNumber(int max_value); | 663 uc32 ScanUnlimitedLengthHexNumber(int max_value); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
743 bool harmony_classes_; | 743 bool harmony_classes_; |
744 // Whether we scan TEMPLATE_SPAN and TEMPLATE_TAIL | 744 // Whether we scan TEMPLATE_SPAN and TEMPLATE_TAIL |
745 bool harmony_templates_; | 745 bool harmony_templates_; |
746 // Whether we allow \u{xxxxx}. | 746 // Whether we allow \u{xxxxx}. |
747 bool harmony_unicode_; | 747 bool harmony_unicode_; |
748 }; | 748 }; |
749 | 749 |
750 } } // namespace v8::internal | 750 } } // namespace v8::internal |
751 | 751 |
752 #endif // V8_SCANNER_H_ | 752 #endif // V8_SCANNER_H_ |
OLD | NEW |