From 7045f5d74e4528f392c1fe073716020ac28c7aee Mon Sep 17 00:00:00 2001 From: James Aguilar <799564+jaguilar@users.noreply.github.com> Date: Sun, 6 May 2018 22:07:14 -0400 Subject: [PATCH 1/3] Fix a bug where a JS script would never exit if killed in a sleep loop. --- src/NetscriptFunctions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NetscriptFunctions.js b/src/NetscriptFunctions.js index 799ca02df..4bd3b4da3 100644 --- a/src/NetscriptFunctions.js +++ b/src/NetscriptFunctions.js @@ -229,6 +229,7 @@ function NetscriptFunctions(workerScript) { workerScript.scriptRef.log("Sleeping for " + time + " milliseconds"); } return netscriptDelay(time, workerScript).then(function() { + if (workerScript.env.stopFlag) {return Promise.reject(workerScript);} return Promise.resolve(true); }); }, From f259a5c17d5a4b9a34a96a73234714f652cf38a6 Mon Sep 17 00:00:00 2001 From: James Aguilar <799564+jaguilar@users.noreply.github.com> Date: Sun, 6 May 2018 22:16:28 -0400 Subject: [PATCH 2/3] More permanent fix for infinite sleeps. --- src/NetscriptFunctions.js | 1 - src/NetscriptWorker.js | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/NetscriptFunctions.js b/src/NetscriptFunctions.js index 4bd3b4da3..799ca02df 100644 --- a/src/NetscriptFunctions.js +++ b/src/NetscriptFunctions.js @@ -229,7 +229,6 @@ function NetscriptFunctions(workerScript) { workerScript.scriptRef.log("Sleeping for " + time + " milliseconds"); } return netscriptDelay(time, workerScript).then(function() { - if (workerScript.env.stopFlag) {return Promise.reject(workerScript);} return Promise.resolve(true); }); }, diff --git a/src/NetscriptWorker.js b/src/NetscriptWorker.js index e024d729c..0b5aa2a81 100644 --- a/src/NetscriptWorker.js +++ b/src/NetscriptWorker.js @@ -73,6 +73,13 @@ function startJsScript(workerScript) { // This function unfortunately cannot be an async function, because we don't // know if the original one was, and there's no way to tell. return function (...args) { + // Wrap every netscript function with a check for the stop flag. + // This prevents cases where we never stop because we are only calling + // netscript functions that don't check this. + // This is not a problem for legacy Netscript because it also checks the + // stop flag in the evaluator. + if (workerScript.env.stopFlag) {return Promise.reject(workerScript);} + const msg = "Concurrent calls to Netscript functions not allowed! " + "Did you forget to await hack(), grow(), or some other " + "promise-returning function? (Currently running: %s tried to run: %s)" From 529e3fb39a47c24c0e1550a0b11dfbf6f72cab45 Mon Sep 17 00:00:00 2001 From: James Aguilar <799564+jaguilar@users.noreply.github.com> Date: Tue, 8 May 2018 21:40:07 -0400 Subject: [PATCH 3/3] Can't return promise sleep, nobody is awaiting it! --- src/NetscriptWorker.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NetscriptWorker.js b/src/NetscriptWorker.js index 0b5aa2a81..0fc043d26 100644 --- a/src/NetscriptWorker.js +++ b/src/NetscriptWorker.js @@ -78,7 +78,9 @@ function startJsScript(workerScript) { // netscript functions that don't check this. // This is not a problem for legacy Netscript because it also checks the // stop flag in the evaluator. - if (workerScript.env.stopFlag) {return Promise.reject(workerScript);} + if (workerScript.env.stopFlag) {throw workerScript;} + + if (propName === "sleep") return f(...args); // OK for multiple simultaneous calls to sleep. const msg = "Concurrent calls to Netscript functions not allowed! " + "Did you forget to await hack(), grow(), or some other " + @@ -99,9 +101,9 @@ function startJsScript(workerScript) { } } }; + for (let prop in workerScript.env.vars) { if (typeof workerScript.env.vars[prop] !== "function") continue; - if (prop === "sleep") continue; // OK for multiple simultaneous calls to sleep. workerScript.env.vars[prop] = wrap(prop, workerScript.env.vars[prop]); }