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);
        }
Example #3
0
        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();
        }
Example #4
0
        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);
        }
Example #5
0
 public static MethodMirror GetMethod(DmdMethodBase method, MonoTypeLoader monoTypeLoader) =>
 GetOrCreate(method.AppDomain).GetMethodCore(method, monoTypeLoader);