Invalid flags in a RegExp literal should be an early SyntaxError
[WebKit-https.git] / JSTests / stress / have-a-bad-time-with-arguments.js
1 //@ runFTLNoCJIT
2
3 // Tests accessing an element in arguments before and after having a bad time.
4 // This test should not crash.
5
6 let verbose = false;
7
8 var utilities =                 'function shouldEqual(testId, actual, expected) {' + '\n' +
9                                 '    if (actual != expected)' + '\n' +
10                                 '        throw testId + ": ERROR: expect " + expected + ", actual " + actual;' + '\n' +
11                                 '}' + '\n';
12
13 var haveABadTime =              'Object.defineProperty(Object.prototype, 20, { get() { return 20; } });' + '\n';
14
15 var directArgumentsDecl =       '    var args = arguments;' + '\n';
16
17 var scopedArgumentsDecl =       '    var args = arguments;' + '\n' +
18                                 '    function closure() { return x; }' + '\n';
19
20 var clonedArgumentsDecl =       '    "use strict";' + '\n' +
21                                 '    var args = arguments;' + '\n';
22
23 function testFunction(argsDecl, insertElementAction, indexToReturn) {
24     var script =                'function test(x) {' + '\n' +
25                                      argsDecl +
26                                      insertElementAction +
27                                 '    return args[' + indexToReturn + '];' + '\n' +
28                                 '}' + '\n' +
29                                 'noInline(test);' + '\n';
30     return script;
31 }
32
33 function warmupFunction(tierWarmupCount, testArgs) {
34     var script =                'function warmup() {' + '\n' +
35                                 '    for (var i = 0; i < ' + tierWarmupCount + '; i++) {' + '\n' +
36                                 '        test(' + testArgs + ');' + '\n' +
37                                 '    }' + '\n' +
38                                 '}' + '\n';
39     return script;
40 }
41
42 let argumentsDecls = {
43     direct: directArgumentsDecl,
44     scoped: scopedArgumentsDecl,
45     cloned: clonedArgumentsDecl
46 };
47
48 let indicesToReturn = {
49     inBounds: 0,
50     outOfBoundsInsertedElement: 10,
51     outOfBoundsInPrototype: 20
52 };
53
54 let tierWarmupCounts = {
55     llint: 1,
56     baseline: 50,
57     dfg: 1000,
58     ftl: 10000
59 };
60
61 let testArgsList = {
62     noArgs:   {
63         args: '',
64         result: {
65             inBounds: { beforeBadTime: 'undefined', afterBadTime: 'undefined', },
66             outOfBoundsInsertedElement: { beforeBadTime: '10', afterBadTime: '10', },
67             outOfBoundsInPrototype: { beforeBadTime: 'undefined', afterBadTime: '20', },
68         }
69     },
70     someArgs: {
71         args: '1, 2, 3',
72         result: {
73             inBounds: { beforeBadTime: '1', afterBadTime: '1', },
74             outOfBoundsInsertedElement: { beforeBadTime: '10', afterBadTime: '10', },
75             outOfBoundsInPrototype: { beforeBadTime: 'undefined', afterBadTime: '20', },
76         }
77     }
78 };
79
80 let insertElementActions = {
81     insertElement:      '    args[10] = 10;' + '\n',
82     dontInsertElement:  ''
83 };
84
85 for (let argsDeclIndex in argumentsDecls) {
86     let argsDecl = argumentsDecls[argsDeclIndex];
87
88     for (let indexToReturnIndex in indicesToReturn) {
89         let indexToReturn = indicesToReturn[indexToReturnIndex];
90
91         for (let insertElementActionIndex in insertElementActions) {
92             let insertElementAction = insertElementActions[insertElementActionIndex];
93
94             for (let tierWarmupCountIndex in tierWarmupCounts) {
95                 let tierWarmupCount = tierWarmupCounts[tierWarmupCountIndex];
96
97                 for (let testArgsIndex in testArgsList) {
98                     let testArgs = testArgsList[testArgsIndex].args;
99                     let expectedResult = testArgsList[testArgsIndex].result[indexToReturnIndex];
100
101                     if (indexToReturnIndex == 'outOfBoundsInsertedElement'
102                         && insertElementActionIndex == 'dontInsertElement')
103                         expectedResult = 'undefined';
104
105                     let testName =
106                         argsDeclIndex + '-' +
107                         indexToReturnIndex + '-' +
108                         insertElementActionIndex + '-' +
109                         tierWarmupCountIndex + '-' +
110                         testArgsIndex;
111
112
113                     let script = utilities +
114                                  testFunction(argsDecl, insertElementAction, indexToReturn) +
115                                  warmupFunction(tierWarmupCount, testArgs) +
116                                  'warmup()' + '\n' +
117                                  'shouldEqual(10000, test(' + testArgs + '), ' + expectedResult['beforeBadTime'] + ');' + '\n' +
118                                  haveABadTime +
119                                  'shouldEqual(20000, test(' + testArgs + '), ' + expectedResult['afterBadTime'] + ');' + '\n';
120
121                     if (verbose) {
122                         print('Running test configuration: ' + testName);
123                         print(
124                             'Test script: ====================================================\n' +
125                             script +
126                             '=== END script ==================================================');
127                     }
128
129                     try {
130                         runString(script);
131                     } catch (e) {
132                         print('FAILED test configuration: ' + testName);
133                         print('FAILED test script:\n' + script);
134                         throw e;
135                     }
136                 }
137             }
138         }
139     }
140 }