Example #1
0
        /// <summary>
        /// Find all virtual instructions and attempt to identify them.
        /// </summary>
        private void InitializeIdentifiedOpCodes()
        {
            this.IdentifiedOpCodes = new Dictionary <Int32, VirtualOpCode>();

            this.VirtualInstructions = VirtualOpCode.FindAllInstructions(this, this.VType.Type);
            var identified = this.VirtualInstructions.Where((instruction) => { return(instruction.IsIdentified); });

            Boolean warningOccurred = false;

            foreach (var instruction in identified)
            {
                Boolean containsVirtual = this.IdentifiedOpCodes.ContainsKey(instruction.VirtualCode);

                VirtualOpCode existing = this.IdentifiedOpCodes.Where((kvp, index) => {
                    return(kvp.Value.IdentityEquals(instruction));
                }).FirstOrDefault().Value;
                Boolean containsActual = (existing != null);

                if (containsVirtual)
                {
                    this.Logger.Warning(this, "WARNING: Multiple instruction types with the same virtual opcode detected ({0})",
                                        instruction.VirtualCode);
                }

                if (containsActual && !instruction.ExpectsMultiple)
                {
                    String opcodeName;

                    if (instruction.HasCILOpCode)
                    {
                        opcodeName = instruction.OpCode.ToString();
                    }
                    else
                    {
                        opcodeName = instruction.SpecialOpCode.ToString();
                    }

                    this.Logger.Warning(this, "WARNING: Multiple virtual opcodes map to the same actual opcode ({0}, {1} => {2})",
                                        existing.VirtualCode, instruction.VirtualCode, opcodeName);
                }

                if (!warningOccurred)
                {
                    warningOccurred = (containsVirtual || containsActual);
                }

                this.IdentifiedOpCodes.Add(instruction.VirtualCode, instruction);
            }

            if (warningOccurred)
            {
                Console.WriteLine();
            }
        }