@putByValDirect in Array.of and Array.from overwrites non-writable/configurable prope...
[WebKit-https.git] / JSTests / stress / regress-153486.js
1 // Check frozen Array.of and Array.from don't modify unwritable/unconfigurable entries.
2
3 let totalFailed = 0;
4
5 function shouldEqual(testId, iteration, actual, expected) {
6     if (actual != expected) {
7         throw "Test #" + testId + ", iteration " + iteration + ", ERROR: expected \"" + expected + "\", got \"" + actual + "\"";
8     }
9 }
10
11 function makeUnwriteableUnconfigurableObject()
12 {
13     return Object.defineProperty([], 0, {value: "frozen", writable: false, configurable: false});
14 }
15
16 function testArrayOf(obj)
17 {
18     Array.of.call(function() { return obj; }, "no longer frozen");
19 }
20
21 noInline(testArrayOf);
22
23 function testArrayFrom(obj)
24 {
25     Array.from.call(function() { return obj; }, ["no longer frozen"]);
26 }
27
28 noInline(testArrayFrom);
29
30 let numIterations = 10000;
31
32 function runTest(testId, test, sourceMaker, expectedException) {
33     for (var i = 0; i < numIterations; i++) {
34         var exception = "No exception";
35         var obj = sourceMaker();
36
37         try {
38             test(obj);
39         } catch (e) {
40             exception = "" + e;
41             exception = exception.substr(0, 10); // Search for "TypeError:".
42         }
43         shouldEqual(testId, i, exception, expectedException);
44     }
45 }
46
47 runTest(1, testArrayOf, makeUnwriteableUnconfigurableObject, "TypeError:");
48 runTest(2, testArrayFrom, makeUnwriteableUnconfigurableObject, "TypeError:");