| // 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; |
| } |