diff options
Diffstat (limited to 'deps/v8/tools/compare-table-gen.js')
-rw-r--r-- | deps/v8/tools/compare-table-gen.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/deps/v8/tools/compare-table-gen.js b/deps/v8/tools/compare-table-gen.js new file mode 100644 index 0000000000..e0c870daa5 --- /dev/null +++ b/deps/v8/tools/compare-table-gen.js @@ -0,0 +1,120 @@ +// 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; +} |