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