Пример #1
0
        public Dictionary <string, string> Merge()
        {
            // 排序编译单元
            var sortedUnits = UnitMap.Values.ToList();

            sortedUnits.Sort((lhs, rhs) => GetDependOrder(lhs).CompareTo(GetDependOrder(rhs)));

            // 合并编译单元
            UnitMap.Clear();
            var transMap = new Dictionary <string, string>();

            // 收集桥接代码的所有依赖项
            var bridgeUnitNames = new HashSet <string>();
            var bridgeUnits     = new List <CompileUnit>();
            var remainUnits     = new List <CompileUnit>();

            for (; ;)
            {
                bool changed = false;
                foreach (var unit in sortedUnits)
                {
                    string unitName = unit.Name;
                    if (BridgeTypes.Contains(unitName) ||
                        bridgeUnitNames.Contains(unitName))
                    {
                        bridgeUnits.Add(unit);
                        bridgeUnitNames.Add(unitName);
                        bridgeUnitNames.UnionWith(unit.DeclDepends);
                        changed = true;
                    }
                    else
                    {
                        remainUnits.Add(unit);
                    }
                }

                if (changed)
                {
                    sortedUnits = remainUnits;
                    remainUnits = new List <CompileUnit>();
                }
                else
                {
                    break;
                }
            }
            bridgeUnits.Sort((lhs, rhs) => GetDependOrder(lhs).CompareTo(GetDependOrder(rhs)));

            // 生成桥接单元
            CompileUnit bridgeUnit = new CompileUnit();

            bridgeUnit.Name = "il2cppBridge";
            UnitMap.Add(bridgeUnit.Name, bridgeUnit);

            foreach (var unit in bridgeUnits)
            {
                bridgeUnit.DeclCode += "#define IL2CPP_BRIDGE_HAS_" + unit.Name + '\n';
                bridgeUnit.Append(unit);
                transMap[unit.Name] = bridgeUnit.Name;
            }

            // 划分其他编译单元
            CompileUnit currUnit = NewUnit();

            foreach (var unit in sortedUnits)
            {
                Debug.Assert(!bridgeUnit.DeclDepends.Contains(unit.Name));
                currUnit.Append(unit);
                transMap[unit.Name] = currUnit.Name;
                if (IsUnitFull(currUnit))
                {
                    currUnit = NewUnit();
                }
            }

            if (currUnit.IsEmpty())
            {
                UnitMap.Remove(currUnit.Name);
            }

            foreach (var unit in UnitMap.Values)
            {
                var declDeps = new HashSet <string>();
                foreach (string dep in unit.DeclDepends)
                {
                    declDeps.Add(transMap[dep]);
                }
                unit.DeclDepends = declDeps;

                var implDeps = new HashSet <string>();
                foreach (string dep in unit.ImplDepends)
                {
                    implDeps.Add(transMap[dep]);
                }
                unit.ImplDepends = implDeps;

                unit.Optimize(UnitMap);
            }

            return(transMap);
        }
Пример #2
0
        public Dictionary <string, string> Merge()
        {
            // 排序编译单元
            var sortedUnits = UnitMap.Values.ToList();

            sortedUnits.Sort((lhs, rhs) => GetDependOrder(lhs).CompareTo(GetDependOrder(rhs)));

            // 合并编译单元
            UnitMap.Clear();
            var transMap = new Dictionary <string, string>();

            CompileUnit bridgeUnit = new CompileUnit();

            bridgeUnit.Name = "il2cppBridge";
            UnitMap.Add(bridgeUnit.Name, bridgeUnit);

            CompileUnit currUnit = NewUnit();

            foreach (var unit in sortedUnits)
            {
                if (BridgeTypes.Contains(unit.Name))
                {
                    bridgeUnit.Append(unit);
                    transMap[unit.Name] = bridgeUnit.Name;
                }
                else
                {
                    currUnit.Append(unit);
                    transMap[unit.Name] = currUnit.Name;
                    if (IsUnitFull(currUnit))
                    {
                        currUnit = NewUnit();
                    }
                }
            }

            if (currUnit.IsEmpty())
            {
                UnitMap.Remove(currUnit.Name);
            }

            foreach (var unit in UnitMap.Values)
            {
                var declDeps = new HashSet <string>();
                foreach (string dep in unit.DeclDepends)
                {
                    declDeps.Add(transMap[dep]);
                }
                unit.DeclDepends = declDeps;

                var implDeps = new HashSet <string>();
                foreach (string dep in unit.ImplDepends)
                {
                    implDeps.Add(transMap[dep]);
                }
                unit.ImplDepends = implDeps;

                unit.Optimize(UnitMap);
            }

            return(transMap);
        }