summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/warp/compare-empty-string.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/warp/compare-empty-string.js')
-rw-r--r--js/src/jit-test/tests/warp/compare-empty-string.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/warp/compare-empty-string.js b/js/src/jit-test/tests/warp/compare-empty-string.js
new file mode 100644
index 0000000000..30cf03f874
--- /dev/null
+++ b/js/src/jit-test/tests/warp/compare-empty-string.js
@@ -0,0 +1,50 @@
+// Test case to cover empty string comparison folding.
+//
+// MCompare can fold comparison with an empty string constant and replace it
+// with |string.length <op> 0|.
+
+const strings = [
+ // Zero length string.
+ "",
+
+ // Uncommon zero length strings.
+ newString("", {external: true}),
+
+ // Latin-1 strings.
+ "a",
+ "รค",
+ "monkey",
+
+ // Two-byte strings.
+ "็Œฟ",
+ "๐Ÿ’",
+ newString("monkey", {twoByte: true}),
+];
+
+const operators = [
+ "==", "===", "!=", "!==",
+ "<", "<=", ">=", ">",
+];
+
+for (let op of operators) {
+ let lhs = x => `${x} ${op} ""`;
+ let rhs = x => `"" ${op} ${x}`;
+
+ for (let input of [lhs, rhs]) {
+ let fn = Function("strings", `
+ const expected = strings.map(x => {
+ // Prevent Warp compilation when computing the expected results.
+ with ({}) ;
+ return ${input("x")};
+ });
+
+ for (let i = 0; i < 200; ++i) {
+ let idx = i % strings.length;
+ let str = strings[idx];
+ let res = ${input("str")};
+ assertEq(res, expected[idx]);
+ }
+ `);
+ fn(strings);
+ }
+}