OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library _js_helper; | 5 library _js_helper; |
6 | 6 |
7 import 'dart:_js_embedded_names' show | 7 import 'dart:_js_embedded_names' show |
8 ALL_CLASSES, | 8 ALL_CLASSES, |
9 GET_ISOLATE_TAG, | 9 GET_ISOLATE_TAG, |
10 INTERCEPTED_NAMES, | 10 INTERCEPTED_NAMES, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 JS_OPERATOR_AS_PREFIX, | 53 JS_OPERATOR_AS_PREFIX, |
54 JS_OPERATOR_IS_PREFIX, | 54 JS_OPERATOR_IS_PREFIX, |
55 JS_SIGNATURE_NAME, | 55 JS_SIGNATURE_NAME, |
56 JS_STRING_CONCAT, | 56 JS_STRING_CONCAT, |
57 RAW_DART_FUNCTION_REF; | 57 RAW_DART_FUNCTION_REF; |
58 | 58 |
59 import 'dart:_interceptors'; | 59 import 'dart:_interceptors'; |
60 import 'dart:_internal' as _symbol_dev; | 60 import 'dart:_internal' as _symbol_dev; |
61 import 'dart:_internal' show MappedIterable; | 61 import 'dart:_internal' show MappedIterable; |
62 | 62 |
| 63 import 'dart:_native_typed_data'; |
| 64 |
63 import 'dart:_js_names' show | 65 import 'dart:_js_names' show |
64 extractKeys, | 66 extractKeys, |
65 mangledNames, | 67 mangledNames, |
66 unmangleGlobalNameIfPreservedAnyways, | 68 unmangleGlobalNameIfPreservedAnyways, |
67 unmangleAllIdentifiersIfPreservedAnyways; | 69 unmangleAllIdentifiersIfPreservedAnyways; |
68 | 70 |
69 part 'annotations.dart'; | 71 part 'annotations.dart'; |
70 part 'constant_map.dart'; | 72 part 'constant_map.dart'; |
71 part 'native_helper.dart'; | 73 part 'native_helper.dart'; |
72 part 'regexp_helper.dart'; | 74 part 'regexp_helper.dart'; |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 if (JS('bool', '!!self.location')) { | 759 if (JS('bool', '!!self.location')) { |
758 return JS('String', 'self.location.href'); | 760 return JS('String', 'self.location.href'); |
759 } | 761 } |
760 | 762 |
761 return null; | 763 return null; |
762 } | 764 } |
763 | 765 |
764 // This is to avoid stack overflows due to very large argument arrays in | 766 // This is to avoid stack overflows due to very large argument arrays in |
765 // apply(). It fixes http://dartbug.com/6919 | 767 // apply(). It fixes http://dartbug.com/6919 |
766 static String _fromCharCodeApply(List<int> array) { | 768 static String _fromCharCodeApply(List<int> array) { |
767 String result = ""; | |
768 const kMaxApply = 500; | 769 const kMaxApply = 500; |
769 int end = array.length; | 770 int end = array.length; |
770 for (var i = 0; i < end; i += kMaxApply) { | 771 if (end <= kMaxApply) { |
771 var subarray; | 772 return JS('String', r'String.fromCharCode.apply(null, #)', array); |
772 if (end <= kMaxApply) { | 773 } |
773 subarray = array; | 774 String result = ''; |
774 } else { | 775 for (int i = 0; i < end; i += kMaxApply) { |
775 subarray = JS('JSExtendableArray', r'#.slice(#, #)', array, | 776 int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end; |
776 i, i + kMaxApply < end ? i + kMaxApply : end); | 777 result = JS('String', |
777 } | 778 r'# + String.fromCharCode.apply(null, #.slice(#, #))', |
778 result = JS('String', '# + String.fromCharCode.apply(#, #)', | 779 result, array, i, chunkEnd); |
779 result, null, subarray); | |
780 } | 780 } |
781 return result; | 781 return result; |
782 } | 782 } |
783 | 783 |
784 static String stringFromCodePoints(codePoints) { | 784 static String stringFromCodePoints(codePoints) { |
785 List<int> a = <int>[]; | 785 List<int> a = <int>[]; |
786 for (var i in codePoints) { | 786 for (var i in codePoints) { |
787 if (i is !int) throw new ArgumentError(i); | 787 if (i is !int) throw new ArgumentError(i); |
788 if (i <= 0xffff) { | 788 if (i <= 0xffff) { |
789 a.add(i); | 789 a.add(i); |
790 } else if (i <= 0x10ffff) { | 790 } else if (i <= 0x10ffff) { |
791 a.add(0xd800 + ((((i - 0x10000) >> 10) & 0x3ff))); | 791 a.add(0xd800 + ((((i - 0x10000) >> 10) & 0x3ff))); |
792 a.add(0xdc00 + (i & 0x3ff)); | 792 a.add(0xdc00 + (i & 0x3ff)); |
793 } else { | 793 } else { |
794 throw new ArgumentError(i); | 794 throw new ArgumentError(i); |
795 } | 795 } |
796 } | 796 } |
797 return _fromCharCodeApply(a); | 797 return _fromCharCodeApply(a); |
798 } | 798 } |
799 | 799 |
800 static String stringFromCharCodes(charCodes) { | 800 static String stringFromCharCodes(charCodes) { |
801 for (var i in charCodes) { | 801 for (var i in charCodes) { |
802 if (i is !int) throw new ArgumentError(i); | 802 if (i is !int) throw new ArgumentError(i); |
803 if (i < 0) throw new ArgumentError(i); | 803 if (i < 0) throw new ArgumentError(i); |
804 if (i > 0xffff) return stringFromCodePoints(charCodes); | 804 if (i > 0xffff) return stringFromCodePoints(charCodes); |
805 } | 805 } |
806 return _fromCharCodeApply(charCodes); | 806 return _fromCharCodeApply(charCodes); |
807 } | 807 } |
808 | 808 |
| 809 // [start] and [end] are validated. |
| 810 static String stringFromNativeUint8List( |
| 811 NativeUint8List charCodes, int start, int end) { |
| 812 const kMaxApply = 500; |
| 813 if (end <= kMaxApply && start == 0 && end == charCodes.length) { |
| 814 return JS('String', r'String.fromCharCode.apply(null, #)', charCodes); |
| 815 } |
| 816 String result = ''; |
| 817 for (int i = start; i < end; i += kMaxApply) { |
| 818 int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end; |
| 819 result = JS('String', |
| 820 r'# + String.fromCharCode.apply(null, #.subarray(#, #))', |
| 821 result, charCodes, i, chunkEnd); |
| 822 } |
| 823 return result; |
| 824 } |
| 825 |
| 826 |
809 static String stringFromCharCode(charCode) { | 827 static String stringFromCharCode(charCode) { |
810 if (0 <= charCode) { | 828 if (0 <= charCode) { |
811 if (charCode <= 0xffff) { | 829 if (charCode <= 0xffff) { |
812 return JS('String', 'String.fromCharCode(#)', charCode); | 830 return JS('String', 'String.fromCharCode(#)', charCode); |
813 } | 831 } |
814 if (charCode <= 0x10ffff) { | 832 if (charCode <= 0x10ffff) { |
815 var bits = charCode - 0x10000; | 833 var bits = charCode - 0x10000; |
816 var low = 0xDC00 | (bits & 0x3ff); | 834 var low = 0xDC00 | (bits & 0x3ff); |
817 var high = 0xD800 | (bits >> 10); | 835 var high = 0xD800 | (bits >> 10); |
818 return JS('String', 'String.fromCharCode(#, #)', high, low); | 836 return JS('String', 'String.fromCharCode(#, #)', high, low); |
(...skipping 2618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3437 throw new MainError("No top-level function named 'main'."); | 3455 throw new MainError("No top-level function named 'main'."); |
3438 } | 3456 } |
3439 | 3457 |
3440 void badMain() { | 3458 void badMain() { |
3441 throw new MainError("'main' is not a function."); | 3459 throw new MainError("'main' is not a function."); |
3442 } | 3460 } |
3443 | 3461 |
3444 void mainHasTooManyParameters() { | 3462 void mainHasTooManyParameters() { |
3445 throw new MainError("'main' expects too many parameters."); | 3463 throw new MainError("'main' expects too many parameters."); |
3446 } | 3464 } |
OLD | NEW |