| Index: sdk/lib/_internal/compiler/js_lib/js_helper.dart
|
| diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
|
| index 313d2cb43c257ae90db0aa31a2a5eb0597f33a01..4cce9fd08b3259ce6a3717ab69e7bb19face72a9 100644
|
| --- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart
|
| +++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
|
| @@ -60,6 +60,8 @@ import 'dart:_interceptors';
|
| import 'dart:_internal' as _symbol_dev;
|
| import 'dart:_internal' show MappedIterable;
|
|
|
| +import 'dart:_native_typed_data';
|
| +
|
| import 'dart:_js_names' show
|
| extractKeys,
|
| mangledNames,
|
| @@ -764,19 +766,17 @@ class Primitives {
|
| // This is to avoid stack overflows due to very large argument arrays in
|
| // apply(). It fixes http://dartbug.com/6919
|
| static String _fromCharCodeApply(List<int> array) {
|
| - String result = "";
|
| const kMaxApply = 500;
|
| int end = array.length;
|
| - for (var i = 0; i < end; i += kMaxApply) {
|
| - var subarray;
|
| - if (end <= kMaxApply) {
|
| - subarray = array;
|
| - } else {
|
| - subarray = JS('JSExtendableArray', r'#.slice(#, #)', array,
|
| - i, i + kMaxApply < end ? i + kMaxApply : end);
|
| - }
|
| - result = JS('String', '# + String.fromCharCode.apply(#, #)',
|
| - result, null, subarray);
|
| + if (end <= kMaxApply) {
|
| + return JS('String', r'String.fromCharCode.apply(null, #)', array);
|
| + }
|
| + String result = '';
|
| + for (int i = 0; i < end; i += kMaxApply) {
|
| + int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end;
|
| + result = JS('String',
|
| + r'# + String.fromCharCode.apply(null, #.slice(#, #))',
|
| + result, array, i, chunkEnd);
|
| }
|
| return result;
|
| }
|
| @@ -806,6 +806,24 @@ class Primitives {
|
| return _fromCharCodeApply(charCodes);
|
| }
|
|
|
| + // [start] and [end] are validated.
|
| + static String stringFromNativeUint8List(
|
| + NativeUint8List charCodes, int start, int end) {
|
| + const kMaxApply = 500;
|
| + if (end <= kMaxApply && start == 0 && end == charCodes.length) {
|
| + return JS('String', r'String.fromCharCode.apply(null, #)', charCodes);
|
| + }
|
| + String result = '';
|
| + for (int i = start; i < end; i += kMaxApply) {
|
| + int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end;
|
| + result = JS('String',
|
| + r'# + String.fromCharCode.apply(null, #.subarray(#, #))',
|
| + result, charCodes, i, chunkEnd);
|
| + }
|
| + return result;
|
| + }
|
| +
|
| +
|
| static String stringFromCharCode(charCode) {
|
| if (0 <= charCode) {
|
| if (charCode <= 0xffff) {
|
|
|