protected override List<Instruction> ReadInstructions(MethodDef cilMethod, CsvmMethodData csvmMethod) {
			var reader = new BinaryReader(new MemoryStream(csvmMethod.Instructions));
			var instrs = new List<Instruction>();
			var handlerInfoReader = new OpCodeHandlerInfoReader(module);

			int numVmInstrs = reader.ReadInt32();
			var vmInstrs = new ushort[numVmInstrs];
			for (int i = 0; i < numVmInstrs; i++)
				vmInstrs[i] = reader.ReadUInt16();

			uint offset = 0;
			for (int vmInstrIndex = 0; vmInstrIndex < numVmInstrs; vmInstrIndex++) {
				var composite = opCodeDetector.Handlers[vmInstrs[vmInstrIndex]];
				IList<HandlerTypeCode> handlerInfos = composite.HandlerTypeCodes;
				if (handlerInfos.Count == 0)
					handlerInfos = new HandlerTypeCode[] { HandlerTypeCode.Nop };
				for (int hi = 0; hi < handlerInfos.Count; hi++) {
					var instr = handlerInfoReader.Read(handlerInfos[hi], reader);
					instr.Offset = offset;
					offset += (uint)GetInstructionSize(instr);
					SetCilToVmIndex(instr, vmInstrIndex);
					if (hi == 0)
						SetVmIndexToCil(instr, vmInstrIndex);
					instrs.Add(instr);
				}
			}

			return instrs;
		}
