[JSC] DFG should respect node's strict flag
[WebKit-https.git] / JSTests / stress / put-dynamic-var-strict-and-sloppy.js
1 function shouldBe(actual, expected) {
2     if (actual !== expected)
3         throw new Error('bad value: ' + actual);
4 }
5
6 function shouldThrow(func, errorMessage) {
7     var errorThrown = false;
8     var error = null;
9     try {
10         func();
11     } catch (e) {
12         errorThrown = true;
13         error = e;
14     }
15     if (!errorThrown)
16         throw new Error('not thrown');
17     if (String(error) !== errorMessage)
18         throw new Error(`bad error: ${String(error)}`);
19 }
20
21 (function () {
22     var flag = true;
23     var scope = {
24         resolveStrict: 20,
25         resolveSloppy: 20,
26     };
27
28     with (scope) {
29         var putValueStrict = function (text, value)
30         {
31             if (flag)
32                 eval(text); // Make resolution Dynamic.
33             var result = (function () {
34                 "use strict";
35                 resolveStrict = value;
36             }());
37             return result;
38         };
39         noInline(putValueStrict);
40
41         var resolveSloppy = 20;
42         var putValueSloppy = function (text, value)
43         {
44             if (flag)
45                 eval(text); // Make resolution Dynamic.
46             var result = (function () {
47                 resolveSloppy = value;
48             }());
49             return result;
50         }
51         noInline(putValueSloppy);
52     }
53
54     putValueStrict(`var resolveStrict = 20`, i);
55     putValueSloppy(`var resolveSloppy = 20`, i);
56     flag = false;
57
58     for (var i = 0; i < 4e3; ++i) {
59         putValueStrict(``, i);
60         shouldBe(scope.resolveStrict, i);
61         putValueSloppy(``, i);
62         shouldBe(scope.resolveSloppy, i);
63     }
64     Object.freeze(scope);
65     shouldThrow(() => {
66         putValueStrict(``, 0);
67     }, `TypeError: Attempted to assign to readonly property.`);
68     putValueSloppy(``, 0);
69     shouldBe(scope.resolveSloppy, 4e3 - 1);
70 }());