public void InjectConstants(ModuleDef rtModule, VMDescriptor desc, RuntimeHelpers helpers) { var constants = rtModule.Find(RTMap.VMConstants, true); var cctor = constants.FindOrCreateStaticConstructor(); var instrs = cctor.Body.Instructions; instrs.Clear(); for (var i = 0; i < (int)VMRegisters.Max; i++) { var reg = (VMRegisters)i; var regId = desc.Architecture.Registers[reg]; var regField = reg.ToString(); AddField(regField, regId); } for (var i = 0; i < (int)VMFlags.Max; i++) { var fl = (VMFlags)i; var flId = desc.Architecture.Flags[fl]; var flField = fl.ToString(); AddField(flField, 1 << flId); } for (var i = 0; i < (int)ILOpCode.Max; i++) { var op = (ILOpCode)i; var opId = desc.Architecture.OpCodes[op]; var opField = op.ToString(); AddField(opField, opId); } for (var i = 0; i < (int)VMCalls.Max; i++) { var vc = (VMCalls)i; var vcId = desc.Runtime.VMCall[vc]; var vcField = vc.ToString(); AddField(vcField, vcId); } AddField(ConstantFields.E_CALL.ToString(), (int)desc.Runtime.VCallOps.ECALL_CALL); AddField(ConstantFields.E_CALLVIRT.ToString(), (int)desc.Runtime.VCallOps.ECALL_CALLVIRT); AddField(ConstantFields.E_NEWOBJ.ToString(), (int)desc.Runtime.VCallOps.ECALL_NEWOBJ); AddField(ConstantFields.E_CALLVIRT_CONSTRAINED.ToString(), (int)desc.Runtime.VCallOps.ECALL_CALLVIRT_CONSTRAINED); AddField(ConstantFields.INIT.ToString(), (int)helpers.INIT); AddField(ConstantFields.INSTANCE.ToString(), desc.Runtime.RTFlags.INSTANCE); AddField(ConstantFields.CATCH.ToString(), desc.Runtime.RTFlags.EH_CATCH); AddField(ConstantFields.FILTER.ToString(), desc.Runtime.RTFlags.EH_FILTER); AddField(ConstantFields.FAULT.ToString(), desc.Runtime.RTFlags.EH_FAULT); AddField(ConstantFields.FINALLY.ToString(), desc.Runtime.RTFlags.EH_FINALLY); Conclude(desc.Random, instrs, constants); instrs.Add(Instruction.Create(OpCodes.Ret)); cctor.Body.OptimizeMacros(); }
private void Init(ModuleDef rt) { Descriptor = new VMDescriptor(settings); methodMap = new Dictionary <MethodDef, Tuple <ScopeBlock, ILBlock> >(); basicBlocks = new List <Tuple <MethodDef, ILBlock> >(); extraChunks = new List <IKoiChunk>(); finalChunks = new List <IKoiChunk>(); serializer = new BasicBlockSerializer(this); rtMutator = new RuntimeMutator(rt, this); rtMutator.RequestKoi += OnKoiRequested; }
private bool ContainsBehavior <T>(VMDescriptor descriptor) where T : IBehavior { T behavior; return(descriptor.Behaviors.TryGetBehavior <T>(out behavior)); }