示例#2
0
 public Instruction Read(HandlerTypeCode typeCode, BinaryReader reader)
 {
     if (!readHandlers.TryGetValue(typeCode, out var readHandler))
     {
         throw new ApplicationException("Invalid handler type");
     }
     return(readHandler(reader));
 }
        protected override List <Instruction> ReadInstructions(MethodDef cilMethod, CsvmMethodData csvmMethod)
        {
            var reader            = new BinaryReader(new MemoryStream(csvmMethod.Instructions));
            var instrs            = new List <Instruction>();
            var gpContext         = GenericParamContext.Create(cilMethod);
            var handlerInfoReader = new OpCodeHandlerInfoReader(module, gpContext);

            int numVmInstrs = reader.ReadInt32();
            var vmInstrs    = new ushort[numVmInstrs];

            for (int i = 0; i < numVmInstrs; i++)
            {
                vmInstrs[i] = reader.ReadUInt16();
            }

            uint offset = 0;

            for (int vmInstrIndex = 0; vmInstrIndex < numVmInstrs; vmInstrIndex++)
            {
                var composite = opCodeDetector.Handlers[vmInstrs[vmInstrIndex]];
                IList <HandlerTypeCode> handlerInfos = composite.HandlerTypeCodes;
                if (handlerInfos.Count == 0)
                {
                    handlerInfos = new HandlerTypeCode[] { HandlerTypeCode.Nop }
                }
                ;
                for (int hi = 0; hi < handlerInfos.Count; hi++)
                {
                    var instr = handlerInfoReader.Read(handlerInfos[hi], reader);
                    instr.Offset = offset;
                    offset      += (uint)GetInstructionSize(instr);
                    SetCilToVmIndex(instr, vmInstrIndex);
                    if (hi == 0)
                    {
                        SetVmIndexToCil(instr, vmInstrIndex);
                    }
                    instrs.Add(instr);
                }
            }

            return(instrs);
        }
    }
		public static string GetHandlerName(HandlerTypeCode code) {
			switch (code) {
			case HandlerTypeCode.Add:			return "add";
			case HandlerTypeCode.Add_Ovf:		return "add.ovf";
			case HandlerTypeCode.Add_Ovf_Un:	return "add.ovf.un";
			case HandlerTypeCode.And:			return "and";
			case HandlerTypeCode.Beq:			return "beq";
			case HandlerTypeCode.Bge:			return "bge";
			case HandlerTypeCode.Bge_Un:		return "bge.un";
			case HandlerTypeCode.Bgt:			return "bgt";
			case HandlerTypeCode.Bgt_Un:		return "bgt.un";
			case HandlerTypeCode.Ble:			return "ble";
			case HandlerTypeCode.Ble_Un:		return "ble.un";
			case HandlerTypeCode.Blt:			return "blt";
			case HandlerTypeCode.Blt_Un:		return "blt.un";
			case HandlerTypeCode.Bne_Un:		return "bne.un";
			case HandlerTypeCode.Box:			return "box";
			case HandlerTypeCode.Br:			return "br";
			case HandlerTypeCode.Brfalse:		return "brfalse";
			case HandlerTypeCode.Brtrue:		return "brtrue";
			case HandlerTypeCode.Call:			return "call";
			case HandlerTypeCode.Callvirt:		return "callvirt";
			case HandlerTypeCode.Castclass:		return "castclass";
			case HandlerTypeCode.Ceq:			return "ceq";
			case HandlerTypeCode.Cgt:			return "cgt";
			case HandlerTypeCode.Cgt_Un:		return "cgt.un";
			case HandlerTypeCode.Clt:			return "clt";
			case HandlerTypeCode.Clt_Un:		return "clt.un";
			case HandlerTypeCode.Conv:			return "conv";
			case HandlerTypeCode.Div:			return "div";
			case HandlerTypeCode.Div_Un:		return "div.un";
			case HandlerTypeCode.Dup:			return "dup";
			case HandlerTypeCode.Endfinally:	return "endfinally";
			case HandlerTypeCode.Initobj:		return "initobj";
			case HandlerTypeCode.Isinst:		return "isinst";
			case HandlerTypeCode.Ldarg:			return "ldarg";
			case HandlerTypeCode.Ldarga:		return "ldarga";
			case HandlerTypeCode.Ldc:			return "ldc";
			case HandlerTypeCode.Ldelem:		return "ldelem";
			case HandlerTypeCode.Ldelema:		return "ldelema";
			case HandlerTypeCode.Ldfld_Ldsfld:	return "ldfld/ldsfld";
			case HandlerTypeCode.Ldflda_Ldsflda:return "ldflda/ldsflda";
			case HandlerTypeCode.Ldftn:			return "ldftn";
			case HandlerTypeCode.Ldlen:			return "ldlen";
			case HandlerTypeCode.Ldloc:			return "ldloc";
			case HandlerTypeCode.Ldloca:		return "ldloca";
			case HandlerTypeCode.Ldobj:			return "ldobj";
			case HandlerTypeCode.Ldstr:			return "ldstr";
			case HandlerTypeCode.Ldtoken:		return "ldtoken";
			case HandlerTypeCode.Ldvirtftn:		return "ldvirtftn";
			case HandlerTypeCode.Leave:			return "leave";
			case HandlerTypeCode.Mul:			return "mul";
			case HandlerTypeCode.Mul_Ovf:		return "mul.ovf";
			case HandlerTypeCode.Mul_Ovf_Un:	return "mul.ovf.un";
			case HandlerTypeCode.Neg:			return "neg";
			case HandlerTypeCode.Newarr:		return "newarr";
			case HandlerTypeCode.Newobj:		return "newobj";
			case HandlerTypeCode.Nop:			return "nop";
			case HandlerTypeCode.Not:			return "not";
			case HandlerTypeCode.Or:			return "or";
			case HandlerTypeCode.Pop:			return "pop";
			case HandlerTypeCode.Rem:			return "rem";
			case HandlerTypeCode.Rem_Un:		return "rem.un";
			case HandlerTypeCode.Ret:			return "ret";
			case HandlerTypeCode.Rethrow:		return "rethrow";
			case HandlerTypeCode.Shl:			return "shl";
			case HandlerTypeCode.Shr:			return "shr";
			case HandlerTypeCode.Shr_Un:		return "shr.un";
			case HandlerTypeCode.Starg:			return "starg";
			case HandlerTypeCode.Stelem:		return "stelem";
			case HandlerTypeCode.Stfld_Stsfld:	return "stfld/stsfld";
			case HandlerTypeCode.Stloc:			return "stloc";
			case HandlerTypeCode.Stobj:			return "stobj";
			case HandlerTypeCode.Sub:			return "sub";
			case HandlerTypeCode.Sub_Ovf:		return "sub.ovf";
			case HandlerTypeCode.Sub_Ovf_Un:	return "sub.ovf.un";
			case HandlerTypeCode.Switch:		return "switch";
			case HandlerTypeCode.Throw:			return "throw";
			case HandlerTypeCode.Unbox_Any:		return "unbox.any";
			case HandlerTypeCode.Xor:			return "xor";
			default: throw new ApplicationException("Invalid handler type code");
			}
		}
		public OpCodeHandlerInfo(HandlerTypeCode typeCode) {
			this.TypeCode = typeCode;
			this.Name = GetHandlerName(typeCode);
		}
