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.js165
1 files changed, 165 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..61c83136f2
--- /dev/null
+++ b/js/src/jit-test/tests/parser/bug-1431353.js
@@ -0,0 +1,165 @@
+// |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, saveIncrementalBytecode: true });
+ return entry;
+}
+
+let a, b, c;
+let stencil, stencilA, stencilB, stencilC;
+
+// Calling run functions without arguments assumes a single off-thread job.
+
+// Test run functions fail when no jobs exist.
+
+assertFails(() => finishOffThreadStencil());
+
+assertFails(() => finishOffThreadStencil());
+
+assertFails(() => finishOffThreadStencil());
+
+// Test run functions fail when multiple jobs exist and no ID specified.
+
+a = offThreadCompileToStencil("");
+b = offThreadCompileToStencil("");
+assertFails(() => finishOffThreadStencil());
+stencilA = finishOffThreadStencil(a);
+stencilB = finishOffThreadStencil(b);
+evalStencil(stencilA);
+evalStencil(stencilB);
+
+a = offThreadCompileModuleToStencil("");
+b = offThreadCompileModuleToStencil("");
+assertFails(() => finishOffThreadStencil());
+stencilA = finishOffThreadStencil(a);
+stencilB = finishOffThreadStencil(b);
+instantiateModuleStencil(stencilA);
+instantiateModuleStencil(stencilB);
+
+a = offThreadDecodeStencil(encodeScript(""));
+b = offThreadDecodeStencil(encodeScript(""));
+assertFails(() => finishOffThreadStencil());
+stencilA = finishOffThreadStencil(a);
+stencilB = finishOffThreadStencil(b);
+evalStencil(stencilA);
+evalStencil(stencilB);
+
+// Test fun functions succeed when a single job exist and no ID specified.
+
+offThreadCompileToStencil("42");
+stencil = finishOffThreadStencil();
+assertEq(evalStencil(stencil), 42);
+
+offThreadCompileModuleToStencil("");
+stencil = finishOffThreadStencil();
+assertEq(typeof instantiateModuleStencil(stencil), "object");
+
+offThreadDecodeStencil(encodeScript("23"));
+stencil = finishOffThreadStencil();
+assertEq(evalStencil(stencil), 23);
+
+// Run functions take an ID argument returned from the compile function.
+
+// Test bad ID type and unknown ID.
+
+offThreadCompileToStencil("");
+assertFails(() => finishOffThreadStencil("foo"));
+assertFails(() => finishOffThreadStencil(42));
+stencil = finishOffThreadStencil();
+evalStencil(stencil);
+
+offThreadCompileModuleToStencil("");
+assertFails(() => finishOffThreadStencil("foo"));
+assertFails(() => finishOffThreadStencil(42));
+stencil = finishOffThreadStencil();
+instantiateModuleStencil(stencil);
+
+offThreadDecodeStencil(encodeScript(""));
+assertFails(() => finishOffThreadStencil("foo"));
+assertFails(() => finishOffThreadStencil(42));
+stencil = finishOffThreadStencil();
+evalStencil(stencil);
+
+// Test stale ID.
+
+a = offThreadCompileToStencil("");
+stencilA = finishOffThreadStencil(a);
+evalStencil(stencilA);
+assertFails(() => finishOffThreadStencil(a));
+
+a = offThreadCompileModuleToStencil("");
+stencilA = finishOffThreadStencil(a);
+assertFails(() => finishOffThreadStencil(a));
+instantiateModuleStencil(stencilA);
+
+a = offThreadDecodeStencil(encodeScript(""));
+stencilA = finishOffThreadStencil(a);
+evalStencil(stencilA);
+assertFails(() => finishOffThreadStencil(a));
+
+// Test running multiple jobs.
+
+a = offThreadCompileToStencil("1");
+b = offThreadCompileToStencil("2");
+stencilA = finishOffThreadStencil(a);
+stencilB = finishOffThreadStencil(b);
+assertEq(evalStencil(stencilA), 1);
+assertEq(evalStencil(stencilB), 2);
+
+a = offThreadCompileModuleToStencil("");
+b = offThreadCompileModuleToStencil("");
+stencilA = finishOffThreadStencil(a);
+stencilB = finishOffThreadStencil(b);
+assertEq(typeof instantiateModuleStencil(stencilA), "object");
+assertEq(typeof instantiateModuleStencil(stencilB), "object");
+
+a = offThreadDecodeStencil(encodeScript("3"));
+b = offThreadDecodeStencil(encodeScript("4"));
+stencilA = finishOffThreadStencil(a);
+stencilB = finishOffThreadStencil(b);
+assertEq(evalStencil(stencilA), 3);
+assertEq(evalStencil(stencilB), 4);
+
+// Test many jobs.
+
+const count = 100;
+let jobs;
+
+jobs = new Array(count);
+for (let i = 0; i < jobs.length; i++)
+ jobs[i] = offThreadCompileToStencil(`${i} * ${i}`);
+for (let i = 0; i < jobs.length; i++) {
+ stencil = finishOffThreadStencil(jobs[i]);
+ assertEq(evalStencil(stencil), i * i);
+}
+
+jobs = new Array(count);
+for (let i = 0; i < jobs.length; i++)
+ jobs[i] = offThreadCompileModuleToStencil("");
+for (let i = 0; i < jobs.length; i++) {
+ stencil = finishOffThreadStencil(jobs[i]);
+ assertEq(typeof instantiateModuleStencil(stencil), "object");
+}
+
+jobs = new Array(count);
+for (let i = 0; i < jobs.length; i++)
+ jobs[i] = offThreadDecodeStencil(encodeScript(`${i} * ${i}`));
+for (let i = 0; i < jobs.length; i++) {
+ stencil = finishOffThreadStencil(jobs[i]);
+ assertEq(evalStencil(stencil), i * i);
+}