| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| var typedArrayConstructors = [ |
| Uint8Array, |
| Int8Array, |
| Uint16Array, |
| Int16Array, |
| Uint32Array, |
| Int32Array, |
| Uint8ClampedArray, |
| Float32Array, |
| Float64Array |
| ]; |
| |
| var lengthCalled = false; |
| function lengthValue() { |
| assertFalse(lengthCalled); |
| lengthCalled = true; |
| return 5; |
| } |
| |
| // ToLength should convert these to usable lengths. |
| var goodNonIntegerLengths = [ |
| function() { return 4.6; }, |
| function() { return -5; }, |
| function() { return NaN; }, |
| function() { return "5"; }, |
| function() { return "abc"; }, |
| function() { return true; }, |
| function() { return null; }, |
| function() { return undefined; } |
| ]; |
| |
| // This will fail if you use ToLength on it. |
| function badNonIntegerLength() { |
| return Symbol("5"); |
| } |
| |
| for (var constructor of typedArrayConstructors) { |
| lengthCalled = false; |
| var a = new constructor(10); |
| a.set({length: {valueOf: lengthValue}}); |
| assertTrue(lengthCalled); |
| |
| for (var lengthFun of goodNonIntegerLengths) { |
| a.set({length: {valueOf: lengthFun}}); |
| } |
| |
| assertThrows(function() { |
| a.set({length: {valueOf: badNonIntegerLength}}); |
| }, TypeError); |
| } |