Exemple #1
0
        // ----------------------------------------------------------------------
        // SimpliferDatabase
        // ----------------------------------------------------------------------

        bool CST.ISimplifierDatabase.IsInlinableImported(CST.MethodRef methodRef)
        {
            var assemblyDef = default(CST.AssemblyDef);
            var typeDef = default(CST.TypeDef);
            var memberDef = default(CST.MemberDef);
            if (methodRef.PrimTryResolve(env.Global, out assemblyDef, out typeDef, out memberDef))
                return env.InteropManager.IsInlinable
                    (assemblyDef,
                     typeDef,
                     (CST.MethodDef)memberDef,
                     env.InteropManager.GetTypeRepresentation(assemblyDef, typeDef).State);
            else
                return false;
        }
        private int MethodBodySize(CST.QualifiedMemberName name)
        {
            var s = default(int);
            if (bodySizeCache.TryGetValue(name, out s))
                // Already determined
                return s;

            var assemblyDef = default(CST.AssemblyDef);
            var typeDef = default(CST.TypeDef);
            var memberDef = default(CST.MemberDef);
            if (name.PrimTryResolve(env.Global, out assemblyDef, out typeDef, out memberDef))
            {
                var methodDef = (CST.MethodDef)memberDef;

                if (PrimIsInlinable(assemblyDef, typeDef, methodDef))
                {
                    // Local method size, ignoring inlining
                    var instructions = methodDef.Instructions(env.Global);
                    s = instructions.Size;

                    // Collect calls
                    foreach (var call in methodDef.UsedMembers.Where(n => n.Signature.Flavor == CST.MemberDefFlavor.Method))
                    {
                        var t = MethodBodySize(call);
                        if (t >= 0)
                            // Inlinable method, replace call with body
                            s += t - 1;
                    }
                }
                else
                    // Obviously non-inlinable method
                    s = -1;
            }
            else
                s = -1;

            bodySizeCache.Add(name, s);
            return s;
        }
Exemple #3
0
 bool CST.ISimplifierDatabase.IsNoInteropResult(CST.MethodRef methodRef)
 {
     var assemblyDef = default(CST.AssemblyDef);
     var typeDef = default(CST.TypeDef);
     var memberDef = default(CST.MemberDef);
     if (methodRef.PrimTryResolve(env.Global, out assemblyDef, out typeDef, out memberDef))
         return env.InteropManager.IsNoInteropResult(assemblyDef, typeDef, (CST.MethodDef)memberDef);
     else
         return false;
 }