| // 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. | |
| // Test array functions do not cause infinite loops when length is negative, | |
| // max_value, etc. | |
| // ArrayToString | |
| var o = { length: Number.MIN_VALUE }; | |
| var result = Array.prototype.toString.call(o); | |
| assertEquals("[object Object]", result); | |
| // ArrayToLocaleString | |
| var o = { length: Number.MIN_VALUE }; | |
| var result = Array.prototype.toLocaleString.call(o); | |
| assertEquals("", result); | |
| // ArrayJoin | |
| var o = { length: Number.MIN_VALUE }; | |
| var result = Array.prototype.join.call(o); | |
| assertEquals(0, result.length); | |
| // ArrayPush | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.push.call(o, 1); | |
| assertEquals(1, o.length); | |
| assertEquals(1, o[0]); | |
| var o = { length: Number.MAX_VALUE }; | |
| assertThrows(() => Array.prototype.push.call(o, 1), TypeError); | |
| // ArrayPop | |
| var o = { length: 0 }; | |
| Array.prototype.pop.call(o); | |
| assertEquals(0, o.length); | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.pop.call(o); | |
| assertEquals(0, o.length); | |
| var o = { length: Number.MAX_VALUE }; | |
| Array.prototype.pop.call(o); | |
| assertEquals(o.length, Number.MAX_SAFE_INTEGER - 1); | |
| // ArrayReverse | |
| var o = { 0: 'foo', length: Number.MIN_VALUE } | |
| var result = Array.prototype.reverse.call(o); | |
| assertEquals('object', typeof(result)); | |
| assertEquals(Number.MIN_VALUE, result.length); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArrayShift | |
| var o = { 0: "foo", length: Number.MIN_VALUE } | |
| var result = Array.prototype.shift.call(o); | |
| assertEquals(undefined, result); | |
| assertEquals(0, o.length); | |
| // ArrayUnshift | |
| var o = { length: 0 }; | |
| Array.prototype.unshift.call(o); | |
| assertEquals(0, o.length); | |
| var o = { length: 0 }; | |
| Array.prototype.unshift.call(o, 'foo'); | |
| assertEquals('foo', o[0]); | |
| assertEquals(1, o.length); | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.unshift.call(o); | |
| assertEquals(0, o.length); | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.unshift.call(o, 'foo'); | |
| assertEquals('foo', o[0]); | |
| assertEquals(1, o.length); | |
| // ArraySplice | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.splice.call(o); | |
| assertEquals(0, o.length); | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.splice.call(o, 0, 10, ['foo']); | |
| assertEquals(['foo'], o[0]); | |
| assertEquals(1, o.length); | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.splice.call(o, -1); | |
| assertEquals(0, o.length); | |
| var o = { length: Number.MAX_SAFE_INTEGER }; | |
| Array.prototype.splice.call(o, -1); | |
| assertEquals(Number.MAX_SAFE_INTEGER - 1, o.length); | |
| // ArraySlice | |
| var o = { length: Number.MIN_VALUE }; | |
| var result = Array.prototype.slice.call(o); | |
| assertEquals(0, result.length); | |
| var o = { length: Number.MIN_VALUE }; | |
| var result = Array.prototype.slice.call(o, Number.MAX_VALUE); | |
| assertEquals(0, result.length); | |
| var o = { length: Number.MAX_VALUE }; | |
| var result = Array.prototype.slice.call(o, Number.MAX_VALUE - 1); | |
| assertEquals(0, result.length); | |
| // ArrayIndexOf | |
| var o = { length: Number.MIN_VALUE }; | |
| var result = Array.prototype.indexOf.call(o); | |
| assertEquals(-1, result); | |
| var o = { length: Number.MAX_SAFE_INTEGER } | |
| o[Number.MAX_SAFE_INTEGER - 1] = "foo" | |
| var result = Array.prototype.indexOf.call(o, | |
| "foo", Number.MAX_SAFE_INTEGER - 2); | |
| assertEquals(Number.MAX_SAFE_INTEGER - 1, result); | |
| var o = { length: Number.MAX_SAFE_INTEGER }; | |
| o[Number.MAX_SAFE_INTEGER - 1] = "foo"; | |
| var result = Array.prototype.indexOf.call(o, "foo", -1); | |
| assertEquals(Number.MAX_SAFE_INTEGER - 1, result); | |
| // ArrayLastIndexOf | |
| var o = { length: Number.MIN_VALUE }; | |
| var result = Array.prototype.lastIndexOf.call(o); | |
| assertEquals(-1, result); | |
| var o = { length: Number.MAX_SAFE_INTEGER } | |
| o[Number.MAX_SAFE_INTEGER - 1] = "foo" | |
| var result = Array.prototype.lastIndexOf.call(o, | |
| "foo", Number.MAX_SAFE_INTEGER); | |
| assertEquals(Number.MAX_SAFE_INTEGER - 1, result); | |
| var o = { length: Number.MAX_SAFE_INTEGER }; | |
| o[Number.MAX_SAFE_INTEGER - 1] = "foo"; | |
| var result = Array.prototype.lastIndexOf.call(o, "foo", -1); | |
| assertEquals(Number.MAX_SAFE_INTEGER - 1, result); | |
| // ArrayFilter | |
| var func = function(v) { return v; } | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.filter.call(o, func); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArrayForEach | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.forEach.call(o, func); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArraySome | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.some.call(o, func); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArrayEvery | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.every.call(o, func); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArrayMap | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.map.call(o, func); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArrayReduce | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.reduce.call(o, func, 0); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArrayReduceRight | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.reduceRight.call(o, func, 0); | |
| assertEquals(Number.MIN_VALUE, o.length); | |
| // ArrayFill | |
| var o = { length: Number.MIN_VALUE }; | |
| Array.prototype.fill(o, 0); | |
| assertEquals(Number.MIN_VALUE, o.length); |