[JSC] AI should not propagate AbstractValue relying on constant folding phase
[WebKit-https.git] / JSTests / stress / generic-arguments-correct-delete-behavior.js
1 function assert(b) {
2     if (!b)
3         throw new Error("Bad")
4 }
5
6 function makeTest(shouldCaptureArgument, deleteTwice, zeroAsString) {
7     return eval(`
8         function foo(x) {
9             ${shouldCaptureArgument ? `function bar() { return x; }` : ""}
10
11             assert(x === null);
12
13             let prop = ${zeroAsString ? "'0'" : "0"};
14             Object.defineProperty(arguments, "0", {enumerable: false, value:45});
15             assert(arguments[prop] === 45);
16             assert(x === 45);
17
18             let result = delete arguments[prop];
19             assert(result);
20             ${deleteTwice ? `assert(delete arguments[prop]);` : ""};
21
22             assert(arguments[prop] === undefined); // don't crash here.
23             assert(!(prop in arguments));
24
25             arguments[prop] = 50;
26
27             assert(arguments[prop] === 50);
28             assert(x === 45);
29         }; foo;
30     `);
31 }
32
33 let functions = [];
34 functions.push(makeTest(false, false, true));
35 functions.push(makeTest(false, false, false));
36 functions.push(makeTest(false, true, false));
37 functions.push(makeTest(false, true, true));
38 functions.push(makeTest(true, false, true));
39 functions.push(makeTest(true, false, false));
40 functions.push(makeTest(true, true, false));
41 functions.push(makeTest(true, true, true));
42
43 for (let f of functions) {
44     noInline(f);
45     for (let i = 0; i < 1000; ++i) 
46         f(null);
47 }