mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-30 03:03:51 +01:00 
			
		
		
		
	* [javascriptcore-test262-automation] changes from git@github.com:WebKit/webkit.git at sha 949e26452cfa153a7f4afe593da97e2fe9e1b706 on Tue Jul 03 2018 14:35:15 GMT-0400 (Eastern Daylight Time)
		
			
				
	
	
		
			141 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //@ runFTLNoCJIT
 | |
| 
 | |
| // Tests accessing an element in arguments before and after having a bad time.
 | |
| // This test should not crash.
 | |
| 
 | |
| let verbose = false;
 | |
| 
 | |
| var utilities =                 'function shouldEqual(testId, actual, expected) {' + '\n' +
 | |
|                                 '    if (actual != expected)' + '\n' +
 | |
|                                 '        throw testId + ": ERROR: expect " + expected + ", actual " + actual;' + '\n' +
 | |
|                                 '}' + '\n';
 | |
| 
 | |
| var haveABadTime =              'Object.defineProperty(Object.prototype, 20, { get() { return 20; } });' + '\n';
 | |
| 
 | |
| var directArgumentsDecl =       '    var args = arguments;' + '\n';
 | |
| 
 | |
| var scopedArgumentsDecl =       '    var args = arguments;' + '\n' +
 | |
|                                 '    function closure() { return x; }' + '\n';
 | |
| 
 | |
| var clonedArgumentsDecl =       '    "use strict";' + '\n' +
 | |
|                                 '    var args = arguments;' + '\n';
 | |
| 
 | |
| function testFunction(argsDecl, insertElementAction, indexToReturn) {
 | |
|     var script =                'function test(x) {' + '\n' +
 | |
|                                      argsDecl +
 | |
|                                      insertElementAction +
 | |
|                                 '    return args[' + indexToReturn + '];' + '\n' +
 | |
|                                 '}' + '\n' +
 | |
|                                 'noInline(test);' + '\n';
 | |
|     return script;
 | |
| }
 | |
| 
 | |
| function warmupFunction(tierWarmupCount, testArgs) {
 | |
|     var script =                'function warmup() {' + '\n' +
 | |
|                                 '    for (var i = 0; i < ' + tierWarmupCount + '; i++) {' + '\n' +
 | |
|                                 '        test(' + testArgs + ');' + '\n' +
 | |
|                                 '    }' + '\n' +
 | |
|                                 '}' + '\n';
 | |
|     return script;
 | |
| }
 | |
| 
 | |
| let argumentsDecls = {
 | |
|     direct: directArgumentsDecl,
 | |
|     scoped: scopedArgumentsDecl,
 | |
|     cloned: clonedArgumentsDecl
 | |
| };
 | |
| 
 | |
| let indicesToReturn = {
 | |
|     inBounds: 0,
 | |
|     outOfBoundsInsertedElement: 10,
 | |
|     outOfBoundsInPrototype: 20
 | |
| };
 | |
| 
 | |
| let tierWarmupCounts = {
 | |
|     llint: 1,
 | |
|     baseline: 50,
 | |
|     dfg: 1000,
 | |
|     ftl: 10000
 | |
| };
 | |
| 
 | |
| let testArgsList = {
 | |
|     noArgs:   {
 | |
|         args: '',
 | |
|         result: {
 | |
|             inBounds: { beforeBadTime: 'undefined', afterBadTime: 'undefined', },
 | |
|             outOfBoundsInsertedElement: { beforeBadTime: '10', afterBadTime: '10', },
 | |
|             outOfBoundsInPrototype: { beforeBadTime: 'undefined', afterBadTime: '20', },
 | |
|         }
 | |
|     },
 | |
|     someArgs: {
 | |
|         args: '1, 2, 3',
 | |
|         result: {
 | |
|             inBounds: { beforeBadTime: '1', afterBadTime: '1', },
 | |
|             outOfBoundsInsertedElement: { beforeBadTime: '10', afterBadTime: '10', },
 | |
|             outOfBoundsInPrototype: { beforeBadTime: 'undefined', afterBadTime: '20', },
 | |
|         }
 | |
|     }
 | |
| };
 | |
| 
 | |
| let insertElementActions = {
 | |
|     insertElement:      '    args[10] = 10;' + '\n',
 | |
|     dontInsertElement:  ''
 | |
| };
 | |
| 
 | |
| for (let argsDeclIndex in argumentsDecls) {
 | |
|     let argsDecl = argumentsDecls[argsDeclIndex];
 | |
| 
 | |
|     for (let indexToReturnIndex in indicesToReturn) {
 | |
|         let indexToReturn = indicesToReturn[indexToReturnIndex];
 | |
| 
 | |
|         for (let insertElementActionIndex in insertElementActions) {
 | |
|             let insertElementAction = insertElementActions[insertElementActionIndex];
 | |
| 
 | |
|             for (let tierWarmupCountIndex in tierWarmupCounts) {
 | |
|                 let tierWarmupCount = tierWarmupCounts[tierWarmupCountIndex];
 | |
| 
 | |
|                 for (let testArgsIndex in testArgsList) {
 | |
|                     let testArgs = testArgsList[testArgsIndex].args;
 | |
|                     let expectedResult = testArgsList[testArgsIndex].result[indexToReturnIndex];
 | |
| 
 | |
|                     if (indexToReturnIndex == 'outOfBoundsInsertedElement'
 | |
|                         && insertElementActionIndex == 'dontInsertElement')
 | |
|                         expectedResult = 'undefined';
 | |
| 
 | |
|                     let testName =
 | |
|                         argsDeclIndex + '-' +
 | |
|                         indexToReturnIndex + '-' +
 | |
|                         insertElementActionIndex + '-' +
 | |
|                         tierWarmupCountIndex + '-' +
 | |
|                         testArgsIndex;
 | |
| 
 | |
| 
 | |
|                     let script = utilities +
 | |
|                                  testFunction(argsDecl, insertElementAction, indexToReturn) +
 | |
|                                  warmupFunction(tierWarmupCount, testArgs) +
 | |
|                                  'warmup()' + '\n' +
 | |
|                                  'shouldEqual(10000, test(' + testArgs + '), ' + expectedResult['beforeBadTime'] + ');' + '\n' +
 | |
|                                  haveABadTime +
 | |
|                                  'shouldEqual(20000, test(' + testArgs + '), ' + expectedResult['afterBadTime'] + ');' + '\n';
 | |
| 
 | |
|                     if (verbose) {
 | |
|                         print('Running test configuration: ' + testName);
 | |
|                         print(
 | |
|                             'Test script: ====================================================\n' +
 | |
|                             script +
 | |
|                             '=== END script ==================================================');
 | |
|                     }
 | |
| 
 | |
|                     try {
 | |
|                         runString(script);
 | |
|                     } catch (e) {
 | |
|                         print('FAILED test configuration: ' + testName);
 | |
|                         print('FAILED test script:\n' + script);
 | |
|                         throw e;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |