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

Unified Diff: sdk/lib/typed_data/dart2js/typed_data_dart2js.dart

Issue 129003002: Redo "dart2js typed data constructor argument validation" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests/html/html.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
diff --git a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
index 83044ce0e3224665e1ecaabacf54ce6817452e77..472ae26defc60c83318ba12a880d3d35550829ad 100644
--- a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
@@ -100,6 +100,30 @@ class TypedData native "ArrayBufferView" {
}
+// Validates the unnamed constructor length argument. Checking is necessary
+// because passing unvalidated values to the native constructors can cause
+// conversions or create views.
+int _checkLength(length) {
+ if (length is! int) throw new ArgumentError('Invalid length $length');
+ return length;
+}
+
+// Validates `.view` constructor arguments. Checking is necessary because
+// passing unvalidated values to the native constructors can cause conversions
+// (e.g. String arguments) or create typed data objects that are not actually
+// views of the input.
+void _checkViewArguments(buffer, offsetInBytes, length) {
+ if (buffer is! ByteBuffer) {
+ throw new ArgumentError('Invalid view buffer');
+ }
+ if (offsetInBytes is! int) {
+ throw new ArgumentError('Invalid view offsetInBytes $offsetInBytes');
+ }
+ if (length != null && length is! int) {
+ throw new ArgumentError('Invalid view length $length');
+ }
+}
+
// Ensures that [list] is a JavaScript Array or a typed array. If necessary,
// returns a copy of the list.
List _ensureNativeList(List list) {
@@ -136,7 +160,7 @@ class ByteData extends TypedData native "DataView" {
* Creates a [ByteData] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory ByteData(int length) => _create1(length);
+ factory ByteData(int length) => _create1(_checkLength(length));
/**
* Creates an [ByteData] _view_ of the specified region in the specified
@@ -151,10 +175,12 @@ class ByteData extends TypedData native "DataView" {
* the length of [buffer].
*/
factory ByteData.view(ByteBuffer buffer,
- [int byteOffset = 0, int byteLength]) =>
- byteLength == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, byteLength);
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
/**
* Returns the floating point number represented by the four bytes at
@@ -532,7 +558,7 @@ class Float32List extends _NativeTypedArrayOfDouble native "Float32Array" {
* Creates a [Float32List] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory Float32List(int length) => _create1(length);
+ factory Float32List(int length) => _create1(_checkLength(length));
/**
* Creates a [Float32List] with the same size as the [elements] list
@@ -557,10 +583,12 @@ class Float32List extends _NativeTypedArrayOfDouble native "Float32Array" {
* BYTES_PER_ELEMENT.
*/
factory Float32List.view(ByteBuffer buffer,
- [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 4;
@@ -602,7 +630,7 @@ class Float64List extends _NativeTypedArrayOfDouble native "Float64Array" {
* Creates a [Float64List] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory Float64List(int length) => _create1(length);
+ factory Float64List(int length) => _create1(_checkLength(length));
/**
* Creates a [Float64List] with the same size as the [elements] list
@@ -627,10 +655,12 @@ class Float64List extends _NativeTypedArrayOfDouble native "Float64Array" {
* BYTES_PER_ELEMENT.
*/
factory Float64List.view(ByteBuffer buffer,
- [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 8;
@@ -674,7 +704,7 @@ class Int16List extends _NativeTypedArrayOfInt native "Int16Array" {
* Creates an [Int16List] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory Int16List(int length) => _create1(length);
+ factory Int16List(int length) => _create1(_checkLength(length));
/**
* Creates a [Int16List] with the same size as the [elements] list
@@ -698,10 +728,13 @@ class Int16List extends _NativeTypedArrayOfInt native "Int16Array" {
* Throws [ArgumentError] if [offsetInBytes] is not a multiple of
* BYTES_PER_ELEMENT.
*/
- factory Int16List.view(ByteBuffer buffer, [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ factory Int16List.view(ByteBuffer buffer,
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 2;
@@ -742,7 +775,7 @@ class Int32List extends _NativeTypedArrayOfInt native "Int32Array" {
* Creates an [Int32List] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory Int32List(int length) => _create1(length);
+ factory Int32List(int length) => _create1(_checkLength(length));
/**
* Creates a [Int32List] with the same size as the [elements] list
@@ -766,10 +799,13 @@ class Int32List extends _NativeTypedArrayOfInt native "Int32Array" {
* Throws [ArgumentError] if [offsetInBytes] is not a multiple of
* BYTES_PER_ELEMENT.
*/
- factory Int32List.view(ByteBuffer buffer, [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ factory Int32List.view(ByteBuffer buffer,
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 4;
@@ -810,7 +846,7 @@ class Int8List extends _NativeTypedArrayOfInt native "Int8Array" {
* Creates an [Int8List] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory Int8List(int length) => _create1(length);
+ factory Int8List(int length) => _create1(_checkLength(length));
/**
* Creates a [Int8List] with the same size as the [elements] list
@@ -831,10 +867,13 @@ class Int8List extends _NativeTypedArrayOfInt native "Int8Array" {
* if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
* the length of [buffer].
*/
- factory Int8List.view(ByteBuffer buffer, [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ factory Int8List.view(ByteBuffer buffer,
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 1;
@@ -875,7 +914,7 @@ class Uint16List extends _NativeTypedArrayOfInt native "Uint16Array" {
* Creates a [Uint16List] of the specified length (in elements), all
* of whose elements are initially zero.
*/
- factory Uint16List(int length) => _create1(length);
+ factory Uint16List(int length) => _create1(_checkLength(length));
/**
* Creates a [Uint16List] with the same size as the [elements] list
@@ -900,10 +939,12 @@ class Uint16List extends _NativeTypedArrayOfInt native "Uint16Array" {
* BYTES_PER_ELEMENT.
*/
factory Uint16List.view(ByteBuffer buffer,
- [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 2;
@@ -944,7 +985,7 @@ class Uint32List extends _NativeTypedArrayOfInt native "Uint32Array" {
* Creates a [Uint32List] of the specified length (in elements), all
* of whose elements are initially zero.
*/
- factory Uint32List(int length) => _create1(length);
+ factory Uint32List(int length) => _create1(_checkLength(length));
/**
* Creates a [Uint32List] with the same size as the [elements] list
@@ -969,10 +1010,12 @@ class Uint32List extends _NativeTypedArrayOfInt native "Uint32Array" {
* BYTES_PER_ELEMENT.
*/
factory Uint32List.view(ByteBuffer buffer,
- [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 4;
@@ -1015,7 +1058,7 @@ class Uint8ClampedList extends _NativeTypedArrayOfInt
* Creates a [Uint8ClampedList] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory Uint8ClampedList(int length) => _create1(length);
+ factory Uint8ClampedList(int length) => _create1(_checkLength(length));
/**
* Creates a [Uint8ClampedList] of the same size as the [elements]
@@ -1037,10 +1080,12 @@ class Uint8ClampedList extends _NativeTypedArrayOfInt
* the length of [buffer].
*/
factory Uint8ClampedList.view(ByteBuffer buffer,
- [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 1;
@@ -1089,7 +1134,7 @@ class Uint8List extends _NativeTypedArrayOfInt
* Creates a [Uint8List] of the specified length (in elements), all of
* whose elements are initially zero.
*/
- factory Uint8List(int length) => _create1(length);
+ factory Uint8List(int length) => _create1(_checkLength(length));
/**
* Creates a [Uint8List] with the same size as the [elements] list
@@ -1111,10 +1156,12 @@ class Uint8List extends _NativeTypedArrayOfInt
* the length of [buffer].
*/
factory Uint8List.view(ByteBuffer buffer,
- [int byteOffset = 0, int length]) =>
- length == null
- ? _create2(buffer, byteOffset)
- : _create3(buffer, byteOffset, length);
+ [int offsetInBytes = 0, int length]) {
+ _checkViewArguments(buffer, offsetInBytes, length);
+ return length == null
+ ? _create2(buffer, offsetInBytes)
+ : _create3(buffer, offsetInBytes, length);
+ }
static const int BYTES_PER_ELEMENT = 1;
« no previous file with comments | « no previous file | tests/html/html.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698