void detectHandlers(List <TypeDef> handlerTypes, CsvmInfo csvmInfo)
        {
            opCodeHandlers = new List <OpCodeHandler>();
            var detected = new List <OpCodeHandler>();

            foreach (var handlersList in OpCodeHandlers.opcodeHandlers)
            {
                opCodeHandlers.Clear();

                foreach (var handlerType in handlerTypes)
                {
                    var info = new UnknownHandlerInfo(handlerType, csvmInfo);
                    detected.Clear();
                    foreach (var opCodeHandler in handlersList)
                    {
                        if (opCodeHandler.detect(info))
                        {
                            detected.Add(opCodeHandler);
                        }
                    }
                    if (detected.Count != 1)
                    {
                        goto next;
                    }
                    opCodeHandlers.Add(detected[0]);
                }
                if (new List <OpCodeHandler>(Utils.unique(opCodeHandlers)).Count == opCodeHandlers.Count)
                {
                    return;
                }
                next :;
            }
            throw new ApplicationException("Could not detect all VM opcode handlers");
        }
        public bool detect(UnknownHandlerInfo info)
        {
            var sigInfo = OpCodeHandlerSigInfo;

            if (!compare(sigInfo.NumStaticMethods, info.NumStaticMethods))
                return false;
            if (!compare(sigInfo.NumInstanceMethods, info.NumInstanceMethods))
                return false;
            if (!compare(sigInfo.NumVirtualMethods, info.NumVirtualMethods))
                return false;
            if (!compare(sigInfo.NumCtors, info.NumCtors))
                return false;
            if (!compare(sigInfo.ExecuteMethodThrows, info.ExecuteMethodThrows))
                return false;
            if (!compare(sigInfo.ExecuteMethodPops, info.ExecuteMethodPops))
                return false;
            if (!info.hasSameFieldTypes(sigInfo.RequiredFieldTypes))
                return false;
            if (sigInfo.ExecuteMethodLocals != null && !new LocalTypes(info.ExecuteMethod).all(sigInfo.ExecuteMethodLocals))
                return false;

            if (Check != null)
                return Check(info);
            return true;
        }
        public bool detect(UnknownHandlerInfo info)
        {
            var sigInfo = OpCodeHandlerSigInfo;

            if (!compare(sigInfo.NumStaticMethods, info.NumStaticMethods))
            {
                return(false);
            }
            if (!compare(sigInfo.NumInstanceMethods, info.NumInstanceMethods))
            {
                return(false);
            }
            if (!compare(sigInfo.NumVirtualMethods, info.NumVirtualMethods))
            {
                return(false);
            }
            if (!compare(sigInfo.NumCtors, info.NumCtors))
            {
                return(false);
            }
            if (!compare(sigInfo.ExecuteMethodThrows, info.ExecuteMethodThrows))
            {
                return(false);
            }
            if (!compare(sigInfo.ExecuteMethodPops, info.ExecuteMethodPops))
            {
                return(false);
            }
            if (!info.hasSameFieldTypes(sigInfo.RequiredFieldTypes))
            {
                return(false);
            }
            if (sigInfo.ExecuteMethodLocals != null && !new LocalTypes(info.ExecuteMethod).all(sigInfo.ExecuteMethodLocals))
            {
                return(false);
            }

            if (Check != null)
            {
                return(Check(info));
            }
            return(true);
        }
        void detectHandlers(List<TypeDef> handlerTypes, CsvmInfo csvmInfo)
        {
            opCodeHandlers = new List<OpCodeHandler>();
            var detected = new List<OpCodeHandler>();

            foreach (var handlersList in OpCodeHandlers.opcodeHandlers) {
                opCodeHandlers.Clear();

                foreach (var handlerType in handlerTypes) {
                    var info = new UnknownHandlerInfo(handlerType, csvmInfo);
                    detected.Clear();
                    foreach (var opCodeHandler in handlersList) {
                        if (opCodeHandler.detect(info))
                            detected.Add(opCodeHandler);
                    }
                    if (detected.Count != 1)
                        goto next;
                    opCodeHandlers.Add(detected[0]);
                }
                if (new List<OpCodeHandler>(Utils.unique(opCodeHandlers)).Count == opCodeHandlers.Count)
                    return;
            next: ;
            }
            throw new ApplicationException("Could not detect all VM opcode handlers");
        }
 static bool throw_check(UnknownHandlerInfo info)
 {
     return !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodInfo System.Type::GetMethod(System.String,System.Reflection.BindingFlags)");
 }
 static bool ret_check(UnknownHandlerInfo info)
 {
     return DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)");
 }
 static bool rethrow_check(UnknownHandlerInfo info)
 {
     return info.ExecuteMethod.Body.Variables.Count == 0;
 }
 static bool nop_check(UnknownHandlerInfo info)
 {
     return isEmptyMethod(info.ReadMethod) && isEmptyMethod(info.ExecuteMethod);
 }
 static bool leave_check(UnknownHandlerInfo info)
 {
     return !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)") &&
         !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Type System.Reflection.Module::ResolveType(System.Int32)") &&
         !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MemberInfo System.Reflection.Module::ResolveMember(System.Int32)");
 }
 static bool throw_check(UnknownHandlerInfo info)
 {
     return(!DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodInfo System.Type::GetMethod(System.String,System.Reflection.BindingFlags)"));
 }
 static bool rethrow_check(UnknownHandlerInfo info)
 {
     return(info.ExecuteMethod.Body.Variables.Count == 0);
 }
 static bool ret_check(UnknownHandlerInfo info)
 {
     return(DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)"));
 }
 static bool nop_check(UnknownHandlerInfo info)
 {
     return(isEmptyMethod(info.ReadMethod) && isEmptyMethod(info.ExecuteMethod));
 }
 static bool leave_check(UnknownHandlerInfo info)
 {
     return(!DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)") &&
            !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Type System.Reflection.Module::ResolveType(System.Int32)") &&
            !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MemberInfo System.Reflection.Module::ResolveMember(System.Int32)"));
 }