v8/tools/compare-table-gen.js

121 lines
3.5 KiB
JavaScript
Raw Normal View History

// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Generates a comparison table test case.
// Usage: d8 compare-table-gen.js -- lt|lteq|gt|gteq|eq|ne|eq|sne|min|max
var strings = ["true", "false", "null", "void 0", "0", "0.0", "-0", "\"\"", "-1", "-1.25", "1", "1.25", "-2147483648", "2147483648", "Infinity", "-Infinity", "NaN"];
var values = new Array(strings.length);
for (var i = 0; i < strings.length; i++) {
values[i] = eval(strings[i]);
}
function test() {
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values.length; j++) {
var a = values[i];
var b = values[j];
var x = expected[i][j];
assertEquals(x, func(a,b));
assertEquals(x, left_funcs[i](b));
assertEquals(x, right_funcs[j](a));
}
}
var result = matrix();
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values.length; j++) {
assertEquals(expected[i][j], result[i][j]);
}
}
}
function expr(infix, a, cmp, b) {
return infix ? a + " " + cmp + " " + b : cmp + "(" + a + ", " + b + ")";
}
function SpecialToString(x) {
if ((1 / x) == -Infinity) return "-0";
return "" + x;
}
function gen(name, cmp, infix) {
print("// Copyright 2015 the V8 project authors. All rights reserved.");
print("// Use of this source code is governed by a BSD-style license that can be");
print("// found in the LICENSE file.");
print();
print("var values = [" + strings + "];");
var body = "(function " + name + "(a,b) { return " + expr(infix, "a", cmp, "b") + "; })";
var func = eval(body);
print("var expected = [");
for (var i = 0; i < values.length; i++) {
var line = " [";
for (var j = 0; j < values.length; j++) {
if (j > 0) line += ",";
line += SpecialToString(func(values[i], values[j]));
}
line += "]";
if (i < (values.length - 1)) line += ",";
print(line);
}
print("];");
print("var func = " + body + ";");
print("var left_funcs = [");
for (var i = 0; i < values.length; i++) {
var value = strings[i];
var body = "(function " + name + "_L" + i + "(b) { return " + expr(infix, value, cmp, "b") + "; })";
var end = i < (values.length - 1) ? "," : "";
print(" " + body + end);
}
print("];");
print("var right_funcs = [");
for (var i = 0; i < values.length; i++) {
var value = strings[i];
var body = "(function " + name + "_R" + i + "(a) { return " + expr(infix, "a", cmp, value) + "; })";
var end = i < (values.length - 1) ? "," : "";
print(" " + body + end);
}
print("];");
print("function matrix() {");
print(" return [");
for (var i = 0; i < values.length; i++) {
var line = " [";
for (var j = 0; j < values.length; j++) {
if (j > 0) line += ",";
line += expr(infix, strings[i], cmp, strings[j]);
}
line += "]";
if (i < (values.length - 1)) line += ",";
print(line);
}
print(" ];");
print("}");
print(test.toString());
print("test();");
print("test();");
}
switch (arguments[0]) {
case "lt": gen("lt", "<", true); break;
case "lteq": gen("lteq", "<=", true); break;
case "gt": gen("gt", ">", true); break;
case "gteq": gen("gteq", ">=", true); break;
case "eq": gen("eq", "==", true); break;
case "ne": gen("ne", "!=", true); break;
case "seq": gen("seq", "===", true); break;
case "sne": gen("sne", "!==", true); break;
case "min": gen("min", "Math.min", false); break;
case "max": gen("max", "Math.max", false); break;
}