diff --git a/src/core/FlowControl.js b/src/core/FlowControl.js index f847ab25..cb63ce6c 100755 --- a/src/core/FlowControl.js +++ b/src/core/FlowControl.js @@ -52,14 +52,23 @@ const FlowControl = { output = "", progress = 0; + state.forkOffset += state.progress + 1; + recipe.addOperations(subOpList); + const ingValues = subOpList.map(op => op.getIngValues()); // Run recipe over each tranche for (i = 0; i < inputs.length; i++) { log.debug(`Entering tranche ${i + 1} of ${inputs.length}`); + + // Baseline ing values for each tranche so that registers are reset + subOpList.forEach((op, i) => { + op.setIngValues(ingValues[i]); + }); + const dish = new Dish(inputs[i], inputType); try { - progress = await recipe.execute(dish, 0); + progress = await recipe.execute(dish, 0, state); } catch (err) { if (!ignoreErrors) { throw err; @@ -117,7 +126,7 @@ const FlowControl = { if (!registers) return state; if (ENVIRONMENT_IS_WORKER()) { - self.setRegisters(state.progress, state.numRegisters, registers.slice(1)); + self.setRegisters(state.forkOffset + state.progress, state.numRegisters, registers.slice(1)); } /** diff --git a/src/core/Recipe.js b/src/core/Recipe.js index 877c0ac1..9305c32d 100755 --- a/src/core/Recipe.js +++ b/src/core/Recipe.js @@ -141,11 +141,14 @@ Recipe.prototype.lastOpIndex = function(startIndex) { * * @param {Dish} dish * @param {number} [startFrom=0] - The index of the Operation to start executing from + * @param {number} [forkState={}] - If this is a forked recipe, the state of the recipe up to this point * @returns {number} - The final progress through the recipe */ -Recipe.prototype.execute = async function(dish, startFrom) { - startFrom = startFrom || 0; - let op, input, output, numJumps = 0, numRegisters = 0; +Recipe.prototype.execute = async function(dish, startFrom = 0, forkState = {}) { + let op, input, output, + numJumps = 0, + numRegisters = forkState.numRegisters || 0; + log.debug(`[*] Executing recipe of ${this.opList.length} operations, starting at ${startFrom}`); for (let i = startFrom; i < this.opList.length; i++) { @@ -171,7 +174,8 @@ Recipe.prototype.execute = async function(dish, startFrom) { "dish": dish, "opList": this.opList, "numJumps": numJumps, - "numRegisters": numRegisters + "numRegisters": numRegisters, + "forkOffset": forkState.forkOffset || 0 }; state = await op.run(state); @@ -256,4 +260,5 @@ Recipe.prototype.generateHighlightList = function() { return highlights; }; + export default Recipe;