mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-03 21:24:30 +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'));
 |