Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: runtime/lib/typed_data.dart

Issue 23714005: Fix range check bug for ByteData getters and setters. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: updated co19 status Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/co19/co19-co19.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 // patch classes for Int8List ..... Float64List and ByteData implementations. 5 // patch classes for Int8List ..... Float64List and ByteData implementations.
6 6
7 patch class Int8List { 7 patch class Int8List {
8 /* patch */ factory Int8List(int length) { 8 /* patch */ factory Int8List(int length) {
9 return new _Int8Array(length); 9 return new _Int8Array(length);
10 } 10 }
(...skipping 2808 matching lines...) Expand 10 before | Expand all | Expand 10 after
2819 return _typedData._getUint8(_offset + byteOffset); 2819 return _typedData._getUint8(_offset + byteOffset);
2820 } 2820 }
2821 void setUint8(int byteOffset, int value) { 2821 void setUint8(int byteOffset, int value) {
2822 if (byteOffset < 0 || byteOffset >= length) { 2822 if (byteOffset < 0 || byteOffset >= length) {
2823 _throwRangeError(byteOffset, length); 2823 _throwRangeError(byteOffset, length);
2824 } 2824 }
2825 _typedData._setUint8(_offset + byteOffset, _toUint8(value)); 2825 _typedData._setUint8(_offset + byteOffset, _toUint8(value));
2826 } 2826 }
2827 2827
2828 int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) { 2828 int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
2829 if (byteOffset < 0 || byteOffset >= length) { 2829 if (byteOffset < 0 || byteOffset + 1 >= length) {
2830 _throwRangeError(byteOffset, length); 2830 _throwRangeError(byteOffset + 1, length);
2831 } 2831 }
2832 var result = _typedData._getInt16(_offset + byteOffset); 2832 var result = _typedData._getInt16(_offset + byteOffset);
2833 if (identical(endian, Endianness.HOST_ENDIAN)) { 2833 if (identical(endian, Endianness.HOST_ENDIAN)) {
2834 return result; 2834 return result;
2835 } 2835 }
2836 return _toEndianInt16(result, endian._littleEndian); 2836 return _toEndianInt16(result, endian._littleEndian);
2837 } 2837 }
2838 void setInt16(int byteOffset, 2838 void setInt16(int byteOffset,
2839 int value, 2839 int value,
2840 [Endianness endian = Endianness.BIG_ENDIAN]) { 2840 [Endianness endian = Endianness.BIG_ENDIAN]) {
2841 if (byteOffset < 0 || byteOffset >= length) { 2841 if (byteOffset < 0 || byteOffset + 1 >= length) {
2842 _throwRangeError(byteOffset, length); 2842 _throwRangeError(byteOffset + 1, length);
2843 } 2843 }
2844 var set_value = _toInt16(value); 2844 var set_value = _toInt16(value);
2845 if (!identical(endian, Endianness.HOST_ENDIAN)) { 2845 if (!identical(endian, Endianness.HOST_ENDIAN)) {
2846 set_value = _toEndianInt16(set_value, endian._littleEndian); 2846 set_value = _toEndianInt16(set_value, endian._littleEndian);
2847 } 2847 }
2848 _typedData._setInt16(_offset + byteOffset, set_value); 2848 _typedData._setInt16(_offset + byteOffset, set_value);
2849 } 2849 }
2850 2850
2851 int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) { 2851 int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
2852 if (byteOffset < 0 || byteOffset >= length) { 2852 if (byteOffset < 0 || byteOffset + 1 >= length) {
2853 _throwRangeError(byteOffset, length); 2853 _throwRangeError(byteOffset + 1, length);
2854 } 2854 }
2855 var result = _typedData._getUint16(_offset + byteOffset); 2855 var result = _typedData._getUint16(_offset + byteOffset);
2856 if (identical(endian, Endianness.HOST_ENDIAN)) { 2856 if (identical(endian, Endianness.HOST_ENDIAN)) {
2857 return result; 2857 return result;
2858 } 2858 }
2859 return _toEndianUint16(result, endian._littleEndian); 2859 return _toEndianUint16(result, endian._littleEndian);
2860 } 2860 }
2861 void setUint16(int byteOffset, 2861 void setUint16(int byteOffset,
2862 int value, 2862 int value,
2863 [Endianness endian = Endianness.BIG_ENDIAN]) { 2863 [Endianness endian = Endianness.BIG_ENDIAN]) {
2864 if (byteOffset < 0 || byteOffset >= length) { 2864 if (byteOffset < 0 || byteOffset + 1 >= length) {
2865 _throwRangeError(byteOffset, length); 2865 _throwRangeError(byteOffset + 1, length);
2866 } 2866 }
2867 var set_value = _toUint16(value); 2867 var set_value = _toUint16(value);
2868 if (!identical(endian, Endianness.HOST_ENDIAN)) { 2868 if (!identical(endian, Endianness.HOST_ENDIAN)) {
2869 set_value = _toEndianUint16(set_value, endian._littleEndian); 2869 set_value = _toEndianUint16(set_value, endian._littleEndian);
2870 } 2870 }
2871 _typedData._setUint16(_offset + byteOffset, set_value); 2871 _typedData._setUint16(_offset + byteOffset, set_value);
2872 } 2872 }
2873 2873
2874 int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) { 2874 int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
2875 if (byteOffset < 0 || byteOffset >= length) { 2875 if (byteOffset < 0 || byteOffset + 3 >= length) {
2876 _throwRangeError(byteOffset, length); 2876 _throwRangeError(byteOffset + 3, length);
2877 } 2877 }
2878 var result = _typedData._getInt32(_offset + byteOffset); 2878 var result = _typedData._getInt32(_offset + byteOffset);
2879 if (identical(endian, Endianness.HOST_ENDIAN)) { 2879 if (identical(endian, Endianness.HOST_ENDIAN)) {
2880 return result; 2880 return result;
2881 } 2881 }
2882 return _toEndianInt32(result, endian._littleEndian); 2882 return _toEndianInt32(result, endian._littleEndian);
2883 } 2883 }
2884 void setInt32(int byteOffset, 2884 void setInt32(int byteOffset,
2885 int value, 2885 int value,
2886 [Endianness endian = Endianness.BIG_ENDIAN]) { 2886 [Endianness endian = Endianness.BIG_ENDIAN]) {
2887 if (byteOffset < 0 || byteOffset >= length) { 2887 if (byteOffset < 0 || byteOffset + 3 >= length) {
2888 _throwRangeError(byteOffset, length); 2888 _throwRangeError(byteOffset + 3, length);
2889 } 2889 }
2890 var set_value = _toInt32(value); 2890 var set_value = _toInt32(value);
2891 if (!identical(endian, Endianness.HOST_ENDIAN)) { 2891 if (!identical(endian, Endianness.HOST_ENDIAN)) {
2892 set_value = _toEndianInt32(set_value, endian._littleEndian); 2892 set_value = _toEndianInt32(set_value, endian._littleEndian);
2893 } 2893 }
2894 _typedData._setInt32(_offset + byteOffset, set_value); 2894 _typedData._setInt32(_offset + byteOffset, set_value);
2895 } 2895 }
2896 2896
2897 int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) { 2897 int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
2898 if (byteOffset < 0 || byteOffset >= length) { 2898 if (byteOffset < 0 || byteOffset + 3 >= length) {
2899 _throwRangeError(byteOffset, length); 2899 _throwRangeError(byteOffset + 3, length);
2900 } 2900 }
2901 var result = _typedData._getUint32(_offset + byteOffset); 2901 var result = _typedData._getUint32(_offset + byteOffset);
2902 if (identical(endian, Endianness.HOST_ENDIAN)) { 2902 if (identical(endian, Endianness.HOST_ENDIAN)) {
2903 return result; 2903 return result;
2904 } 2904 }
2905 return _toEndianUint32(result, endian._littleEndian); 2905 return _toEndianUint32(result, endian._littleEndian);
2906 } 2906 }
2907 void setUint32(int byteOffset, 2907 void setUint32(int byteOffset,
2908 int value, 2908 int value,
2909 [Endianness endian = Endianness.BIG_ENDIAN]) { 2909 [Endianness endian = Endianness.BIG_ENDIAN]) {
2910 if (byteOffset < 0 || byteOffset >= length) { 2910 if (byteOffset < 0 || byteOffset + 3 >= length) {
2911 _throwRangeError(byteOffset, length); 2911 _throwRangeError(byteOffset + 3, length);
2912 } 2912 }
2913 var set_value = _toUint32(value); 2913 var set_value = _toUint32(value);
2914 if (!identical(endian, Endianness.HOST_ENDIAN)) { 2914 if (!identical(endian, Endianness.HOST_ENDIAN)) {
2915 set_value = _toEndianUint32(set_value, endian._littleEndian); 2915 set_value = _toEndianUint32(set_value, endian._littleEndian);
2916 } 2916 }
2917 _typedData._setUint32(_offset + byteOffset, set_value); 2917 _typedData._setUint32(_offset + byteOffset, set_value);
2918 } 2918 }
2919 2919
2920 int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) { 2920 int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
2921 if (byteOffset < 0 || byteOffset >= length) { 2921 if (byteOffset < 0 || byteOffset + 7 >= length) {
2922 _throwRangeError(byteOffset, length); 2922 _throwRangeError(byteOffset + 7, length);
2923 } 2923 }
2924 var result = _typedData._getInt64(_offset + byteOffset); 2924 var result = _typedData._getInt64(_offset + byteOffset);
2925 if (identical(endian, Endianness.HOST_ENDIAN)) { 2925 if (identical(endian, Endianness.HOST_ENDIAN)) {
2926 return result; 2926 return result;
2927 } 2927 }
2928 return _toEndianInt64(result, endian._littleEndian); 2928 return _toEndianInt64(result, endian._littleEndian);
2929 } 2929 }
2930 void setInt64(int byteOffset, 2930 void setInt64(int byteOffset,
2931 int value, 2931 int value,
2932 [Endianness endian = Endianness.BIG_ENDIAN]) { 2932 [Endianness endian = Endianness.BIG_ENDIAN]) {
2933 if (byteOffset < 0 || byteOffset >= length) { 2933 if (byteOffset < 0 || byteOffset + 7 >= length) {
2934 _throwRangeError(byteOffset, length); 2934 _throwRangeError(byteOffset + 7, length);
2935 } 2935 }
2936 var set_value = _toInt64(value); 2936 var set_value = _toInt64(value);
2937 if (!identical(endian, Endianness.HOST_ENDIAN)) { 2937 if (!identical(endian, Endianness.HOST_ENDIAN)) {
2938 set_value = _toEndianInt64(set_value, endian._littleEndian); 2938 set_value = _toEndianInt64(set_value, endian._littleEndian);
2939 } 2939 }
2940 _typedData._setInt64(_offset + byteOffset, set_value); 2940 _typedData._setInt64(_offset + byteOffset, set_value);
2941 } 2941 }
2942 2942
2943 int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) { 2943 int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
2944 if (byteOffset < 0 || byteOffset >= length) { 2944 if (byteOffset < 0 || byteOffset + 7 >= length) {
2945 _throwRangeError(byteOffset, length); 2945 _throwRangeError(byteOffset + 7, length);
2946 } 2946 }
2947 var result = _typedData._getUint64(_offset + byteOffset); 2947 var result = _typedData._getUint64(_offset + byteOffset);
2948 if (identical(endian, Endianness.HOST_ENDIAN)) { 2948 if (identical(endian, Endianness.HOST_ENDIAN)) {
2949 return result; 2949 return result;
2950 } 2950 }
2951 return _toEndianUint64(result, endian._littleEndian); 2951 return _toEndianUint64(result, endian._littleEndian);
2952 } 2952 }
2953 void setUint64(int byteOffset, 2953 void setUint64(int byteOffset,
2954 int value, 2954 int value,
2955 [Endianness endian = Endianness.BIG_ENDIAN]) { 2955 [Endianness endian = Endianness.BIG_ENDIAN]) {
2956 if (byteOffset < 0 || byteOffset >= length) { 2956 if (byteOffset < 0 || byteOffset + 7 >= length) {
2957 _throwRangeError(byteOffset, length); 2957 _throwRangeError(byteOffset + 7, length);
2958 } 2958 }
2959 var set_value = _toUint64(value); 2959 var set_value = _toUint64(value);
2960 if (!identical(endian, Endianness.HOST_ENDIAN)) { 2960 if (!identical(endian, Endianness.HOST_ENDIAN)) {
2961 set_value = _toEndianUint64(set_value, endian._littleEndian); 2961 set_value = _toEndianUint64(set_value, endian._littleEndian);
2962 } 2962 }
2963 _typedData._setUint64(_offset + byteOffset, set_value); 2963 _typedData._setUint64(_offset + byteOffset, set_value);
2964 } 2964 }
2965 2965
2966 double getFloat32(int byteOffset, 2966 double getFloat32(int byteOffset,
2967 [Endianness endian = Endianness.BIG_ENDIAN]) { 2967 [Endianness endian = Endianness.BIG_ENDIAN]) {
2968 if (byteOffset < 0 || byteOffset >= length) { 2968 if (byteOffset < 0 || byteOffset + 3 >= length) {
2969 _throwRangeError(byteOffset, length); 2969 _throwRangeError(byteOffset + 3, length);
2970 } 2970 }
2971 var result = _typedData._getFloat32(_offset + byteOffset); 2971 var result = _typedData._getFloat32(_offset + byteOffset);
2972 if (identical(endian, Endianness.HOST_ENDIAN)) { 2972 if (identical(endian, Endianness.HOST_ENDIAN)) {
2973 return result; 2973 return result;
2974 } 2974 }
2975 return _toEndianFloat32(result, endian._littleEndian); 2975 return _toEndianFloat32(result, endian._littleEndian);
2976 } 2976 }
2977 void setFloat32(int byteOffset, 2977 void setFloat32(int byteOffset,
2978 double value, 2978 double value,
2979 [Endianness endian = Endianness.BIG_ENDIAN]) { 2979 [Endianness endian = Endianness.BIG_ENDIAN]) {
2980 if (byteOffset < 0 || byteOffset >= length) { 2980 if (byteOffset < 0 || byteOffset + 3 >= length) {
2981 _throwRangeError(byteOffset, length); 2981 _throwRangeError(byteOffset + 3, length);
2982 } 2982 }
2983 var set_value = value; 2983 var set_value = value;
2984 if (!identical(endian, Endianness.HOST_ENDIAN)) { 2984 if (!identical(endian, Endianness.HOST_ENDIAN)) {
2985 set_value = _toEndianFloat32(set_value, endian._littleEndian); 2985 set_value = _toEndianFloat32(set_value, endian._littleEndian);
2986 } 2986 }
2987 _typedData._setFloat32(_offset + byteOffset, set_value); 2987 _typedData._setFloat32(_offset + byteOffset, set_value);
2988 } 2988 }
2989 2989
2990 double getFloat64(int byteOffset, 2990 double getFloat64(int byteOffset,
2991 [Endianness endian = Endianness.BIG_ENDIAN]) { 2991 [Endianness endian = Endianness.BIG_ENDIAN]) {
2992 if (byteOffset < 0 || byteOffset >= length) { 2992 if (byteOffset < 0 || byteOffset + 7 >= length) {
2993 _throwRangeError(byteOffset, length); 2993 _throwRangeError(byteOffset + 7, length);
2994 } 2994 }
2995 var result = _typedData._getFloat64(_offset + byteOffset); 2995 var result = _typedData._getFloat64(_offset + byteOffset);
2996 if (identical(endian, Endianness.HOST_ENDIAN)) { 2996 if (identical(endian, Endianness.HOST_ENDIAN)) {
2997 return result; 2997 return result;
2998 } 2998 }
2999 return _toEndianFloat64(result, endian._littleEndian); 2999 return _toEndianFloat64(result, endian._littleEndian);
3000 } 3000 }
3001 void setFloat64(int byteOffset, 3001 void setFloat64(int byteOffset,
3002 double value, 3002 double value,
3003 [Endianness endian = Endianness.BIG_ENDIAN]) { 3003 [Endianness endian = Endianness.BIG_ENDIAN]) {
3004 if (byteOffset < 0 || byteOffset >= length) { 3004 if (byteOffset < 0 || byteOffset + 7 >= length) {
3005 _throwRangeError(byteOffset, length); 3005 _throwRangeError(byteOffset + 7, length);
3006 } 3006 }
3007 var set_value = value; 3007 var set_value = value;
3008 if (!identical(endian, Endianness.HOST_ENDIAN)) { 3008 if (!identical(endian, Endianness.HOST_ENDIAN)) {
3009 set_value = _toEndianFloat64(set_value, endian._littleEndian); 3009 set_value = _toEndianFloat64(set_value, endian._littleEndian);
3010 } 3010 }
3011 _typedData._setFloat64(_offset + byteOffset, set_value); 3011 _typedData._setFloat64(_offset + byteOffset, set_value);
3012 } 3012 }
3013 3013
3014 Float32x4 getFloat32x4(int byteOffset, 3014 Float32x4 getFloat32x4(int byteOffset,
3015 [Endianness endian = Endianness.BIG_ENDIAN]) { 3015 [Endianness endian = Endianness.BIG_ENDIAN]) {
3016 if (byteOffset < 0 || byteOffset >= length) { 3016 if (byteOffset < 0 || byteOffset + 3 >= length) {
3017 _throwRangeError(byteOffset, length); 3017 _throwRangeError(byteOffset + 3, length);
3018 } 3018 }
3019 // TODO(johnmccutchan) : Need to resolve this for endianity. 3019 // TODO(johnmccutchan) : Need to resolve this for endianity.
3020 return _typedData._getFloat32x4(_offset + byteOffset); 3020 return _typedData._getFloat32x4(_offset + byteOffset);
3021 } 3021 }
3022 void setFloat32x4(int byteOffset, 3022 void setFloat32x4(int byteOffset,
3023 Float32x4 value, 3023 Float32x4 value,
3024 [Endianness endian = Endianness.BIG_ENDIAN]) { 3024 [Endianness endian = Endianness.BIG_ENDIAN]) {
3025 if (byteOffset < 0 || byteOffset >= length) { 3025 if (byteOffset < 0 || byteOffset + 3 >= length) {
3026 _throwRangeError(byteOffset, length); 3026 _throwRangeError(byteOffset + 3, length);
3027 } 3027 }
3028 // TODO(johnmccutchan) : Need to resolve this for endianity. 3028 // TODO(johnmccutchan) : Need to resolve this for endianity.
3029 _typedData._setFloat32x4(_offset + byteOffset, value); 3029 _typedData._setFloat32x4(_offset + byteOffset, value);
3030 3030
3031 } 3031 }
3032 3032
3033 3033
3034 // Internal utility methods. 3034 // Internal utility methods.
3035 3035
3036 static int _toEndianInt16(int host_value, bool little_endian) 3036 static int _toEndianInt16(int host_value, bool little_endian)
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
3130 return value; 3130 return value;
3131 } 3131 }
3132 return object; 3132 return object;
3133 } 3133 }
3134 3134
3135 3135
3136 void _throwRangeError(int index, int length) { 3136 void _throwRangeError(int index, int length) {
3137 String message = "$index must be in the range [0..$length)"; 3137 String message = "$index must be in the range [0..$length)";
3138 throw new RangeError(message); 3138 throw new RangeError(message);
3139 } 3139 }
OLDNEW
« no previous file with comments | « no previous file | tests/co19/co19-co19.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698