mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-30 19:24:12 +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)
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //@ skip
 | |
| 
 | |
| // This test checks that the pow function returns coherent results:
 | |
| // (a) Across different compilation tiers
 | |
| // (b) With integer exponents represented as int32 or as double
 | |
| 
 | |
| function pow42() {
 | |
|     return { value: 2.1 ** 42, ftl: isFinalTier() };
 | |
| }
 | |
| 
 | |
| function build42AsDouble() {
 | |
|     function opaqueAdd(x, y) { return x + y; }
 | |
|     return opaqueAdd(42 - 0.123, 0.123);
 | |
| }
 | |
| 
 | |
| var double42 = build42AsDouble();
 | |
| 
 | |
| if (double42 !== 42)
 | |
|     throw new Error("42 (as double) should be === to 42 (as int)");
 | |
| 
 | |
| function powDouble42() {
 | |
|     return { value: 2.1 ** double42, ftl: isFinalTier() };
 | |
| }
 | |
| 
 | |
| function clobber() { }
 | |
| noInline(clobber);
 | |
| 
 | |
| function pow42NoConstantFolding() {
 | |
|     var obj = { x: 2.1, y: 42 };
 | |
|     clobber(obj);
 | |
|     return { value: obj.x ** obj.y, ftl: isFinalTier() };
 | |
| }
 | |
| 
 | |
| function powDouble42NoConstantFolding() {
 | |
|     var obj = { x: 2.1, y: double42 };
 | |
|     clobber(obj);
 | |
|     return { value: obj.x ** obj.y, ftl: isFinalTier() };
 | |
| }
 | |
| 
 | |
| var results = { 'jit': {}, 'dfg': {}, 'ftl': {} };
 | |
| var funs = [
 | |
|     [ 'pow42', pow42 ],
 | |
|     [ 'powDouble42', powDouble42 ],
 | |
|     [ 'pow42NoConstantFolding', pow42NoConstantFolding ],
 | |
|     [ 'powDouble42NoConstantFolding', powDouble42NoConstantFolding ]
 | |
| ];
 | |
| var tiers = ['jit', 'dfg', 'ftl'];
 | |
| 
 | |
| for (var i = 0; i < 100000; ++i) {
 | |
|     for (var j in funs) {
 | |
|         var name = funs[j][0];
 | |
|         var fun = funs[j][1];
 | |
|         var result = fun();
 | |
|         if (result.ftl)
 | |
|             results['ftl'][name] = result.value;
 | |
|         else if (numberOfDFGCompiles(fun) > 0)
 | |
|             results['dfg'][name] = result.value;
 | |
|         else
 | |
|             results['jit'][name] = result.value;
 | |
|     }
 | |
| }
 | |
| 
 | |
| var errors = [];
 | |
| var valuesFor = {};
 | |
| for (var i in tiers) {
 | |
|     var tier = tiers[i];
 | |
|     var result = results[tier];
 | |
|     // We don't have this tier
 | |
|     if (Object.keys(result).length === 0)
 | |
|         continue;
 | |
| 
 | |
|     for (var j in funs) {
 | |
|         var name = funs[j][0];
 | |
|         if (!(name in result))
 | |
|             errors.push(name + " was not compiled to " + tier);
 | |
|         else if (!(name in valuesFor))
 | |
|             valuesFor[name] = { value: result[name], tiers: [tier] };
 | |
|         else if (result[name] !== valuesFor[name].value)
 | |
|             errors.push(name + " has different results in " + tier + " (" + result[name] + ") and " + valuesFor[name].tiers + " (" + valuesFor[name].value + ")");
 | |
|         else
 | |
|             valuesFor[name].tiers.push(tier);
 | |
|     }
 | |
| }
 | |
| 
 | |
| var reference = funs[0][0];
 | |
| var result = valuesFor[reference].value;
 | |
| 
 | |
| for (var j in funs) {
 | |
|     var name = funs[j][0];
 | |
|     if (valuesFor[name].value !== result)
 | |
|         errors.push(name + " (" + valuesFor[name].value + ") and " + reference + " (" + result + ") have different results");
 | |
| }
 | |
| 
 | |
| if (errors.length > 0)
 | |
|     throw new Error(errors.join('\n'));
 |