Пример #1
0
        public void ParseCode(CLRMetaDataParser parser, uint codeSize)
        {
            InstructionParser instParser = new InstructionParser(parser.ReadBytes(codeSize), parser.Tables, parser.BinData);

            List<HLInstruction> instructions = new List<HLInstruction>();
            while (!instParser.AtEnd)
            {
                long pos = instParser.Position;
                m_offsetToInstruction[(uint)pos] = (uint)instructions.Count;
                m_instructionToOffset.Add((uint)pos);
                instructions.Add(instParser.DecodeInstruction());
            }
            m_instructionToOffset.Add((uint)instParser.Position);

            // Unpatch instructions
            for (int i = 0; i < instructions.Count; i++)
            {
                HLInstruction instr = instructions[i];
                if ((instr.Flags & HLOpFlags.Br) != 0)
                {
                    instr.ConvertBranchTargets(m_instructionToOffset[i + 1], m_offsetToInstruction);
                    instructions[i] = instr;
                }
            }

            Instructions = instructions.ToArray();
        }