/// <summary> /// Convert the given method into optimized Ast format. /// </summary> internal protected static AstNode CreateOptimizedAst(AssemblyCompiler compiler, MethodSource source, bool generateSetNextInstructionCode, StopAstConversion debugStop = StopAstConversion.None, AstOptimizationStep debugStopOptimizing = AstOptimizationStep.None ) { // Build AST DecompilerContext context; AstBlock ast; if (source.IsDotNet) { context = new DecompilerContext(source.Method); var astBuilder = new IL2Ast.AstBuilder(source.ILMethod, true, context); var children = astBuilder.Build(); ast = new AstBlock(children.Select(x => x.SourceLocation).FirstOrDefault(), children); if ((source.ILMethod.IsConstructor) && (source.Method.DeclaringType.Fields.Any(x => x.FieldType.IsEnum() || x.Name.EndsWith(NameConstants.Atomic.FieldUpdaterPostfix)))) { // Ensure all fields are initialized AddFieldInitializationCode(compiler, source, ast); } if (source.Method.NeedsGenericInstanceTypeParameter && (source.Name == ".ctor")) { // Add code to save the generic instance type parameter into the generic instance field. AddGenericInstanceFieldInitializationCode(source, ast, compiler.Module.TypeSystem); } } else if (source.IsJava) { var astBuilder = new Java2Ast.AstBuilder(compiler.Module, source.JavaMethod, source.Method.DeclaringType, true); context = new DecompilerContext(source.Method); ast = astBuilder.Build(); } else if (source.IsAst) { context = new DecompilerContext(source.Method); ast = source.Ast; } else { throw new NotSupportedException("Unknown source"); } if (debugStop == StopAstConversion.AfterILConversion) return ast; // Optimize AST var astOptimizer = new AstOptimizer(context, ast); astOptimizer.Optimize(debugStopOptimizing); if (debugStop == StopAstConversion.AfterOptimizing) return ast; // Optimize AST towards the target TargetConverters.Convert(context, ast, source, compiler, debugStop); if(generateSetNextInstructionCode) SetNextInstructionGenerator.Convert(ast, source, compiler); // Return return return ast; }
public StopMenuCommandAttribute(StopAstConversion code) { Menu = "Dot42 De_xInput"; MenuCategory = "Stop"; Header = code == StopAstConversion.None ? "Full Pocessing" : "Stop after " + code.ToString().Replace("After", ""); MenuOrder = (int)code; StopCode = code; }
public StopMenuCommandAttribute(StopAstConversion code) { Menu = "Dot42 De_xInput"; MenuCategory = "Stop"; Header = code == StopAstConversion.None ? "Full Pocessing" : "Stop after " + code.ToString().Replace("After", ""); MenuOrder = (int) code; StopCode = code; }
private static void UpdateCheckedState(StopAstConversion stopCode) { foreach (MenuItem mainItem in MainWindow.Instance.GetMainMenuItems()) foreach (object itemObj in mainItem.Items) { var item = itemObj as MenuItem; if (item == null || !(item.Command is StopMenuCommand)) continue; item.IsCheckable = true; var attr = GetAttribute(item.Command); item.IsChecked = attr.StopCode == stopCode; } }
private static void UpdateCheckedState(StopAstConversion stopCode) { foreach (MenuItem mainItem in MainWindow.Instance.GetMainMenuItems()) { foreach (object itemObj in mainItem.Items) { var item = itemObj as MenuItem; if (item == null || !(item.Command is StopMenuCommand)) { continue; } item.IsCheckable = true; var attr = GetAttribute(item.Command); item.IsChecked = attr.StopCode == stopCode; } } }
/// <summary> /// Perform all dot42 related Ast conversions. /// </summary> public static void Convert(DecompilerContext context, AstBlock ast, MethodSource currentMethod, AssemblyCompiler compiler, StopAstConversion stop = StopAstConversion.None) { if (ast.IsOptimizedForTarget) { return; } #if DEBUG //Debugger.Launch(); if ((currentMethod.Method != null) && (currentMethod.Method.Name.Equals("runTest", StringComparison.OrdinalIgnoreCase))) { //Debugger.Launch(); } #endif IntPtrConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterIntPtrConverter) { return; } TypeOfConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterTypeOfConverter) { return; } // TODO: check if we actually need this optimizer, as we have a more throughoutful // optimizer as the last step. BranchOptimizer.Convert(ast); if (stop == StopAstConversion.AfterBranchOptimizer) { return; } CompoundAssignmentConverter.Convert(ast); if (stop == StopAstConversion.AfterCompoundAssignmentConverter) { return; } // keep this order FixAsyncStateMachine.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterFixAsyncStateMachine) { return; } InterlockedConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterInterlockedConverter) { return; } ByReferenceParamConverter.Convert(context, ast, compiler); if (stop == StopAstConversion.AfterByReferenceParamConverter) { return; } // end CompareUnorderedConverter.Convert(ast); if (stop == StopAstConversion.AfterCompareUnorderedConverter) { return; } EnumConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterEnumConverter) { return; } EnumOptimizer.Convert(ast, compiler); if (stop == StopAstConversion.AfterEnumOptimizer) { return; } // Keep this order NullableConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterNullableConverter) { return; } PrimitiveAddressOfConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterPrimitiveAddressOfConverter) { return; } StructCallConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterStructCallConverter) { return; } // end InitializeStructVariablesConverter.Convert(ast); if (stop == StopAstConversion.AfterInitializeStructVariablesConverter) { return; } DelegateConverter.Convert(ast); if (stop == StopAstConversion.AfterDelegateConverter) { return; } LdcWideConverter.Convert(ast); if (stop == StopAstConversion.AfterLdcWideConverter) { return; } LdLocWithConversionConverter.Convert(ast); if (stop == StopAstConversion.AfterLdLocWithConversionConverter) { return; } ConvertAfterLoadConversionConverter.Convert(ast); if (stop == StopAstConversion.AfterConvertAfterLoadConversionConverter) { return; } ConvertBeforeStoreConversionConverter.Convert(ast); if (stop == StopAstConversion.AfterConvertBeforeStoreConversionConverter) { return; } CleanupConverter.Convert(ast); if (stop == StopAstConversion.AfterCleanupConverter) { return; } GenericsConverter.Convert(ast, currentMethod, compiler.Module.TypeSystem); if (stop == StopAstConversion.AfterGenericsConverter) { return; } // Expand cast expressions CastConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterCastConverter) { return; } // Expand generic instance information GenericInstanceConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterGenericInstanceConverter) { return; } // run the branch optimizer again. (do we need the first invocation?) BranchOptimizer2.Convert(ast, compiler); if (stop == StopAstConversion.AfterBranchOptimizer2) { return; } }
/// <summary> /// Perform all dot42 related Ast conversions. /// </summary> public static void Convert(DecompilerContext context, AstBlock ast, MethodSource currentMethod, AssemblyCompiler compiler, StopAstConversion stop = StopAstConversion.None) { if (ast.IsOptimizedForTarget) return; #if DEBUG //Debugger.Launch(); if ((currentMethod.Method != null) && (currentMethod.Method.Name.Equals("runTest", StringComparison.OrdinalIgnoreCase))) { //Debugger.Launch(); } #endif IntPtrConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterIntPtrConverter) return; TypeOfConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterTypeOfConverter) return; // TODO: check if we actually need this optimizer, as we have a more throughoutful // optimizer as the last step. BranchOptimizer.Convert(ast); if (stop == StopAstConversion.AfterBranchOptimizer) return; CompoundAssignmentConverter.Convert(ast); if (stop == StopAstConversion.AfterCompoundAssignmentConverter) return; // keep this order FixAsyncStateMachine.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterFixAsyncStateMachine) return; InterlockedConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterInterlockedConverter) return; ByReferenceParamConverter.Convert(context, ast, compiler); if (stop == StopAstConversion.AfterByReferenceParamConverter) return; // end CompareUnorderedConverter.Convert(ast); if (stop == StopAstConversion.AfterCompareUnorderedConverter) return; EnumConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterEnumConverter) return; EnumOptimizer.Convert(ast, compiler); if (stop == StopAstConversion.AfterEnumOptimizer) return; // Keep this order NullableConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterNullableConverter) return; PrimitiveAddressOfConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterPrimitiveAddressOfConverter) return; StructCallConverter.Convert(ast, compiler); if (stop == StopAstConversion.AfterStructCallConverter) return; // end InitializeStructVariablesConverter.Convert(ast); if (stop == StopAstConversion.AfterInitializeStructVariablesConverter) return; DelegateConverter.Convert(ast); if (stop == StopAstConversion.AfterDelegateConverter) return; LdcWideConverter.Convert(ast); if (stop == StopAstConversion.AfterLdcWideConverter) return; LdLocWithConversionConverter.Convert(ast); if (stop == StopAstConversion.AfterLdLocWithConversionConverter) return; ConvertAfterLoadConversionConverter.Convert(ast); if (stop == StopAstConversion.AfterConvertAfterLoadConversionConverter) return; ConvertBeforeStoreConversionConverter.Convert(ast); if (stop == StopAstConversion.AfterConvertBeforeStoreConversionConverter) return; CleanupConverter.Convert(ast); if (stop == StopAstConversion.AfterCleanupConverter) return; GenericsConverter.Convert(ast, currentMethod, compiler.Module.TypeSystem); if (stop == StopAstConversion.AfterGenericsConverter) return; // Expand cast expressions CastConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterCastConverter) return; // Expand generic instance information GenericInstanceConverter.Convert(ast, currentMethod, compiler); if (stop == StopAstConversion.AfterGenericInstanceConverter) return; // run the branch optimizer again. (do we need the first invocation?) BranchOptimizer2.Convert(ast, compiler); if (stop == StopAstConversion.AfterBranchOptimizer2) return; }
/// <summary> /// Convert the given method into optimized Ast format. /// </summary> internal protected static AstNode CreateOptimizedAst(AssemblyCompiler compiler, MethodSource source, bool generateSetNextInstructionCode, StopAstConversion debugStop = StopAstConversion.None, AstOptimizationStep debugStopOptimizing = AstOptimizationStep.None ) { // Build AST DecompilerContext context; AstBlock ast; if (source.IsDotNet) { context = new DecompilerContext(source.Method); var astBuilder = new IL2Ast.AstBuilder(source.ILMethod, true, context); var children = astBuilder.Build(); ast = new AstBlock(children.Select(x => x.SourceLocation).FirstOrDefault(), children); if ((source.ILMethod.IsConstructor) && (source.Method.DeclaringType.Fields.Any(x => x.FieldType.IsEnum() || x.Name.EndsWith(NameConstants.Atomic.FieldUpdaterPostfix)))) { // Ensure all fields are initialized AddFieldInitializationCode(compiler, source, ast); } if (source.Method.NeedsGenericInstanceTypeParameter && (source.Name == ".ctor")) { // Add code to save the generic instance type parameter into the generic instance field. AddGenericInstanceFieldInitializationCode(source, ast, compiler.Module.TypeSystem); } } else if (source.IsJava) { var astBuilder = new Java2Ast.AstBuilder(compiler.Module, source.JavaMethod, source.Method.DeclaringType, true); context = new DecompilerContext(source.Method); ast = astBuilder.Build(); } else if (source.IsAst) { context = new DecompilerContext(source.Method); ast = source.Ast; } else { throw new NotSupportedException("Unknown source"); } if (debugStop == StopAstConversion.AfterILConversion) { return(ast); } // Optimize AST var astOptimizer = new AstOptimizer(context, ast); astOptimizer.Optimize(debugStopOptimizing); if (debugStop == StopAstConversion.AfterOptimizing) { return(ast); } // Optimize AST towards the target TargetConverters.Convert(context, ast, source, compiler, debugStop); if (generateSetNextInstructionCode) { SetNextInstructionGenerator.Convert(ast, source, compiler); } // Return return return(ast); }