From 7c1d0c3725dc61bec95b151c07522b16afa4f012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Thu, 8 May 2025 16:28:06 +0100 Subject: [PATCH 1/2] Fix execution of static constructors - These are now skipped if they contain generic parameters or they live in a generic type definition. --- src/CLR/Core/TypeSystem.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/CLR/Core/TypeSystem.cpp b/src/CLR/Core/TypeSystem.cpp index 1f9dc82ee2..c631655e09 100644 --- a/src/CLR/Core/TypeSystem.cpp +++ b/src/CLR/Core/TypeSystem.cpp @@ -4787,7 +4787,20 @@ bool CLR_RT_Assembly::FindNextStaticConstructor(CLR_RT_MethodDef_Index &index) index.Set(assemblyIndex, i); - if (md->flags & CLR_RECORD_METHODDEF::MD_StaticConstructor) + // turn the index into a MethodDef_Instance + CLR_RT_MethodDef_Instance methodDefInst; + methodDefInst.InitializeFromIndex(index); + + CLR_RT_TypeDef_Instance typeDefInst; + typeDefInst.InitializeFromMethod(methodDefInst); + + // check if this is a static constructor + // but skip it if: + // - references generic parameters + // - it lives on a generic type definition + if ((md->flags & CLR_RECORD_METHODDEF::MD_StaticConstructor) && + ((md->flags & CLR_RECORD_METHODDEF::MD_ContainsGenericParameter) == 0) && + typeDefInst.target->genericParamCount == 0) { return true; } From 14b77aa1f69e201e0b315882e8b98e41108a9d8b Mon Sep 17 00:00:00 2001 From: nfbot Date: Thu, 8 May 2025 15:35:08 +0000 Subject: [PATCH 2/2] Code style fixes Automated fixes for code style. --- src/CLR/Core/TypeSystem.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/CLR/Core/TypeSystem.cpp b/src/CLR/Core/TypeSystem.cpp index c631655e09..54cde956cd 100644 --- a/src/CLR/Core/TypeSystem.cpp +++ b/src/CLR/Core/TypeSystem.cpp @@ -2468,7 +2468,7 @@ HRESULT CLR_RT_Assembly::CreateInstance(const CLR_RECORD_ASSEMBLY *header, CLR_R } #endif CLR_Debug::Printf("\r\n\r\n"); - + CLR_Debug::Printf( " AssemblyRef = %6d bytes (%5d elements)\r\n", offsets.assemblyRef, @@ -3843,8 +3843,7 @@ HRESULT CLR_RT_AppDomain::GetAssemblies(CLR_RT_HeapBlock &ref) if (pass == 0) { - NANOCLR_CHECK_HRESULT( - CLR_RT_HeapBlock_Array::CreateInstance(ref, count, g_CLR_RT_WellKnownTypes.Assembly)); + NANOCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance(ref, count, g_CLR_RT_WellKnownTypes.Assembly)); pArray = (CLR_RT_HeapBlock *)ref.DereferenceArray()->GetFirstElement(); }