From 40c55c1709f0a0183628ce8d86e88fee415ea025 Mon Sep 17 00:00:00 2001 From: Kouji Matsui Date: Thu, 19 Jan 2023 11:28:51 +0900 Subject: [PATCH] Fixed explicitly applied maxstack being ignored. --- Mono.Cecil.Cil/CodeWriter.cs | 4 +++- Test/Mono.Cecil.Tests/MethodBodyTests.cs | 27 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Mono.Cecil.Cil/CodeWriter.cs b/Mono.Cecil.Cil/CodeWriter.cs index 0ec4cc6e2..1b8839de7 100644 --- a/Mono.Cecil.Cil/CodeWriter.cs +++ b/Mono.Cecil.Cil/CodeWriter.cs @@ -341,7 +341,9 @@ void ComputeHeader () } body.code_size = offset; - body.max_stack_size = max_stack; + if (body.max_stack_size == 0) { + body.max_stack_size = max_stack; + } } void ComputeExceptionHandlerStackSize (ref Dictionary stack_sizes) diff --git a/Test/Mono.Cecil.Tests/MethodBodyTests.cs b/Test/Mono.Cecil.Tests/MethodBodyTests.cs index 5af097bc9..becb1db8c 100644 --- a/Test/Mono.Cecil.Tests/MethodBodyTests.cs +++ b/Test/Mono.Cecil.Tests/MethodBodyTests.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using System.Linq; using Mono.Cecil; @@ -449,5 +450,31 @@ public void RemoveInstruction () Assert.AreEqual (first, third.Previous); Assert.IsNull (third.Next); } + + [Test] + public void ApplyExplicitMaxStack () + { + var path = Path.GetTempFileName (); + var module = ModuleDefinition.CreateModule ("FooFoo", ModuleKind.Dll); + + var method = new MethodDefinition ("foo", MethodAttributes.Static, module.TypeSystem.Void); + var body = method.Body; + + body.MaxStackSize = 100; + + var il = body.GetILProcessor (); + + var ret = il.Create (OpCodes.Ret); + body.Instructions.Add (ret); + + var type = new TypeDefinition ("foo", "foo", TypeAttributes.Public | TypeAttributes.Class, module.TypeSystem.Object); + type.Methods.Add (method); + module.Types.Add (type); + + module.Write (path); + + using (var read_module = ModuleDefinition.ReadModule (path)) + Assert.AreEqual (100, read_module.Types [1].Methods[0].Body.MaxStackSize); + } } }