// ---------------------------------------------------------------------- // 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; }
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; }