Invalid flags in a RegExp literal should be an early SyntaxError
[WebKit-https.git] / JSTests / stress / arrowfunction-lexical-bind-arguments-strict.js
1 'use strict'
2 var testCase = function (actual, expected, message) {
3     if (actual !== expected) {
4         throw message + ". Expected '" + expected + "', but was '" + actual + "'";
5     }
6 };
7
8 var txtMsg = 'Error: arguments is not lexically binded inside of the arrow function in strict mode';
9 var text_value = 'function_global_scope';
10
11 function afFactory0() {
12     return a => arguments;
13 }
14
15 var af0 = afFactory0('ABC', 'DEF');
16
17 noInline(af0);
18
19 for (var i=0; i<10000; i++) {
20     let args = af0(i);
21
22     testCase(args.length, 2, txtMsg + "#2");
23     testCase(args[0], 'ABC', txtMsg + "#3");
24     testCase(args[1], 'DEF', txtMsg + "#4");
25     testCase(typeof args[2], 'undefined', txtMsg + "#5");
26 }
27
28 for (var i=0; i<10000; i++) {
29     let args = af0.call(this, i);
30
31     testCase(args.length, 2, txtMsg + "#2");
32     testCase(args[0], 'ABC', txtMsg + "#3");
33     testCase(args[1], 'DEF', txtMsg + "#4");
34     testCase(typeof args[2], 'undefined', txtMsg + "#5");
35 }
36
37 for (var i=0; i<10000; i++) {
38     var args = af0.apply(this, [i]);
39
40     testCase(args.length, 2, txtMsg + "#2");
41     testCase(args[0], 'ABC', txtMsg + "#3");
42     testCase(args[1], 'DEF', txtMsg + "#4");
43     testCase(typeof args[2], 'undefined', txtMsg + "#5");
44 }
45
46 var innerUseStrict = function () {
47     var createArrow = function (a, b, c) {
48         return (x, y) => arguments[0] + arguments[1] + arguments[2] + x + y;
49     };
50
51     let af = createArrow('A', 'B', 'C');
52     noInline(af);
53
54     for (var i=0; i<10000; i++) {
55         let args = af('D', 'E');
56         testCase(args, 'ABCDE', txtMsg + "#6");
57     }
58 };
59
60 innerUseStrict();
61
62 var obj = function (value) {
63   this.id = value;
64 };
65
66 var arr_nesting = () => () => () => new obj('data');
67
68 for (var i=0; i<10000; i++) {
69     testCase(arr_nesting()()().id, 'data');
70 }
71
72 function foo() {
73     var x = (p) => eval(p);
74     return x;
75 }
76
77 var foo_arr = foo('A', 'B');
78
79 for (var i = 0; i < 10000; i++) {
80     testCase(foo_arr('arguments[0]'), 'A', txtMsg + "#15");
81     testCase(foo_arr('arguments[1]'), 'B', txtMsg + "#16");
82 }
83
84 function boo() {
85     return () => {
86         return () => {
87             return function () {
88                 return () => arguments;
89             }
90         }
91     }
92 }
93
94 for (var i = 0; i < 10000; i++) {
95     testCase(boo('A' + i)('B' + i)('D' + i)('E' + i)('G' + i)[0], 'E' + i, txtMsg + "#17");
96 }
97
98 class A {
99    constructor() {
100       this.list = [];
101    }
102 };
103
104 class B extends A {
105    addObj(obj) {
106       this.list.push(obj);
107       this.result = 0;
108    }
109    runAll() {
110       for (let i = 0; i < this.list.length; i++) {
111           this.result += this.list[i].operand(1);
112       }
113    }
114 };
115
116 function test() {
117     let b = new B();
118
119     function runTest () {
120         b.addObj({ operand : (value) =>  value + value });
121         b.addObj({ operand : (value) =>  value + value });
122     }
123
124     for (var i = 0; i < 10000; i++) {
125         runTest();
126     }
127
128     b.runAll();
129
130     testCase(b.result, 40000, txtMsg + "#18");
131 }
132
133 test();
134
135 var testValue = 'test-value';
136
137 function f_args () {
138     if (true) {
139         let someValue = '';
140         if (true) {
141             let anotherValue = 'value';
142             return () => () => () => arguments[0];
143         }
144     }
145
146     return () => 'no-value';
147 }
148
149 for (var i = 0; i < 10000; i++) {
150     let v = f_args(testValue, 'anotherValue')()()();
151     testCase(v, testValue);
152 }
153
154 function f_args_eval () {
155     if (true) {
156         let someValue = '';
157         if (true) {
158             let anotherValue = 'value';
159             return () => () => () => eval('arguments[0]');
160         }
161     }
162
163     return () => 'no-value';
164 }
165
166 for (var i = 0; i < 10000; i++) {
167     let v = f_args_eval(testValue, 'anotherValue')()()();
168     testCase(v, testValue);
169 }