From 3ec371690c587f66994a508bba24f4f3778317ee Mon Sep 17 00:00:00 2001 From: "jkummerow@chromium.org" Date: Mon, 12 Sep 2011 12:42:05 +0000 Subject: [PATCH] d8 external array c'tors: allow parameters that can be converted to numbers BUG=v8:1681 TEST=d8 accepts: var a = new Int32Array("2"); Review URL: http://codereview.chromium.org/7867036 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9243 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/d8.cc | 10 ++++++---- test/mjsunit/external-array.js | 13 +++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/d8.cc b/src/d8.cc index 01b4939..9390c84 100644 --- a/src/d8.cc +++ b/src/d8.cc @@ -295,8 +295,12 @@ Handle Shell::CreateExternalArray(const Arguments& args, size_t length = 0; if (args[0]->IsUint32()) { length = args[0]->Uint32Value(); - } else if (args[0]->IsNumber()) { - double raw_length = args[0]->NumberValue(); + } else { + Local number = args[0]->ToNumber(); + if (number.IsEmpty() || !number->IsNumber()) { + return ThrowException(String::New("Array length must be a number.")); + } + double raw_length = number->NumberValue(); if (raw_length < 0) { return ThrowException(String::New("Array length must not be negative.")); } @@ -305,8 +309,6 @@ Handle Shell::CreateExternalArray(const Arguments& args, String::New("Array length exceeds maximum length.")); } length = static_cast(raw_length); - } else { - return ThrowException(String::New("Array length must be a number.")); } if (length > static_cast(kMaxLength)) { return ThrowException(String::New("Array length exceeds maximum length.")); diff --git a/test/mjsunit/external-array.js b/test/mjsunit/external-array.js index d7e9de0..81c6cfe 100644 --- a/test/mjsunit/external-array.js +++ b/test/mjsunit/external-array.js @@ -81,6 +81,19 @@ assertEquals(2.5, get(array, 0)); assertEquals(3.5, get(array, 1)); } +// Test non-number parameters. +var array_with_length_from_non_number = new Int32Array("2"); +assertEquals(2, array_with_length_from_non_number.length); +array_with_length_from_non_number = new Int32Array(undefined); +assertEquals(0, array_with_length_from_non_number.length); +var foo = { valueOf: function() { return 3; } }; +array_with_length_from_non_number = new Int32Array(foo); +assertEquals(3, array_with_length_from_non_number.length); +foo = { toString: function() { return "4"; } }; +array_with_length_from_non_number = new Int32Array(foo); +assertEquals(4, array_with_length_from_non_number.length); + + // Test loads and stores. types = [Array, Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, PixelArray, Float32Array, Float64Array]; -- 2.7.4