OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/scanner.h" | 5 #include "vm/scanner.h" |
6 | 6 |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
8 #include "vm/flags.h" | 8 #include "vm/flags.h" |
9 #include "vm/object.h" | 9 #include "vm/object.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
491 } | 491 } |
492 if (is_valid && | 492 if (is_valid && |
493 ((*code_point > 0x10FFFF) || | 493 ((*code_point > 0x10FFFF) || |
494 ((*code_point & 0xFFFFF800) == 0xD800))) { | 494 ((*code_point & 0xFFFFF800) == 0xD800))) { |
495 ErrorMsg("invalid code point"); | 495 ErrorMsg("invalid code point"); |
496 } | 496 } |
497 } | 497 } |
498 | 498 |
499 | 499 |
500 void Scanner::ScanLiteralStringChars(bool is_raw) { | 500 void Scanner::ScanLiteralStringChars(bool is_raw) { |
501 GrowableArray<uint32_t> string_chars(64); | 501 GrowableArray<uint16_t> string_chars(64); |
502 | 502 |
503 ASSERT(IsScanningString()); | 503 ASSERT(IsScanningString()); |
504 // We are at the first character of a string literal piece. A string literal | 504 // We are at the first character of a string literal piece. A string literal |
505 // can be broken up into multiple pieces by string interpolation. | 505 // can be broken up into multiple pieces by string interpolation. |
506 while (true) { | 506 while (true) { |
507 if ((c0_ == '\0') || ((c0_ == '\n') && !string_is_multiline_)) { | 507 if ((c0_ == '\0') || ((c0_ == '\n') && !string_is_multiline_)) { |
508 ErrorMsg("unterminated string literal"); | 508 ErrorMsg("unterminated string literal"); |
509 EndStringLiteral(); | 509 EndStringLiteral(); |
510 return; | 510 return; |
511 } | 511 } |
(...skipping 15 matching lines...) Expand all Loading... | |
527 escape_char = '\t'; | 527 escape_char = '\t'; |
528 break; | 528 break; |
529 case 'b': | 529 case 'b': |
530 escape_char = '\b'; | 530 escape_char = '\b'; |
531 break; | 531 break; |
532 case 'v': | 532 case 'v': |
533 escape_char = '\v'; | 533 escape_char = '\v'; |
534 break; | 534 break; |
535 case 'u': | 535 case 'u': |
536 case 'x': { | 536 case 'x': { |
537 ScanEscapedCodePoint(&escape_char); | 537 uint32_t ch; |
538 ScanEscapedCodePoint(&ch); | |
539 int32_t code_point = ch; | |
540 if (code_point > Utf16::kMaxCodeUnit) { | |
541 string_chars.Add(Utf16::LeadFromCodePoint(code_point)); | |
542 escape_char = Utf16::TrailFromCodePoint(code_point); | |
543 } else { | |
544 escape_char = code_point; | |
545 } | |
538 break; | 546 break; |
539 } | 547 } |
540 default: | 548 default: |
541 if ((c0_ == '\0') || ((c0_ == '\n') && !string_is_multiline_)) { | 549 if ((c0_ == '\0') || ((c0_ == '\n') && !string_is_multiline_)) { |
542 ErrorMsg("unterminated string literal"); | 550 ErrorMsg("unterminated string literal"); |
543 EndStringLiteral(); | 551 EndStringLiteral(); |
544 return; | 552 return; |
545 } | 553 } |
546 escape_char = c0_; | 554 escape_char = c0_; |
547 break; | 555 break; |
548 } | 556 } |
549 string_chars.Add(escape_char); | 557 string_chars.Add(escape_char); |
550 } else if (c0_ == '$' && !is_raw) { | 558 } else if (c0_ == '$' && !is_raw) { |
551 // Scanned a string piece. | 559 // Scanned a string piece. |
552 ASSERT(string_chars.data() != NULL); | 560 ASSERT(string_chars.data() != NULL); |
553 // Strings are canonicalized: Allocate a symbol. | 561 // Strings are canonicalized: Allocate a symbol. |
554 current_token_.literal = &String::ZoneHandle( | 562 current_token_.literal = &String::ZoneHandle( |
555 Symbols::New(string_chars.data(), string_chars.length())); | 563 Symbols::New(string_chars.data(), string_chars.length())); |
siva
2012/11/20 00:48:00
Is the change above necessary considering that thi
| |
556 // Preserve error tokens. | 564 // Preserve error tokens. |
557 if (current_token_.kind != Token::kERROR) { | 565 if (current_token_.kind != Token::kERROR) { |
558 current_token_.kind = Token::kSTRING; | 566 current_token_.kind = Token::kSTRING; |
559 } | 567 } |
560 return; | 568 return; |
561 } else if (c0_ == string_delimiter_) { | 569 } else if (c0_ == string_delimiter_) { |
562 // Check if we are at the end of the string literal. | 570 // Check if we are at the end of the string literal. |
563 if (!string_is_multiline_ || | 571 if (!string_is_multiline_ || |
564 ((LookaheadChar(1) == string_delimiter_) && | 572 ((LookaheadChar(1) == string_delimiter_) && |
565 (LookaheadChar(2) == string_delimiter_))) { | 573 (LookaheadChar(2) == string_delimiter_))) { |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
952 "%c%#"Px"", kPrivateKeySeparator, key_value); | 960 "%c%#"Px"", kPrivateKeySeparator, key_value); |
953 const String& result = String::Handle(String::New(private_key, Heap::kOld)); | 961 const String& result = String::Handle(String::New(private_key, Heap::kOld)); |
954 return result.raw(); | 962 return result.raw(); |
955 } | 963 } |
956 | 964 |
957 | 965 |
958 void Scanner::InitOnce() { | 966 void Scanner::InitOnce() { |
959 } | 967 } |
960 | 968 |
961 } // namespace dart | 969 } // namespace dart |
OLD | NEW |