diff options
Diffstat (limited to 'js/src/jit-test/tests/parser/bug-1431353.js')
-rw-r--r-- | js/src/jit-test/tests/parser/bug-1431353.js | 152 |
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); |