| //@ runFTLNoCJIT |
| |
| let totalFailed = 0; |
| |
| function shouldEqual(testId, actual, expected) { |
| if (actual != expected) { |
| throw testId + ": ERROR: expect " + expected + ", actual " + actual; |
| } |
| } |
| |
| function makeArray() { |
| return ['unmodifiable']; |
| } |
| |
| function makeArrayLikeObject() { |
| var obj = {}; |
| obj[0] = 'unmodifiable'; |
| obj.length = 1; |
| return obj; |
| } |
| |
| function emptyArraySourceMaker() { |
| return []; |
| } |
| |
| function singleElementArraySourceMaker() { |
| return ['modified_1']; |
| } |
| |
| // Make test functions with unique codeblocks. |
| function makeConcatTest(testId) { |
| return new Function("arr", "return arr.concat(['" + testId + "'])"); |
| } |
| function makeConcatOnHoleyArrayTest(testId) { |
| return new Function("arr", "var other = ['" + testId + "']; other[1000] = '" + testId + "'; return arr.concat(other);"); |
| } |
| |
| let numIterations = 10000; |
| |
| function runTest(testId, testMaker, targetMaker, sourceMaker, expectedValue, expectedException) { |
| var test = testMaker(testId); |
| noInline(test); |
| |
| for (var i = 0; i < numIterations; i++) { |
| var exception = undefined; |
| |
| var obj = targetMaker(); |
| obj = Object.freeze(obj); |
| |
| var arr = sourceMaker(); |
| arr.constructor = { [Symbol.species]: function() { return obj; } }; |
| |
| try { |
| test(arr); |
| } catch (e) { |
| exception = "" + e; |
| exception = exception.substr(0, 10); // Search for "TypeError:". |
| } |
| shouldEqual(testId, exception, expectedException); |
| shouldEqual(testId, obj[0], expectedValue); |
| } |
| } |
| |
| runTest(10010, makeConcatTest, makeArray, emptyArraySourceMaker, "unmodifiable", "TypeError:"); |
| runTest(10011, makeConcatTest, makeArray, singleElementArraySourceMaker, "unmodifiable", "TypeError:"); |
| runTest(10020, makeConcatTest, makeArrayLikeObject, emptyArraySourceMaker, "unmodifiable", "TypeError:"); |
| runTest(10021, makeConcatTest, makeArrayLikeObject, singleElementArraySourceMaker, "unmodifiable", "TypeError:"); |
| |
| runTest(10110, makeConcatOnHoleyArrayTest, makeArray, emptyArraySourceMaker, "unmodifiable", "TypeError:"); |
| runTest(10111, makeConcatOnHoleyArrayTest, makeArray, singleElementArraySourceMaker, "unmodifiable", "TypeError:"); |
| runTest(10120, makeConcatOnHoleyArrayTest, makeArrayLikeObject, emptyArraySourceMaker, "unmodifiable", "TypeError:"); |
| runTest(10121, makeConcatOnHoleyArrayTest, makeArrayLikeObject, singleElementArraySourceMaker, "unmodifiable", "TypeError:"); |