Instruction ConditionalBranch(ProcessorState state, Func<Expression, BinaryExpression> condition) { var val1 = state.Stack.Pop(); var test = condition(val1); var left = (Instruction) state.Instruction.Operand; var right = state.Instruction.Next; Instruction common = GetJoinPoint(left, right); var rightState = state.Clone(right, common); var leftState = state.Clone(left, common); states.Push(rightState); states.Push(leftState); // Run this once the conditional branches have been processed state.RunNext = () => state.Merge(test, leftState, rightState); return common; }