| // Check frozen Array.of and Array.from don't modify unwritable/unconfigurable entries. |
| |
| let totalFailed = 0; |
| |
| function shouldEqual(testId, iteration, actual, expected) { |
| if (actual != expected) { |
| throw "Test #" + testId + ", iteration " + iteration + ", ERROR: expected \"" + expected + "\", got \"" + actual + "\""; |
| } |
| } |
| |
| function makeUnwriteableUnconfigurableObject() |
| { |
| return Object.defineProperty([], 0, {value: "frozen", writable: false, configurable: false}); |
| } |
| |
| function testArrayOf(obj) |
| { |
| Array.of.call(function() { return obj; }, "no longer frozen"); |
| } |
| |
| noInline(testArrayOf); |
| |
| function testArrayFrom(obj) |
| { |
| Array.from.call(function() { return obj; }, ["no longer frozen"]); |
| } |
| |
| noInline(testArrayFrom); |
| |
| let numIterations = 10000; |
| |
| function runTest(testId, test, sourceMaker, expectedException) { |
| for (var i = 0; i < numIterations; i++) { |
| var exception = "No exception"; |
| var obj = sourceMaker(); |
| |
| try { |
| test(obj); |
| } catch (e) { |
| exception = "" + e; |
| exception = exception.substr(0, 10); // Search for "TypeError:". |
| } |
| shouldEqual(testId, i, exception, expectedException); |
| } |
| } |
| |
| runTest(1, testArrayOf, makeUnwriteableUnconfigurableObject, "TypeError:"); |
| runTest(2, testArrayFrom, makeUnwriteableUnconfigurableObject, "TypeError:"); |