private IEnumerable <ProgramState> ProcessSwt(ILInstruction instruction, ProgramState next) { var result = new List <ProgramState>(); var symbolicTableSlot = next.Stack.Pop(); var symbolicValue = next.Stack.Pop(); instruction.Dependencies.AddOrMerge(0, symbolicTableSlot); instruction.Dependencies.AddOrMerge(1, symbolicValue); var annotation = new JumpAnnotation { InferredPopCount = instruction.Dependencies.Count, InferredPushCount = 0 }; ulong tableAddress = symbolicTableSlot.InferStackValue().U8; var reader = new MemoryStreamReader(KoiStream.Data); reader.Position = (long)tableAddress - 2; ushort count = reader.ReadUInt16(); for (int i = 0; i < count; i++) { int relativeOffset = reader.ReadInt32(); ulong nextIp = (ulong)((long)next.IP + relativeOffset); Logger.Debug(Tag, $"Inferred edge IL_{instruction.Offset:X4} -> IL_{nextIp:X4}"); var caseState = next.Copy(); caseState.IP = nextIp; result.Add(caseState); annotation.InferredJumpTargets.Add(nextIp); } result.Add(next); instruction.Annotation = annotation; return(result); }