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 [int start = 0, int end]) { |
8 return _StringBase.createFromCharCodes(charCodes, start, end); | |
8 } | 9 } |
9 | 10 |
10 /* patch */ factory String.fromCharCode(int charCode) { | 11 /* patch */ factory String.fromCharCode(int charCode) { |
11 if (charCode >= 0) { | 12 if (charCode >= 0) { |
12 if (charCode <= 0xff) { | 13 if (charCode <= 0xff) { |
13 return _OneByteString._allocate(1).._setAt(0, charCode); | 14 return _OneByteString._allocate(1).._setAt(0, charCode); |
14 } | 15 } |
15 if (charCode <= 0xffff) { | 16 if (charCode <= 0xffff) { |
16 return _StringBase._createFromCodePoints(new _List(1)..[0] = charCode); | 17 return _StringBase._createFromCodePoints(new _List(1)..[0] = charCode, |
18 0, 1); | |
17 } | 19 } |
18 if (charCode <= 0x10ffff) { | 20 if (charCode <= 0x10ffff) { |
19 var low = 0xDC00 | (charCode & 0x3ff); | 21 var low = 0xDC00 | (charCode & 0x3ff); |
20 int bits = charCode - 0x10000; | 22 int bits = charCode - 0x10000; |
21 var high = 0xD800 | (bits >> 10); | 23 var high = 0xD800 | (bits >> 10); |
22 return _StringBase._createFromCodePoints(new _List(2)..[0] = high | 24 return _StringBase._createFromCodePoints(new _List(2)..[0] = high |
23 ..[1] = low); | 25 ..[1] = low, |
26 0, 2); | |
24 } | 27 } |
25 } | 28 } |
26 throw new RangeError.range(charCode, 0, 0x10ffff); | 29 throw new RangeError.range(charCode, 0, 0x10ffff); |
27 } | 30 } |
28 | 31 |
29 /* patch */ const factory String.fromEnvironment(String name, | 32 /* patch */ const factory String.fromEnvironment(String name, |
30 {String defaultValue}) | 33 {String defaultValue}) |
31 native "String_fromEnvironment"; | 34 native "String_fromEnvironment"; |
32 } | 35 } |
33 | 36 |
(...skipping 10 matching lines...) Expand all Loading... | |
44 } | 47 } |
45 | 48 |
46 Type get runtimeType => String; | 49 Type get runtimeType => String; |
47 | 50 |
48 int get hashCode native "String_getHashCode"; | 51 int get hashCode native "String_getHashCode"; |
49 | 52 |
50 /** | 53 /** |
51 * Create the most efficient string representation for specified | 54 * Create the most efficient string representation for specified |
52 * [codePoints]. | 55 * [codePoints]. |
53 */ | 56 */ |
54 static String createFromCharCodes(Iterable<int> charCodes) { | 57 static String createFromCharCodes(Iterable<int> charCodes, |
58 int start, int end) { | |
55 if (charCodes != null) { | 59 if (charCodes != null) { |
56 // TODO(srdjan): Also skip copying of wide typed arrays. | 60 // TODO(srdjan): Also skip copying of wide typed arrays. |
57 final ccid = ClassID.getID(charCodes); | 61 final ccid = ClassID.getID(charCodes); |
58 bool isOneByteString = false; | 62 bool isOneByteString = false; |
59 if ((ccid != ClassID.cidArray) && | 63 if ((ccid != ClassID.cidArray) && |
60 (ccid != ClassID.cidGrowableObjectArray) && | 64 (ccid != ClassID.cidGrowableObjectArray) && |
61 (ccid != ClassID.cidImmutableArray)) { | 65 (ccid != ClassID.cidImmutableArray)) { |
62 if ((charCodes is Uint8List) || (charCodes is Int8List)) { | 66 if ((charCodes is Uint8List) || (charCodes is Int8List)) { |
63 isOneByteString = true; | 67 isOneByteString = true; |
64 } else { | 68 } else { |
65 charCodes = new List<int>.from(charCodes, growable: false); | 69 charCodes = new List.from(charCodes, growable: false); |
66 } | 70 } |
67 } | 71 } |
68 final len = charCodes.length; | 72 if (start < 0) start = 0; |
Søren Gjesse
2014/08/29 11:16:03
Why is this not an ArgumentError?
Lasse Reichstein Nielsen
2014/09/02 07:57:04
I'm feeling generous? :)
Probably should be an err
| |
73 if (end == null || end > charCodes.length) { | |
74 end = charCodes.length; | |
75 } | |
76 if (end <= start) return ""; | |
77 final len = end - start; | |
69 if (!isOneByteString) { | 78 if (!isOneByteString) { |
70 for (int i = 0; i < len; i++) { | 79 for (int i = start; i < end; i++) { |
71 int e = charCodes[i]; | 80 int e = charCodes[i]; |
72 if (e is! _Smi) throw new ArgumentError(e); | 81 if (e is! _Smi) throw new ArgumentError(e); |
73 // Is e Latin1? | 82 // Is e Latin1? |
74 if ((e < 0) || (e > 0xFF)) { | 83 if ((e < 0) || (e > 0xFF)) { |
75 return _createFromCodePoints(charCodes); | 84 return _createFromCodePoints(charCodes, start, end); |
76 } | 85 } |
77 } | 86 } |
78 } | 87 } |
79 // Allocate a one byte string. When the list is 128 entries or longer, | 88 // Allocate a one byte string. When the list is 128 entries or longer, |
80 // it's faster to perform a runtime-call. | 89 // it's faster to perform a runtime-call. |
81 if (len >= 128) { | 90 if (len >= 128) { |
82 return _OneByteString._allocateFromOneByteList(charCodes); | 91 return _OneByteString._allocateFromOneByteList(charCodes, start, end); |
83 } | 92 } |
84 var s = _OneByteString._allocate(len); | 93 var s = _OneByteString._allocate(len); |
85 for (int i = 0; i < len; i++) { | 94 for (int i = 0; i < len; i++) { |
86 s._setAt(i, charCodes[i]); | 95 s._setAt(i, charCodes[start + i]); |
87 } | 96 } |
88 return s; | 97 return s; |
89 } | 98 } |
90 return _createFromCodePoints(charCodes); | 99 // charCodes is null. |
100 throw new ArgumentError(charCodes); | |
91 } | 101 } |
92 | 102 |
93 static String _createFromCodePoints(List<int> codePoints) | 103 static String _createFromCodePoints(List<int> codePoints, int start, int end) |
94 native "StringBase_createFromCodePoints"; | 104 native "StringBase_createFromCodePoints"; |
95 | 105 |
96 String operator [](int index) native "String_charAt"; | 106 String operator [](int index) native "String_charAt"; |
97 | 107 |
98 int codeUnitAt(int index) native "String_codeUnitAt"; | 108 int codeUnitAt(int index) native "String_codeUnitAt"; |
99 | 109 |
100 int get length native "String_getLength"; | 110 int get length native "String_getLength"; |
101 | 111 |
102 bool get isEmpty { | 112 bool get isEmpty { |
103 return this.length == 0; | 113 return this.length == 0; |
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
909 return result; | 919 return result; |
910 } | 920 } |
911 return this; | 921 return this; |
912 } | 922 } |
913 | 923 |
914 // Allocates a string of given length, expecting its content to be | 924 // Allocates a string of given length, expecting its content to be |
915 // set using _setAt. | 925 // set using _setAt. |
916 static _OneByteString _allocate(int length) native "OneByteString_allocate"; | 926 static _OneByteString _allocate(int length) native "OneByteString_allocate"; |
917 | 927 |
918 | 928 |
919 static _OneByteString _allocateFromOneByteList(List<int> list) | 929 static _OneByteString _allocateFromOneByteList(List<int> list, |
930 int start, int end) | |
920 native "OneByteString_allocateFromOneByteList"; | 931 native "OneByteString_allocateFromOneByteList"; |
921 | 932 |
922 // This is internal helper method. Code point value must be a valid | 933 // This is internal helper method. Code point value must be a valid |
923 // Latin1 value (0..0xFF), index must be valid. | 934 // Latin1 value (0..0xFF), index must be valid. |
924 void _setAt(int index, int codePoint) native "OneByteString_setAt"; | 935 void _setAt(int index, int codePoint) native "OneByteString_setAt"; |
925 } | 936 } |
926 | 937 |
927 | 938 |
928 class _TwoByteString extends _StringBase implements String { | 939 class _TwoByteString extends _StringBase implements String { |
929 factory _TwoByteString._uninstantiable() { | 940 factory _TwoByteString._uninstantiable() { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1010 class _CodeUnits extends Object with ListMixin<int>, | 1021 class _CodeUnits extends Object with ListMixin<int>, |
1011 UnmodifiableListMixin<int> { | 1022 UnmodifiableListMixin<int> { |
1012 /** The string that this is the code units of. */ | 1023 /** The string that this is the code units of. */ |
1013 String _string; | 1024 String _string; |
1014 | 1025 |
1015 _CodeUnits(this._string); | 1026 _CodeUnits(this._string); |
1016 | 1027 |
1017 int get length => _string.length; | 1028 int get length => _string.length; |
1018 int operator[](int i) => _string.codeUnitAt(i); | 1029 int operator[](int i) => _string.codeUnitAt(i); |
1019 } | 1030 } |
OLD | NEW |