MonoDebugTypeCreator(DbgEngineImpl engine, TypeCache typeCache, MonoTypeLoader monoTypeLoader) { this.engine = engine; this.typeCache = typeCache; this.monoTypeLoader = monoTypeLoader; recursionCounter = 0; }
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 GetMethodCore(DmdMethodBase method, MonoTypeLoader monoTypeLoader) { MethodMirror monoMethod; var mi = method as DmdMethodInfo; if ((object)mi != 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 != 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); } } else { monoMethod = TryGetMethodCore2(method, monoTypeLoader); if (monoMethod != null) { return(monoMethod); } } throw new InvalidOperationException(); }
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); }
public static MethodMirror GetMethod(DmdMethodBase method, MonoTypeLoader monoTypeLoader) => GetOrCreate(method.AppDomain).GetMethodCore(method, monoTypeLoader);