示例#6
0
 public MethodSigInfo(List <BlockSigInfo> blockSigInfos, HandlerTypeCode typeCode)
 {
     this.BlockSigInfos = blockSigInfos;
     this.TypeCode      = typeCode;
 }
示例#7
0
        public static string GetHandlerName(HandlerTypeCode code)
        {
            switch (code)
            {
            case HandlerTypeCode.Add:                       return("add");

            case HandlerTypeCode.Add_Ovf:           return("add.ovf");

            case HandlerTypeCode.Add_Ovf_Un:        return("add.ovf.un");

            case HandlerTypeCode.And:                       return("and");

            case HandlerTypeCode.Beq:                       return("beq");

            case HandlerTypeCode.Bge:                       return("bge");

            case HandlerTypeCode.Bge_Un:            return("bge.un");

            case HandlerTypeCode.Bgt:                       return("bgt");

            case HandlerTypeCode.Bgt_Un:            return("bgt.un");

            case HandlerTypeCode.Ble:                       return("ble");

            case HandlerTypeCode.Ble_Un:            return("ble.un");

            case HandlerTypeCode.Blt:                       return("blt");

            case HandlerTypeCode.Blt_Un:            return("blt.un");

            case HandlerTypeCode.Bne_Un:            return("bne.un");

            case HandlerTypeCode.Box:                       return("box");

            case HandlerTypeCode.Br:                        return("br");

            case HandlerTypeCode.Brfalse:           return("brfalse");

            case HandlerTypeCode.Brtrue:            return("brtrue");

            case HandlerTypeCode.Call:                      return("call");

            case HandlerTypeCode.Callvirt:          return("callvirt");

            case HandlerTypeCode.Castclass:         return("castclass");

            case HandlerTypeCode.Ceq:                       return("ceq");

            case HandlerTypeCode.Cgt:                       return("cgt");

            case HandlerTypeCode.Cgt_Un:            return("cgt.un");

            case HandlerTypeCode.Clt:                       return("clt");

            case HandlerTypeCode.Clt_Un:            return("clt.un");

            case HandlerTypeCode.Conv:                      return("conv");

            case HandlerTypeCode.Div:                       return("div");

            case HandlerTypeCode.Div_Un:            return("div.un");

            case HandlerTypeCode.Dup:                       return("dup");

            case HandlerTypeCode.Endfinally:        return("endfinally");

            case HandlerTypeCode.Initobj:           return("initobj");

            case HandlerTypeCode.Isinst:            return("isinst");

            case HandlerTypeCode.Ldarg:                     return("ldarg");

            case HandlerTypeCode.Ldarga:            return("ldarga");

            case HandlerTypeCode.Ldc:                       return("ldc");

            case HandlerTypeCode.Ldelem:            return("ldelem");

            case HandlerTypeCode.Ldelema:           return("ldelema");

            case HandlerTypeCode.Ldfld_Ldsfld:      return("ldfld/ldsfld");

            case HandlerTypeCode.Ldflda_Ldsflda: return("ldflda/ldsflda");

            case HandlerTypeCode.Ldftn:                     return("ldftn");

            case HandlerTypeCode.Ldlen:                     return("ldlen");

            case HandlerTypeCode.Ldloc:                     return("ldloc");

            case HandlerTypeCode.Ldloca:            return("ldloca");

            case HandlerTypeCode.Ldobj:                     return("ldobj");

            case HandlerTypeCode.Ldstr:                     return("ldstr");

            case HandlerTypeCode.Ldtoken:           return("ldtoken");

            case HandlerTypeCode.Ldvirtftn:         return("ldvirtftn");

            case HandlerTypeCode.Leave:                     return("leave");

            case HandlerTypeCode.Mul:                       return("mul");

            case HandlerTypeCode.Mul_Ovf:           return("mul.ovf");

            case HandlerTypeCode.Mul_Ovf_Un:        return("mul.ovf.un");

            case HandlerTypeCode.Neg:                       return("neg");

            case HandlerTypeCode.Newarr:            return("newarr");

            case HandlerTypeCode.Newobj:            return("newobj");

            case HandlerTypeCode.Nop:                       return("nop");

            case HandlerTypeCode.Not:                       return("not");

            case HandlerTypeCode.Or:                        return("or");

            case HandlerTypeCode.Pop:                       return("pop");

            case HandlerTypeCode.Rem:                       return("rem");

            case HandlerTypeCode.Rem_Un:            return("rem.un");

            case HandlerTypeCode.Ret:                       return("ret");

            case HandlerTypeCode.Rethrow:           return("rethrow");

            case HandlerTypeCode.Shl:                       return("shl");

            case HandlerTypeCode.Shr:                       return("shr");

            case HandlerTypeCode.Shr_Un:            return("shr.un");

            case HandlerTypeCode.Starg:                     return("starg");

            case HandlerTypeCode.Stelem:            return("stelem");

            case HandlerTypeCode.Stfld_Stsfld:      return("stfld/stsfld");

            case HandlerTypeCode.Stloc:                     return("stloc");

            case HandlerTypeCode.Stobj:                     return("stobj");

            case HandlerTypeCode.Sub:                       return("sub");

            case HandlerTypeCode.Sub_Ovf:           return("sub.ovf");

            case HandlerTypeCode.Sub_Ovf_Un:        return("sub.ovf.un");

            case HandlerTypeCode.Switch:            return("switch");

            case HandlerTypeCode.Throw:                     return("throw");

            case HandlerTypeCode.Unbox_Any:         return("unbox.any");

            case HandlerTypeCode.Xor:                       return("xor");

            default: throw new ApplicationException("Invalid handler type code");
            }
        }
