Index: sdk/lib/_internal/compiler/implementation/lib/interceptors.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart |
index 2fc25a6fb80f706916b405d3a7fa2ea9a99b107f..b488693453b12b583c7aae1a4a63b054099d448d 100644 |
--- a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart |
+++ b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart |
@@ -90,13 +90,28 @@ iterator(receiver) { |
return UNINTERCEPTED(receiver.iterator()); |
} |
-charCodeAt(var receiver, int index) { |
+codeUnitAt(var receiver, int index) { |
if (receiver is String) { |
if (index is !num) throw new ArgumentError(index); |
if (index < 0) throw new RangeError.value(index); |
if (index >= receiver.length) throw new RangeError.value(index); |
return JS('int', r'#.charCodeAt(#)', receiver, index); |
} else { |
+ return UNINTERCEPTED(receiver.codeUnitAt(index)); |
+ } |
+} |
+ |
+charCodeAt(var receiver, int index) { |
+ if (receiver is String) { |
+ if (index is !num) throw new ArgumentError(index); |
+ if (index < 0) throw new RangeError.value(index); |
+ if (index >= receiver.length) throw new RangeError.value(index); |
+ int codeUnit = JS('int', r'#.charCodeAt(#)', receiver, index); |
+ if (codeUnit < 0xd800 || codeUnit >= 0xe000) return codeUnit; |
+ if (index + 1 == receiver.length) return codeUnit; |
+ int codeUnit2 = JS('int', r'#.charCodeAt(#)', receiver, index + 1); |
+ return 0x10000 + ((codeUnit & 0x3ff) << 10) + (codeUnit2 & 0x3ff); |
+ } else { |
return UNINTERCEPTED(receiver.charCodeAt(index)); |
} |
} |
@@ -646,12 +661,24 @@ get$hashCode(receiver) { |
return 0x1fffffff & (hash + JS('int', r'# << #', 0x00003fff & hash, 15)); |
} |
+get$codeUnits(receiver) { |
+ if (receiver is !String) return UNINTERCEPTED(receiver.codeUnits); |
+ int len = receiver.length; |
+ List<int> result = new List<int>(len); |
+ for (int i = 0; i < len; i++) { |
+ result[i] = JS('int', r'#.charCodeAt(#)', receiver, i); |
floitsch
2012/11/08 15:28:21
why not
result[i] = receiver.codeUnitAt(i);
?
erikcorry
2012/11/15 13:28:25
Unfortunately the optimizer can't optimize that aw
|
+ } |
+ return result; |
+} |
+ |
get$charCodes(receiver) { |
if (receiver is !String) return UNINTERCEPTED(receiver.charCodes); |
int len = receiver.length; |
List<int> result = new List<int>(len); |
- for (int i = 0; i < len; i++) { |
- result[i] = receiver.charCodeAt(i); |
+ for (int i = 0, j = 0; i < len; i++, j++) { |
+ int code = receiver.charCodeAt(i); |
+ if (code >= 0x10000) i++; |
+ result[j] = code; |
} |
return result; |
} |