public ILBlockTranslator(AssemblyTranslator translator, DecompilerContext context, MethodReference methodReference, MethodDefinition methodDefinition, ILBlock ilb, IEnumerable<ILVariable> parameters, IEnumerable<ILVariable> allVariables) { Translator = translator; Context = context; ThisMethodReference = methodReference; ThisMethod = methodDefinition; Block = ilb; SpecialIdentifiers = new JSIL.SpecialIdentifiers(TypeSystem); if (methodReference.HasThis) Variables.Add("this", JSThisParameter.New(methodReference.DeclaringType, methodReference)); foreach (var parameter in parameters) { if ((parameter.Name == "this") && (parameter.OriginalParameter.Index == -1)) continue; ParameterNames.Add(parameter.Name); Variables.Add(parameter.Name, new JSParameter(parameter.Name, parameter.Type, methodReference)); } foreach (var variable in allVariables) { var v = JSVariable.New(variable, methodReference); if (Variables.ContainsKey(v.Identifier)) { v = new JSVariable(variable.OriginalVariable.Name, variable.Type, methodReference); RenamedVariables[variable] = v; Variables.Add(v.Identifier, v); } else { Variables.Add(v.Identifier, v); } } }
private void OptimizeFunction( SpecialIdentifiers si, HashSet<string> parameterNames, Dictionary<string, JSVariable> variables, JSFunctionExpression function ) { // Run elimination repeatedly, since eliminating one variable may make it possible to eliminate others if (EliminateTemporaries) { bool eliminated; do { var visitor = new EliminateSingleUseTemporaries( si.TypeSystem, variables, FunctionCache ); visitor.Visit(function); eliminated = visitor.EliminatedVariables.Count > 0; } while (eliminated); } new EmulateStructAssignment( si.TypeSystem, FunctionCache, si.CLR, OptimizeStructCopies ).Visit(function); new IntroduceVariableDeclarations( variables, TypeInfoProvider ).Visit(function); new IntroduceVariableReferences( si.JSIL, variables, parameterNames ).Visit(function); if (SimplifyLoops) new SimplifyLoops( si.TypeSystem ).Visit(function); // Temporary elimination makes it possible to simplify more operators, so do it last if (SimplifyOperators) new SimplifyOperators( si.JSIL, si.JS, si.TypeSystem ).Visit(function); new IntroduceEnumCasts( si.TypeSystem ).Visit(function); }