示例#8
0
 public OpCodeHandlerInfo(HandlerTypeCode typeCode)
 {
     this.TypeCode = typeCode;
     this.Name     = GetHandlerName(typeCode);
 }
示例#9
0
 public OpCodeHandlerInfo(HandlerTypeCode typeCode)
 {
     TypeCode = typeCode;
     Name     = GetHandlerName(typeCode);
 }
示例#10
0
 public OpCodeHandlerInfo(HandlerTypeCode typeCode, MethodSigInfo execSig)
 {
     this.TypeCode = typeCode;
     this.Name     = GetHandlerName(typeCode);
     this.ExecSig  = execSig;
 }
		public Instruction Read(HandlerTypeCode typeCode, BinaryReader reader) {
			Func<BinaryReader, Instruction> readHandler;
			if (!readHandlers.TryGetValue(typeCode, out readHandler))
				throw new ApplicationException("Invalid handler type");
			return readHandler(reader);
		}
示例#12
0
		public MethodSigInfo(List<BlockSigInfo> blockSigInfos, HandlerTypeCode typeCode) {
			this.BlockSigInfos = blockSigInfos;
			this.TypeCode = typeCode;
		}
		public OpCodeHandlerInfo(HandlerTypeCode typeCode, MethodSigInfo execSig) {
			this.TypeCode = typeCode;
			this.Name = GetHandlerName(typeCode);
			this.ExecSig = execSig;
		}