diff --git a/src/core/ChefWorker.js b/src/core/ChefWorker.js index d29a3cae..b095cbc8 100644 --- a/src/core/ChefWorker.js +++ b/src/core/ChefWorker.js @@ -92,7 +92,7 @@ async function bake(data) { } catch (err) { self.postMessage({ action: "bakeError", - data: err.message + data: err.message.split(":").slice(1).join(":").slice(1) // Cut off worker blurb }); } } @@ -182,13 +182,15 @@ self.setOption = function(option, value) { * Send register values back to the app. * * @param {number} opIndex + * @param {number} numPrevRegisters * @param {string[]} registers */ -self.setRegisters = function(opIndex, registers) { +self.setRegisters = function(opIndex, numPrevRegisters, registers) { self.postMessage({ action: "setRegisters", data: { opIndex: opIndex, + numPrevRegisters: numPrevRegisters, registers: registers } }); diff --git a/src/core/FlowControl.js b/src/core/FlowControl.js index 6cc2b5d4..aa4082e5 100755 --- a/src/core/FlowControl.js +++ b/src/core/FlowControl.js @@ -116,7 +116,7 @@ const FlowControl = { if (!registers) return state; if (ENVIRONMENT_IS_WORKER()) { - self.setRegisters(state.progress, registers.slice(1)); + self.setRegisters(state.progress, state.numRegisters, registers.slice(1)); } /** @@ -127,31 +127,34 @@ const FlowControl = { */ function replaceRegister(str) { // Replace references to registers ($Rn) with contents of registers - str = str.replace(/((?:^|[^\\])(?:\\.|[^\\])*?)\$R(\d{1,2})/g, (match, pre, regNum) => { + str = str ? str.replace(/((?:^|[^\\])(?:\\.|[^\\])*?)\$R(\d{1,2})/g, (match, pre, regNum) => { const index = parseInt(regNum, 10) + 1; - return (index >= registers.length) ? match : pre + registers[index]; - }); + return (index <= state.numRegisters || index >= state.numRegisters + registers.length) ? + match : pre + registers[index - state.numRegisters]; + }) : str; // Unescape remaining register references - return str.replace(/\\\$R(\d{1,2})/, "$R$1"); + return str ? str.replace(/\\\$R(\d{1,2})/, "$R$1") : str; } // Step through all subsequent ops and replace registers in args with extracted content for (let i = state.progress + 1; i < state.opList.length; i++) { + if (state.opList[i].isDisabled()) continue; + let args = state.opList[i].getIngValues(); args = args.map(arg => { if (typeof arg !== "string" && typeof arg !== "object") return arg; - if (typeof arg === "object" && arg.string) { + if (typeof arg === "object" && arg.hasOwnProperty("string")) { arg.string = replaceRegister(arg.string); return arg; } - return replaceRegister(arg); }); state.opList[i].setIngValues(args); } + state.numRegisters += registers.length - 1; return state; }, diff --git a/src/core/Recipe.js b/src/core/Recipe.js index d703ac1e..fdd06943 100755 --- a/src/core/Recipe.js +++ b/src/core/Recipe.js @@ -145,7 +145,7 @@ Recipe.prototype.lastOpIndex = function(startIndex) { */ Recipe.prototype.execute = async function(dish, startFrom) { startFrom = startFrom || 0; - let op, input, output, numJumps = 0; + let op, input, output, numJumps = 0, numRegisters = 0; for (let i = startFrom; i < this.opList.length; i++) { op = this.opList[i]; @@ -162,15 +162,17 @@ Recipe.prototype.execute = async function(dish, startFrom) { if (op.isFlowControl()) { // Package up the current state let state = { - "progress": i, - "dish": dish, - "opList": this.opList, - "numJumps": numJumps + "progress": i, + "dish": dish, + "opList": this.opList, + "numJumps": numJumps, + "numRegisters": numRegisters }; state = await op.run(state); i = state.progress; numJumps = state.numJumps; + numRegisters = state.numRegisters; } else { output = await op.run(input, op.getIngValues()); dish.set(output, op.outputType); diff --git a/src/web/RecipeWaiter.js b/src/web/RecipeWaiter.js index ac6bdfd9..8e64eb4b 100755 --- a/src/web/RecipeWaiter.js +++ b/src/web/RecipeWaiter.js @@ -441,18 +441,19 @@ RecipeWaiter.prototype.opRemove = function(e) { * Sets register values. * * @param {number} opIndex + * @param {number} numPrevRegisters * @param {string[]} registers */ -RecipeWaiter.prototype.setRegisters = function(opIndex, registers) { +RecipeWaiter.prototype.setRegisters = function(opIndex, numPrevRegisters, registers) { const op = document.querySelector(`#rec-list .operation:nth-child(${opIndex + 1})`), prevRegList = op.querySelector(".register-list"); // Remove previous div if (prevRegList) prevRegList.remove(); - +window.Utils = Utils; let registerList = []; for (let i = 0; i < registers.length; i++) { - registerList.push(`$R${i} = ${Utils.truncate(Utils.printable(registers[i]), 100)}`); + registerList.push(`$R${numPrevRegisters + i} = ${Utils.escapeHtml(Utils.truncate(Utils.printable(registers[i]), 100))}`); } const registerListEl = `