コード例 #1
0
ファイル: RTConstants.cs プロジェクト: hmyit/KoiVM
        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();
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        private bool ContainsBehavior <T>(VMDescriptor descriptor) where T : IBehavior
        {
            T behavior;

            return(descriptor.Behaviors.TryGetBehavior <T>(out behavior));
        }