Chromium Code Reviews| Index: lib/byte_array.cc |
| =================================================================== |
| --- lib/byte_array.cc (revision 9641) |
| +++ lib/byte_array.cc (working copy) |
| @@ -260,13 +260,16 @@ |
| DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Int8Array::kMaxElements) { |
|
cshapiro
2012/07/17 22:54:30
Maybe some derivative or close cousin to the Range
turnidge
2012/07/18 18:17:04
Done.
|
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Int8Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Int8Array& new_array = |
| - Int8Array::Handle(Int8Array::New(length.Value())); |
| + const Int8Array& new_array = Int8Array::Handle(Int8Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -285,13 +288,16 @@ |
| DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Uint8Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Uint8Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Uint8Array& new_array = |
| - Uint8Array::Handle(Uint8Array::New(length.Value())); |
| + const Uint8Array& new_array = Uint8Array::Handle(Uint8Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -310,13 +316,16 @@ |
| DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Int16Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Int16Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Int16Array& new_array = |
| - Int16Array::Handle(Int16Array::New(length.Value())); |
| + const Int16Array& new_array = Int16Array::Handle(Int16Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -335,13 +344,16 @@ |
| DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Uint16Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Uint16Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Uint16Array& new_array = |
| - Uint16Array::Handle(Uint16Array::New(length.Value())); |
| + const Uint16Array& new_array = Uint16Array::Handle(Uint16Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -360,13 +372,16 @@ |
| DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Int32Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Int32Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Int32Array& new_array = |
| - Int32Array::Handle(Int32Array::New(length.Value())); |
| + const Int32Array& new_array = Int32Array::Handle(Int32Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -385,13 +400,16 @@ |
| DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Uint32Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Uint32Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Uint32Array& new_array = |
| - Uint32Array::Handle(Uint32Array::New(length.Value())); |
| + const Uint32Array& new_array = Uint32Array::Handle(Uint32Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -410,13 +428,16 @@ |
| DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Int64Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Int64Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Int64Array& new_array = |
| - Int64Array::Handle(Int64Array::New(length.Value())); |
| + const Int64Array& new_array = Int64Array::Handle(Int64Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -435,13 +456,16 @@ |
| DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Uint64Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Uint64Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Uint64Array& new_array = |
| - Uint64Array::Handle(Uint64Array::New(length.Value())); |
| + const Uint64Array& new_array = Uint64Array::Handle(Uint64Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -460,13 +484,16 @@ |
| DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Float32Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Float32Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Float32Array& new_array = |
| - Float32Array::Handle(Float32Array::New(length.Value())); |
| + const Float32Array& new_array = Float32Array::Handle(Float32Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |
| @@ -485,13 +512,16 @@ |
| DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { |
| GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); |
| - if (length.Value() < 0) { |
| + intptr_t len = length.Value(); |
| + if (len < 0 || len > Float64Array::kMaxElements) { |
| + const String& error = String::Handle(String::NewFormatted( |
| + "length (%ld) must be in the range [0..%ld]", |
| + len, Float64Array::kMaxElements)); |
| GrowableArray<const Object*> args; |
| - args.Add(&length); |
| + args.Add(&error); |
| Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| } |
| - const Float64Array& new_array = |
| - Float64Array::Handle(Float64Array::New(length.Value())); |
| + const Float64Array& new_array = Float64Array::Handle(Float64Array::New(len)); |
| arguments->SetReturn(new_array); |
| } |