diff --git a/src/Neo.Compiler.CSharp/Optimizer/Strategies/Optimizer.cs b/src/Neo.Compiler.CSharp/Optimizer/Strategies/Optimizer.cs index cfc856a07..de772c8bd 100644 --- a/src/Neo.Compiler.CSharp/Optimizer/Strategies/Optimizer.cs +++ b/src/Neo.Compiler.CSharp/Optimizer/Strategies/Optimizer.cs @@ -64,11 +64,12 @@ public static (NefFile, ContractManifest, JObject?) Optimize(NefFile nef, Contra if (!optimizationType.HasFlag(CompilationOptions.OptimizationType.Experimental)) return (nef, manifest, debugInfo); // do nothing // TODO in the future: optimize by StrategyAttribute in a loop - (nef, manifest, debugInfo) = Reachability.RemoveUnnecessaryJumps(nef, manifest, debugInfo!.Clone() as JObject); - (nef, manifest, debugInfo) = Reachability.ReplaceJumpWithRet(nef, manifest, debugInfo!.Clone() as JObject); - (nef, manifest, debugInfo) = Reachability.RemoveUncoveredInstructions(nef, manifest, debugInfo!.Clone() as JObject); - (nef, manifest, debugInfo) = Reachability.RemoveUnnecessaryJumps(nef, manifest, debugInfo!.Clone() as JObject); - (nef, manifest, debugInfo) = Reachability.ReplaceJumpWithRet(nef, manifest, debugInfo!.Clone() as JObject); + debugInfo = debugInfo?.Clone() as JObject; // do not pollute the input when optimization fails + (nef, manifest, debugInfo) = Reachability.RemoveUnnecessaryJumps(nef, manifest, debugInfo); + (nef, manifest, debugInfo) = Reachability.ReplaceJumpWithRet(nef, manifest, debugInfo); + (nef, manifest, debugInfo) = Reachability.RemoveUncoveredInstructions(nef, manifest, debugInfo); + (nef, manifest, debugInfo) = Reachability.RemoveUnnecessaryJumps(nef, manifest, debugInfo); + (nef, manifest, debugInfo) = Reachability.ReplaceJumpWithRet(nef, manifest, debugInfo); return (nef, manifest, debugInfo); } }