| 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 patch class String { | 5 patch class String { |
| 6 /* patch */ factory String.fromCharCodes(Iterable<int> charCodes) { | 6 /* patch */ factory String.fromCharCodes(Iterable<int> charCodes) { |
| 7 return _StringBase.createFromCharCodes(charCodes); | 7 return _StringBase.createFromCharCodes(charCodes); |
| 8 } | 8 } |
| 9 | 9 |
| 10 /* patch */ factory String.fromCharCode(int charCode) { | 10 /* patch */ factory String.fromCharCode(int charCode) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 | 47 |
| 48 int get hashCode native "String_getHashCode"; | 48 int get hashCode native "String_getHashCode"; |
| 49 | 49 |
| 50 /** | 50 /** |
| 51 * Create the most efficient string representation for specified | 51 * Create the most efficient string representation for specified |
| 52 * [codePoints]. | 52 * [codePoints]. |
| 53 */ | 53 */ |
| 54 static String createFromCharCodes(Iterable<int> charCodes) { | 54 static String createFromCharCodes(Iterable<int> charCodes) { |
| 55 if (charCodes != null) { | 55 if (charCodes != null) { |
| 56 // TODO(srdjan): Also skip copying of wide typed arrays. | 56 // TODO(srdjan): Also skip copying of wide typed arrays. |
| 57 final ccid = charCodes._cid; | 57 final ccid = ClassID.getID(charCodes); |
| 58 bool isOneByteString = false; | 58 bool isOneByteString = false; |
| 59 if ((ccid != _List._classId) && | 59 if ((ccid != _List._classId) && |
| 60 (ccid != _GrowableList._classId) && | 60 (ccid != _GrowableList._classId) && |
| 61 (ccid != _ImmutableList._classId)) { | 61 (ccid != _ImmutableList._classId)) { |
| 62 if ((charCodes is Uint8List) || (charCodes is Int8List)) { | 62 if ((charCodes is Uint8List) || (charCodes is Int8List)) { |
| 63 isOneByteString = true; | 63 isOneByteString = true; |
| 64 } else { | 64 } else { |
| 65 charCodes = new List<int>.from(charCodes, growable: false); | 65 charCodes = new List<int>.from(charCodes, growable: false); |
| 66 } | 66 } |
| 67 } | 67 } |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 * Convert all objects in [values] to strings and concat them | 503 * Convert all objects in [values] to strings and concat them |
| 504 * into a result string. | 504 * into a result string. |
| 505 */ | 505 */ |
| 506 static String _interpolate(List<String> values) { | 506 static String _interpolate(List<String> values) { |
| 507 final numValues = values.length; | 507 final numValues = values.length; |
| 508 _List stringList = new List<String>(numValues); | 508 _List stringList = new List<String>(numValues); |
| 509 bool isOneByteString = true; | 509 bool isOneByteString = true; |
| 510 int totalLength = 0; | 510 int totalLength = 0; |
| 511 for (int i = 0; i < numValues; i++) { | 511 for (int i = 0; i < numValues; i++) { |
| 512 var s = values[i].toString(); | 512 var s = values[i].toString(); |
| 513 if (isOneByteString && (s._cid == _OneByteString._classId)) { | 513 if (isOneByteString && (ClassID.getID(s) == _OneByteString._classId)) { |
| 514 totalLength += s.length; | 514 totalLength += s.length; |
| 515 } else { | 515 } else { |
| 516 isOneByteString = false; | 516 isOneByteString = false; |
| 517 if (s is! String) { | 517 if (s is! String) { |
| 518 throw new ArgumentError(s); | 518 throw new ArgumentError(s); |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 stringList[i] = s; | 521 stringList[i] = s; |
| 522 } | 522 } |
| 523 if (isOneByteString) { | 523 if (isOneByteString) { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 } | 618 } |
| 619 | 619 |
| 620 // Call this method if not all list elements are known to be OneByteString(s). | 620 // Call this method if not all list elements are known to be OneByteString(s). |
| 621 // 'strings' must be an _List or _GrowableList. | 621 // 'strings' must be an _List or _GrowableList. |
| 622 static String _concatRangeNative(List<String> strings, int start, int end) | 622 static String _concatRangeNative(List<String> strings, int start, int end) |
| 623 native "String_concatRange"; | 623 native "String_concatRange"; |
| 624 } | 624 } |
| 625 | 625 |
| 626 | 626 |
| 627 class _OneByteString extends _StringBase implements String { | 627 class _OneByteString extends _StringBase implements String { |
| 628 static final int _classId = "A"._cid; | 628 static final int _classId = ClassID.getID("A"); |
| 629 | 629 |
| 630 factory _OneByteString._uninstantiable() { | 630 factory _OneByteString._uninstantiable() { |
| 631 throw new UnsupportedError( | 631 throw new UnsupportedError( |
| 632 "_OneByteString can only be allocated by the VM"); | 632 "_OneByteString can only be allocated by the VM"); |
| 633 } | 633 } |
| 634 | 634 |
| 635 int get hashCode native "String_getHashCode"; | 635 int get hashCode native "String_getHashCode"; |
| 636 | 636 |
| 637 bool _isWhitespace(int codePoint) { | 637 bool _isWhitespace(int codePoint) { |
| 638 return _StringBase._isOneByteWhitespace(codePoint); | 638 return _StringBase._isOneByteWhitespace(codePoint); |
| 639 } | 639 } |
| 640 | 640 |
| 641 bool operator ==(Object other) { | 641 bool operator ==(Object other) { |
| 642 return super == other; | 642 return super == other; |
| 643 } | 643 } |
| 644 | 644 |
| 645 String _substringUncheckedNative(int startIndex, int endIndex) | 645 String _substringUncheckedNative(int startIndex, int endIndex) |
| 646 native "OneByteString_substringUnchecked"; | 646 native "OneByteString_substringUnchecked"; |
| 647 | 647 |
| 648 List<String> _splitWithCharCode(int charCode) | 648 List<String> _splitWithCharCode(int charCode) |
| 649 native "OneByteString_splitWithCharCode"; | 649 native "OneByteString_splitWithCharCode"; |
| 650 | 650 |
| 651 List<String> split(Pattern pattern) { | 651 List<String> split(Pattern pattern) { |
| 652 if ((pattern._cid == _OneByteString._classId) && (pattern.length == 1)) { | 652 if ((ClassID.getID(pattern) == _OneByteString._classId) && |
| 653 (pattern.length == 1)) { |
| 653 return _splitWithCharCode(pattern.codeUnitAt(0)); | 654 return _splitWithCharCode(pattern.codeUnitAt(0)); |
| 654 } | 655 } |
| 655 return super.split(pattern); | 656 return super.split(pattern); |
| 656 } | 657 } |
| 657 | 658 |
| 658 // All element of 'strings' must be OneByteStrings. | 659 // All element of 'strings' must be OneByteStrings. |
| 659 static _concatAll(List<String> strings, int totalLength) { | 660 static _concatAll(List<String> strings, int totalLength) { |
| 660 // TODO(srdjan): Improve code below and raise or eliminate the limit. | 661 // TODO(srdjan): Improve code below and raise or eliminate the limit. |
| 661 if (totalLength > 128) { | 662 if (totalLength > 128) { |
| 662 // Native is quicker. | 663 // Native is quicker. |
| 663 return _StringBase._concatRangeNative(strings, 0, strings.length); | 664 return _StringBase._concatRangeNative(strings, 0, strings.length); |
| 664 } | 665 } |
| 665 var res = _OneByteString._allocate(totalLength); | 666 var res = _OneByteString._allocate(totalLength); |
| 666 final stringsLength = strings.length; | 667 final stringsLength = strings.length; |
| 667 int rIx = 0; | 668 int rIx = 0; |
| 668 for (int i = 0; i < stringsLength; i++) { | 669 for (int i = 0; i < stringsLength; i++) { |
| 669 _OneByteString e = strings[i]; | 670 _OneByteString e = strings[i]; |
| 670 final eLength = e.length; | 671 final eLength = e.length; |
| 671 for (int s = 0; s < eLength; s++) { | 672 for (int s = 0; s < eLength; s++) { |
| 672 res._setAt(rIx++, e.codeUnitAt(s)); | 673 res._setAt(rIx++, e.codeUnitAt(s)); |
| 673 } | 674 } |
| 674 } | 675 } |
| 675 return res; | 676 return res; |
| 676 } | 677 } |
| 677 | 678 |
| 678 int indexOf(Pattern pattern, [int start = 0]) { | 679 int indexOf(Pattern pattern, [int start = 0]) { |
| 679 // Specialize for single character pattern. | 680 // Specialize for single character pattern. |
| 680 final pCid = pattern._cid; | 681 final pCid = ClassID.getID(pattern); |
| 681 if ((pCid == _OneByteString._classId) || | 682 if ((pCid == _OneByteString._classId) || |
| 682 (pCid == _TwoByteString._classId) || | 683 (pCid == _TwoByteString._classId) || |
| 683 (pCid == _ExternalOneByteString._classId)) { | 684 (pCid == _ExternalOneByteString._classId)) { |
| 684 final len = this.length; | 685 final len = this.length; |
| 685 if ((pattern.length == 1) && (start >= 0) && (start < len)) { | 686 if ((pattern.length == 1) && (start >= 0) && (start < len)) { |
| 686 final patternCu0 = pattern.codeUnitAt(0); | 687 final patternCu0 = pattern.codeUnitAt(0); |
| 687 if (patternCu0 > 0xFF) { | 688 if (patternCu0 > 0xFF) { |
| 688 return -1; | 689 return -1; |
| 689 } | 690 } |
| 690 for (int i = start; i < len; i++) { | 691 for (int i = start; i < len; i++) { |
| 691 if (this.codeUnitAt(i) == patternCu0) { | 692 if (this.codeUnitAt(i) == patternCu0) { |
| 692 return i; | 693 return i; |
| 693 } | 694 } |
| 694 } | 695 } |
| 695 return -1; | 696 return -1; |
| 696 } | 697 } |
| 697 } | 698 } |
| 698 return super.indexOf(pattern, start); | 699 return super.indexOf(pattern, start); |
| 699 } | 700 } |
| 700 | 701 |
| 701 bool contains(Pattern pattern, [int start = 0]) { | 702 bool contains(Pattern pattern, [int start = 0]) { |
| 702 final pCid = pattern._cid; | 703 final pCid = ClassID.getID(pattern); |
| 703 if ((pCid == _OneByteString._classId) || | 704 if ((pCid == _OneByteString._classId) || |
| 704 (pCid == _TwoByteString._classId) || | 705 (pCid == _TwoByteString._classId) || |
| 705 (pCid == _ExternalOneByteString._classId)) { | 706 (pCid == _ExternalOneByteString._classId)) { |
| 706 final len = this.length; | 707 final len = this.length; |
| 707 if ((pattern.length == 1) && (start >= 0) && (start < len)) { | 708 if ((pattern.length == 1) && (start >= 0) && (start < len)) { |
| 708 final patternCu0 = pattern.codeUnitAt(0); | 709 final patternCu0 = pattern.codeUnitAt(0); |
| 709 if (patternCu0 > 0xFF) { | 710 if (patternCu0 > 0xFF) { |
| 710 return false; | 711 return false; |
| 711 } | 712 } |
| 712 for (int i = start; i < len; i++) { | 713 for (int i = start; i < len; i++) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 729 int index = 0; | 730 int index = 0; |
| 730 for (int i = 0; i < times; i ++) { | 731 for (int i = 0; i < times; i ++) { |
| 731 for (int j = 0; j < length; j++) { | 732 for (int j = 0; j < length; j++) { |
| 732 result._setAt(index++, this.codeUnitAt(j)); | 733 result._setAt(index++, this.codeUnitAt(j)); |
| 733 } | 734 } |
| 734 } | 735 } |
| 735 return result; | 736 return result; |
| 736 } | 737 } |
| 737 | 738 |
| 738 String padLeft(int width, [String padding = ' ']) { | 739 String padLeft(int width, [String padding = ' ']) { |
| 739 int padCid = padding._cid; | 740 int padCid = ClassID.getID(padding); |
| 740 if (padCid != _OneByteString._classId && | 741 if (padCid != _OneByteString._classId && |
| 741 padCid != _ExternalOneByteString._classId) { | 742 padCid != _ExternalOneByteString._classId) { |
| 742 return super.padLeft(width, padding); | 743 return super.padLeft(width, padding); |
| 743 } | 744 } |
| 744 int length = this.length; | 745 int length = this.length; |
| 745 int delta = width - length; | 746 int delta = width - length; |
| 746 if (delta <= 0) return this; | 747 if (delta <= 0) return this; |
| 747 int padLength = padding.length; | 748 int padLength = padding.length; |
| 748 int resultLength = padLength * delta + length; | 749 int resultLength = padLength * delta + length; |
| 749 _OneByteString result = _OneByteString._allocate(resultLength); | 750 _OneByteString result = _OneByteString._allocate(resultLength); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 760 } | 761 } |
| 761 } | 762 } |
| 762 } | 763 } |
| 763 for (int i = 0; i < length; i++) { | 764 for (int i = 0; i < length; i++) { |
| 764 result._setAt(index++, this.codeUnitAt(i)); | 765 result._setAt(index++, this.codeUnitAt(i)); |
| 765 } | 766 } |
| 766 return result; | 767 return result; |
| 767 } | 768 } |
| 768 | 769 |
| 769 String padRight(int width, [String padding = ' ']) { | 770 String padRight(int width, [String padding = ' ']) { |
| 770 int padCid = padding._cid; | 771 int padCid = ClassID.getID(padding); |
| 771 if (padCid != _OneByteString._classId && | 772 if (padCid != _OneByteString._classId && |
| 772 padCid != _ExternalOneByteString._classId) { | 773 padCid != _ExternalOneByteString._classId) { |
| 773 return super.padRight(width, padding); | 774 return super.padRight(width, padding); |
| 774 } | 775 } |
| 775 int length = this.length; | 776 int length = this.length; |
| 776 int delta = width - length; | 777 int delta = width - length; |
| 777 if (delta <= 0) return this; | 778 if (delta <= 0) return this; |
| 778 int padLength = padding.length; | 779 int padLength = padding.length; |
| 779 int resultLength = length + padLength * delta; | 780 int resultLength = length + padLength * delta; |
| 780 _OneByteString result = _OneByteString._allocate(resultLength); | 781 _OneByteString result = _OneByteString._allocate(resultLength); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 static _OneByteString _allocateFromOneByteList(List<int> list) | 900 static _OneByteString _allocateFromOneByteList(List<int> list) |
| 900 native "OneByteString_allocateFromOneByteList"; | 901 native "OneByteString_allocateFromOneByteList"; |
| 901 | 902 |
| 902 // This is internal helper method. Code point value must be a valid | 903 // This is internal helper method. Code point value must be a valid |
| 903 // Latin1 value (0..0xFF), index must be valid. | 904 // Latin1 value (0..0xFF), index must be valid. |
| 904 void _setAt(int index, int codePoint) native "OneByteString_setAt"; | 905 void _setAt(int index, int codePoint) native "OneByteString_setAt"; |
| 905 } | 906 } |
| 906 | 907 |
| 907 | 908 |
| 908 class _TwoByteString extends _StringBase implements String { | 909 class _TwoByteString extends _StringBase implements String { |
| 909 static final int _classId = "\u{FFFF}"._cid; | 910 static final int _classId = ClassID.getID("\u{FFFF}"); |
| 910 | 911 |
| 911 factory _TwoByteString._uninstantiable() { | 912 factory _TwoByteString._uninstantiable() { |
| 912 throw new UnsupportedError( | 913 throw new UnsupportedError( |
| 913 "_TwoByteString can only be allocated by the VM"); | 914 "_TwoByteString can only be allocated by the VM"); |
| 914 } | 915 } |
| 915 | 916 |
| 916 bool _isWhitespace(int codePoint) { | 917 bool _isWhitespace(int codePoint) { |
| 917 return _StringBase._isTwoByteWhitespace(codePoint); | 918 return _StringBase._isTwoByteWhitespace(codePoint); |
| 918 } | 919 } |
| 919 | 920 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 994 class _CodeUnits extends Object with ListMixin<int>, | 995 class _CodeUnits extends Object with ListMixin<int>, |
| 995 UnmodifiableListMixin<int> { | 996 UnmodifiableListMixin<int> { |
| 996 /** The string that this is the code units of. */ | 997 /** The string that this is the code units of. */ |
| 997 String _string; | 998 String _string; |
| 998 | 999 |
| 999 _CodeUnits(this._string); | 1000 _CodeUnits(this._string); |
| 1000 | 1001 |
| 1001 int get length => _string.length; | 1002 int get length => _string.length; |
| 1002 int operator[](int i) => _string.codeUnitAt(i); | 1003 int operator[](int i) => _string.codeUnitAt(i); |
| 1003 } | 1004 } |
| OLD | NEW |