MethodMirror GetMethodCore(DmdMethodBase method, MonoTypeLoader?monoTypeLoader) { MethodMirror?monoMethod; var mi = method as DmdMethodInfo; if (mi is not null && mi.IsConstructedGenericMethod) { if (toMonoMethod.TryGetValue(method, out monoMethod)) { return(monoMethod); } if (!engine.MonoVirtualMachine.Version.AtLeast(2, 24)) { throw new InvalidOperationException(); } monoMethod = TryGetMethodCore2(mi.GetGenericMethodDefinition(), monoTypeLoader); if (monoMethod is not null) { var genArgs = mi.GetGenericArguments(); var monoGenArgs = new TypeMirror[genArgs.Count]; for (int i = 0; i < monoGenArgs.Length; i++) { monoGenArgs[i] = MonoDebugTypeCreator.GetType(engine, genArgs[i], monoTypeLoader); } monoMethod = monoMethod.MakeGenericMethod(monoGenArgs); toMonoMethod[method] = monoMethod; return(monoMethod); } }
public static TypeMirror GetType(DbgEngineImpl engine, DmdType type, MonoTypeLoader monoTypeLoader) { var typeCache = TypeCache.GetOrCreate(type.AppDomain); if (typeCache.TryGetType(type, out var monoType)) { return(monoType); } var info = new MonoDebugTypeCreator(engine, typeCache, monoTypeLoader).Create(type); monoType = info.type; return(monoType); }
MethodMirror TryGetMethodCore2(DmdMethodBase method, MonoTypeLoader monoTypeLoader) { if (toMonoMethod.TryGetValue(method, out var monoMethod)) { return(monoMethod); } var monoType = MonoDebugTypeCreator.GetType(engine, method.ReflectedType, monoTypeLoader); var methodDeclType = method.ReflectedType; while (methodDeclType != method.DeclaringType) { methodDeclType = methodDeclType.BaseType; monoType = monoType.BaseType ?? MonoDebugTypeCreator.GetType(engine, method.AppDomain.System_Object, monoTypeLoader); } var monoMethods = monoType.GetMethods(); var methods = methodDeclType.DeclaredMethods; if (monoMethods.Length != methods.Count) { throw new InvalidOperationException(); } for (int i = 0; i < monoMethods.Length; i++) { Debug.Assert(methods[i].Name == monoMethods[i].Name); Debug.Assert(methods[i].GetMethodSignature().GetParameterTypes().Count == monoMethods[i].GetParameters().Length); toMonoMethod[methods[i]] = monoMethods[i]; } if (toMonoMethod.TryGetValue(method, out monoMethod)) { return(monoMethod); } return(null); }
static TypeMirror GetType(DbgEngineImpl engine, DmdType type) => MonoDebugTypeCreator.GetType(engine, type, null);
TypeMirror GetType(DmdType type) => MonoDebugTypeCreator.GetType(engine, type, null);