コード例 #1
0
        private void Initialize(string dexFilename, string mapfile, Func <AssemblyDefinition, string> filenameFromAssembly)
        {
            try
            {
                var readDex = Task.Factory.StartNew(() => DexLib.Dex.Read(dexFilename));
                var readMap = Task.Factory.StartNew(() => new MapFileLookup(new MapFile(mapfile)));

                Task.WaitAll(readMap, readDex);
                var dex = readDex.Result;
                var map = readMap.Result;

                _modifiedDetector = new AssemblyModifiedDetector(filenameFromAssembly, map);

                foreach (var type in map.TypeEntries)
                {
                    if (type.ScopeId == null)
                    {
                        continue;
                    }

                    var typeScopeId = GetTypeScopeId(type);

                    // redirect the generated class if neccessary.
                    var dexType = type.Id == 0 ? map.GeneratedType : type;

                    foreach (var method in type.Methods)
                    {
                        if (type.ScopeId == null)
                        {
                            continue;
                        }

                        var scopeKey = Tuple.Create(typeScopeId, method.ScopeId);
                        _methodsByScopeId[scopeKey] = Tuple.Create(dexType, method);
                    }
                }

                _dexLookup = new DexLookup(dex);

                _dex = dex;
                _map = map;
            }
            catch (Exception ex)
            {
                IsEnabled = false;
                DLog.Warning(DContext.CompilerCodeGenerator, "Unable to initialize compiler cache: {0}", ex.Message);
            }
        }
コード例 #2
0
        public MethodBody GetMethodBody(MethodDefinition targetMethod, XMethodDefinition sourceMethod)
        {
            var javaType  = (XBuilder.JavaTypeDefinition)sourceMethod.DeclaringType;
            var className = javaType.ClassFile.ClassName;
            var source    = javaType.ClassFile.Loader.TryGetClassSource(className);

            if (source == null)
            {
                return(null);
            }

            DexLookup dex       = GetOrCreateDex(source, waitForResult: true);
            var       methodDef = dex.GetMethod(targetMethod.Owner.Fullname, targetMethod.Name, targetMethod.Prototype.ToSignature());

            return(methodDef == null ? null : methodDef.Body);
        }