From 5debb46f0cac3d60043c7186b3028aa55e1c7492 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/CodeReader.cs | 2 +- Mono.Cecil.Cil/CodeWriter.cs | 3 ++- Mono.Cecil.Cil/MethodBody.cs | 6 +++++- Test/Mono.Cecil.Tests/MethodBodyTests.cs | 27 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Mono.Cecil.Cil/CodeReader.cs b/Mono.Cecil.Cil/CodeReader.cs index 89515d688..1e241857d 100644 --- a/Mono.Cecil.Cil/CodeReader.cs +++ b/Mono.Cecil.Cil/CodeReader.cs @@ -92,7 +92,7 @@ void ReadMethodBody () switch (flags & 0x3) { case 0x2: // tiny body.code_size = flags >> 2; - body.MaxStackSize = 8; + body.max_stack_size = 8; ReadCode (); break; case 0x3: // fat diff --git a/Mono.Cecil.Cil/CodeWriter.cs b/Mono.Cecil.Cil/CodeWriter.cs index 0ec4cc6e2..e2d928664 100644 --- a/Mono.Cecil.Cil/CodeWriter.cs +++ b/Mono.Cecil.Cil/CodeWriter.cs @@ -341,7 +341,8 @@ void ComputeHeader () } body.code_size = offset; - body.max_stack_size = max_stack; + body.max_stack_size = body.is_max_stack_size_set_explicitly + ? body.max_stack_size : max_stack; } void ComputeExceptionHandlerStackSize (ref Dictionary stack_sizes) diff --git a/Mono.Cecil.Cil/MethodBody.cs b/Mono.Cecil.Cil/MethodBody.cs index 89bfc905c..018f42484 100644 --- a/Mono.Cecil.Cil/MethodBody.cs +++ b/Mono.Cecil.Cil/MethodBody.cs @@ -21,6 +21,7 @@ public sealed class MethodBody { internal ParameterDefinition this_parameter; internal int max_stack_size; + internal bool is_max_stack_size_set_explicitly; internal int code_size; internal bool init_locals; internal MetadataToken local_var_token; @@ -35,7 +36,10 @@ public MethodDefinition Method { public int MaxStackSize { get { return max_stack_size; } - set { max_stack_size = value; } + set { + max_stack_size = value; + is_max_stack_size_set_explicitly = true; + } } public int CodeSize { 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); + } } }