summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/parser/bug-1431353.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/parser/bug-1431353.js')
-rw-r--r--js/src/jit-test/tests/parser/bug-1431353.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/parser/bug-1431353.js b/js/src/jit-test/tests/parser/bug-1431353.js
new file mode 100644
index 0000000000..df1c4041ab
--- /dev/null
+++ b/js/src/jit-test/tests/parser/bug-1431353.js
@@ -0,0 +1,152 @@
+// |jit-test| skip-if: helperThreadCount() === 0
+
+// Test multiple concurrent off-thread parse jobs.
+
+function assertFails(f) {
+ let failed = false;
+ try {
+ f();
+ } catch (e) {
+ failed = true;
+ }
+ assertEq(failed, true);
+}
+
+function encodeScript(source)
+{
+ let entry = cacheEntry(source);
+ let global = newGlobal({ cloneSingletons: true });
+ evaluate(entry, { global: global, saveBytecode: true });
+ return entry;
+}
+
+let a, b, c;
+
+// Calling run functions without arguments assumes a single off-thread job.
+
+// Test run functions fail when no jobs exist.
+
+assertFails(() => runOffThreadScript());
+
+assertFails(() => finishOffThreadModule());
+
+assertFails(() => runOffThreadDecodedScript());
+
+// Test run functions fail when multiple jobs exist and no ID specified.
+
+a = offThreadCompileScript("");
+b = offThreadCompileScript("");
+assertFails(() => runOffThreadScript());
+runOffThreadScript(a);
+runOffThreadScript(b);
+
+a = offThreadCompileModule("");
+b = offThreadCompileModule("");
+assertFails(() => finishOffThreadModule());
+finishOffThreadModule(a);
+finishOffThreadModule(b);
+
+a = offThreadDecodeScript(encodeScript(""));
+b = offThreadDecodeScript(encodeScript(""));
+assertFails(() => runOffThreadScript());
+runOffThreadDecodedScript(a);
+runOffThreadDecodedScript(b);
+
+// Test fun functions succeed when a single job exist and no ID specified.
+
+offThreadCompileScript("42");
+assertEq(runOffThreadScript(), 42);
+
+offThreadCompileModule("");
+assertEq(typeof finishOffThreadModule(), "object");
+
+offThreadDecodeScript(encodeScript("23"));
+assertEq(runOffThreadDecodedScript(), 23);
+
+// Run functions take an ID argument returned from the compile function.
+
+// Test bad ID type and unknown ID.
+
+offThreadCompileScript("");
+assertFails(() => runOffThreadScript("foo"));
+assertFails(() => runOffThreadScript(42));
+runOffThreadScript();
+
+offThreadCompileModule("");
+assertFails(() => finishOffThreadModule("foo"));
+assertFails(() => finishOffThreadModule(42));
+finishOffThreadModule();
+
+offThreadDecodeScript(encodeScript(""));
+assertFails(() => runOffThreadDecodedScript("foo"));
+assertFails(() => runOffThreadDecodedScript(42));
+runOffThreadDecodedScript();
+
+// Test stale ID.
+
+a = offThreadCompileScript("");
+runOffThreadScript(a);
+assertFails(() => runOffThreadScript(a));
+
+a = offThreadCompileModule("");
+finishOffThreadModule(a);
+assertFails(() => finishOffThreadModule(a));
+
+a = offThreadDecodeScript(encodeScript(""));
+runOffThreadDecodedScript(a);
+assertFails(() => runOffThreadDecodedScript(a));
+
+// Test wrong job kind.
+
+a = offThreadCompileScript("");
+b = offThreadCompileModule("");
+c = offThreadDecodeScript(encodeScript(""));
+assertFails(() => runOffThreadScript(b));
+assertFails(() => runOffThreadScript(c));
+assertFails(() => finishOffThreadModule(a));
+assertFails(() => finishOffThreadModule(c));
+assertFails(() => runOffThreadDecodedScript(a));
+assertFails(() => runOffThreadDecodedScript(b));
+runOffThreadScript(a);
+finishOffThreadModule(b);
+runOffThreadDecodedScript(c);
+
+// Test running multiple jobs.
+
+a = offThreadCompileScript("1");
+b = offThreadCompileScript("2");
+assertEq(runOffThreadScript(a), 1);
+assertEq(runOffThreadScript(b), 2);
+
+a = offThreadCompileModule("");
+b = offThreadCompileModule("");
+assertEq(typeof finishOffThreadModule(a), "object");
+assertEq(typeof finishOffThreadModule(b), "object");
+
+a = offThreadDecodeScript(encodeScript("3"));
+b = offThreadDecodeScript(encodeScript("4"));
+assertEq(runOffThreadDecodedScript(a), 3);
+assertEq(runOffThreadDecodedScript(b), 4);
+
+// Test many jobs.
+
+const count = 100;
+let jobs;
+
+jobs = new Array(count);
+for (let i = 0; i < jobs.length; i++)
+ jobs[i] = offThreadCompileScript(`${i} * ${i}`);
+for (let i = 0; i < jobs.length; i++)
+ assertEq(runOffThreadScript(jobs[i]), i * i);
+
+jobs = new Array(count);
+for (let i = 0; i < jobs.length; i++)
+ jobs[i] = offThreadCompileModule("");
+for (let i = 0; i < jobs.length; i++)
+ assertEq(typeof finishOffThreadModule(jobs[i]), "object");
+
+jobs = new Array(count);
+for (let i = 0; i < jobs.length; i++)
+ jobs[i] = offThreadDecodeScript(encodeScript(`${i} * ${i}`));
+for (let i = 0; i < jobs.length; i++)
+ assertEq(runOffThreadDecodedScript(jobs[i]), i * i);