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)
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // This test verify the results of Math.pow() do not change as we change optimization tier.
 | |
| 
 | |
| function opaquePow(a, b)
 | |
| {
 | |
|     return Math.pow(a, b);
 | |
| }
 | |
| noInline(opaquePow);
 | |
| 
 | |
| 
 | |
| let caseStrings = [
 | |
|     "0",
 | |
|     "-0.",
 | |
|     "0.5",
 | |
|     "1",
 | |
|     "2",
 | |
|     "-0.5",
 | |
|     "-1",
 | |
|     "999",
 | |
|     "1000",
 | |
|     "1001",
 | |
|     "NaN",
 | |
|     "Infinity",
 | |
|     "-Infinity",
 | |
|     "Math.PI",
 | |
|     "Math.LN2",
 | |
|     "Math.LN10",
 | |
|     "Math.E",
 | |
|     "Math.LOG10E",
 | |
|     "Math.LOG2E",
 | |
|     "Math.SQRT2"
 | |
| ];
 | |
| let cases = [];
 | |
| for (let caseString of caseStrings) {
 | |
|     cases.push(eval(caseString));
 | |
| }
 | |
| 
 | |
| let expectedResults = [];
 | |
| let constantBaseFunctions = [];
 | |
| let constantExponentFunctions = [];
 | |
| for (let i = 0; i < cases.length; ++i) {
 | |
|     let base = cases[i];
 | |
| 
 | |
|     expectedResults[i] = [];
 | |
|     for (let j = 0; j < cases.length; ++j) {
 | |
|         let exponent = cases[j];
 | |
|         expectedResults[i][j] = Math.pow(base, exponent);
 | |
|     }
 | |
| 
 | |
|     eval("constantBaseFunctions[i] = function (exponent) { return Math.pow(" + caseStrings[i] + ", exponent); }");
 | |
|     eval("constantExponentFunctions[i] = function (base) { return Math.pow(base, " + caseStrings[i] + "); }");
 | |
| }
 | |
| 
 | |
| function isIdentical(result, expected)
 | |
| {
 | |
|     if (expected === expected) {
 | |
|         if (result !== expected)
 | |
|             return false;
 | |
|         if (!expected && 1 / expected === -Infinity && 1 / result !== -Infinity)
 | |
|             return false;
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
|     return result !== result;
 | |
| }
 | |
| 
 | |
| for (let tierUpLoopCounter = 0; tierUpLoopCounter < 1e3; ++tierUpLoopCounter) {
 | |
|     for (let i = 0; i < cases.length; ++i) {
 | |
|         let base = cases[i];
 | |
|         for (let j = 0; j < cases.length; ++j) {
 | |
|             let exponent = cases[j];
 | |
|             let expectedResult = expectedResults[i][j];
 | |
|             let result = opaquePow(base, exponent);
 | |
|             if (!isIdentical(result, expectedResult))
 | |
|                 throw `Failed opaquePow with base = ${base} exponent = ${exponent} expected (${expectedResult}) got (${result})`;
 | |
| 
 | |
|             result = constantBaseFunctions[i](exponent);
 | |
|             if (!isIdentical(result, expectedResult))
 | |
|                 throw `Failed constantBaseFunctions with base = ${base} exponent = ${exponent} expected (${expectedResult}) got (${result})`;
 | |
| 
 | |
|             result = constantExponentFunctions[j](base);
 | |
|             if (!isIdentical(result, expectedResult))
 | |
|                 throw `Failed constantExponentFunctions with base = ${base} exponent = ${exponent} expected (${expectedResult}) got (${result})`;
 | |
|         }
 | |
|     }
 | |
| }
 |