Ejemplo n.º 1
0
        private AbstractStackState <VariabilityInfo> HandleCpobj(ILInstruction ili, AbstractStackState <VariabilityInfo> pre)
        {
            VariabilityInfo source = pre[0];
            VariabilityInfo dest   = pre[1];
            AbstractStackState <VariabilityInfo> next = UpdateStackState(ili, source, pre);

            next = next.Pop().Pop();
            return(next.UniqueSuccessor());
        }
Ejemplo n.º 2
0
        private AbstractStackState <VariabilityInfo> HandleRet(ILInstruction ili, AbstractStackState <VariabilityInfo> pre)
        {
            Type returnType;

            if (Method.IsFunction(out returnType))
            {
                return(pre.Pop().UniqueSuccessor());
            }
            else
            {
                return(pre.UniqueSuccessor());
            }
        }
Ejemplo n.º 3
0
        private AbstractStackState <VariabilityInfo> HandleCall(ILInstruction ili, AbstractStackState <VariabilityInfo> pre, bool isCalli)
        {
            MethodBase   callee  = (MethodBase)ili.Operand;
            bool         hasThis = callee.CallingConvention.HasFlag(CallingConventions.HasThis);
            EVariability callVar = EVariability.Constant;

            ParameterInfo[] args        = callee.GetParameters();
            MethodFacts     myFacts     = FactUniverse.Instance.GetFacts(Method);
            MethodFacts     calleeFacts = FactUniverse.Instance.GetFacts(callee);
            AbstractStackState <VariabilityInfo> next = pre;

            if (hasThis)
            {
                callVar = VariabilityOperations.Stronger(callVar, pre[0].Variability);
                next    = pre.Pop();
            }
            for (int i = 0; i < args.Length; i++)
            {
                callVar = VariabilityOperations.Stronger(callVar, next[0].Variability);
                next    = next.Pop();
            }
            if (!calleeFacts.IsSideEffectFree)
            {
                callVar = EVariability.ExternVariable;
            }
            if (calleeFacts.IsStaticEvaluation)
            {
                callVar = EVariability.Constant;
            }
            if (isCalli)
            {
                next = pre.Pop();
            }
            VariabilityInfo callVarI = VariabilityInfo.CreateBySingleDef(callVar, ili.Index);

            next = UpdateStackState(ili, callVarI, next);
            Type returnType;

            if (callee.IsFunction(out returnType))
            {
                next = next.Push(callVarI);
            }
            return(next.UniqueSuccessor());
        }
Ejemplo n.º 4
0
 private AbstractStackState <VariabilityInfo> Nop(ILInstruction ili, AbstractStackState <VariabilityInfo> pre)
 {
     return(pre.UniqueSuccessor());
 }