Пример #1
0
        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);
        }