Пример #1
0
        // Obfuscate all local symbols
        //  - enumerate all local symbols and tell the symbol allocator
        //    that it can be obfuscated.
        //    - where there are `holes` in the rank mapping, tell the symbol
        //    allocator to reserve those symbols.  These holes are to be
        //    filled by higher frequency symbols on the inner scopes.
        public void ObfuscateSymbols(RenderContext ctx, SymbolFrequency SymbolFrequency, SymbolAllocator Allocator, string prefix)
        {
            // Walk through local symbols
            int expectedRank = 0;
            foreach (var symbol in SymbolFrequency.Sort())
            {
                // Ignore public symbols
                if (symbol.Accessibility != Accessibility.Private)
                    continue;

                // Ignore non-local symbols
                if (symbol.Scope != Symbol.ScopeType.local)
                    continue;

                // Reserve space for inner, higher frequency symbols
                if (symbol.Rank > expectedRank)
                {
                    if (ctx.Compiler.Formatted && ctx.Compiler.SymbolInfo)
                    {
                        for (int r = expectedRank; r < symbol.Rank; r++)
                        {
                            ctx.StartLine();
                            ctx.AppendFormat("// #{0} reserved", r);
                        }
                    }
                    Allocator.ReserveObfuscatedSymbols(symbol.Rank - expectedRank);
                }

                string newSymbol = Allocator.OnfuscateSymbol(symbol.Name);

                // Show info
                if (ctx.Compiler.Formatted && ctx.Compiler.SymbolInfo)
                {
                    ctx.StartLine();
                    ctx.AppendFormat("// #{0} {3}{1} -> {3}{2}", symbol.Rank, symbol.Name, newSymbol, prefix);
                }

                expectedRank = symbol.Rank + 1;
            }
        }
Пример #2
0
        // Prepare symbol ranks of all local symbols
        //  - For each inner scope, merge this symbol frequency map
        //    of this scope with that of the inner scope
        //  - Update the rank of each symbol
        //  - Repeat for each inner scope
        public void Prepare()
        {
            // Recurse through all scopes
            foreach (var i in InnerScopes)
            {
                i.Prepare();
            }

            // Apply default accessibility to own local symbols
            foreach (var i in Symbols)
            {
                if (i.Value.Accessibility == Accessibility.Default)
                {
                    i.Value.Accessibility = DefaultAccessibility;
                }
            }

            // Calculate base rank based on frequency of our own
            // local symbols
            Symbols.UpdateRanks(Symbols.Sort());

            // Merge each inner scope and update ranks
            foreach (var i in InnerScopes)
            {
                var merged = new SymbolFrequency();
                merged.CopyFrom(Symbols);
                merged.MergeSymbols(i.AllSymbols);

                Symbols.UpdateRanks(merged.Sort());
            }

            // Member symbol
            Members.UpdateRanks(Members.Sort());
            foreach (var i in InnerScopes)
            {
                var merged = new SymbolFrequency();
                merged.CopyFrom(Members);
                merged.MergeSymbols(i.AllMembers);

                Members.UpdateRanks(merged.Sort());
            }
        }
Пример #3
0
        // Dump to stdout
        public void Dump(int indent)
        {
            Utils.WriteIndentedLine(indent, "Scope: {0}", Node);

            if (Symbols.Sort().Count>0)
            {
                Utils.WriteIndentedLine(indent + 1, "Local Symbols:");
                Symbols.Dump(indent + 2);
            }

            foreach (var i in InnerScopes)
            {
                var merged = new SymbolFrequency();
                merged.CopyFrom(Symbols);
                merged.MergeSymbols(i.AllSymbols);

                if (merged.Sort().Count > 0)
                {
                    Utils.WriteIndentedLine(indent + 1, "Symbols after merge with {0}:", i.Node);
                    merged.Dump(indent + 2);
                }
            }

            foreach (var i in InnerScopes)
            {
                i.Dump(indent + 1);
            }
        }