Hi, This is an addition to prior compatibility enhancement for lang/mono [1][2]. I encountered the exceptions being triggered with Shenzhen I/O and Burning Knight, and the patch below resolves the problem without creating attributable issues on my testing.
Like before, this keeps the compatibility fix behind MONO_FORCE_COMPAT environment variable, and it is not intended for regular use as undefined behavior may be triggered. Keeping the 'GetEnvironmentVariable("MONO_FORCE_COMPAT")' inside the if-statements will ensure that performance won't be affected _unless_ the exception would be triggered anyway. The first hunk of the second patch (List.cs) moves the env var check into the if block to reduce the risk of this affecting performance during regular use. Note that I haven't noticed any significant performance impact from any of this. CC maintainer ok? [1] https://marc.info/?l=openbsd-ports&m=157013038104300&q=mbox [2] https://marc.info/?l=openbsd-ports-cvs&m=157349190600488&q=mbox Index: Makefile =================================================================== RCS file: /cvs/ports/lang/mono/Makefile,v retrieving revision 1.136 diff -u -p -r1.136 Makefile --- Makefile 14 Apr 2020 14:43:21 -0000 1.136 +++ Makefile 10 Jun 2020 06:32:28 -0000 @@ -5,7 +5,7 @@ USE_WXNEEDED= Yes COMMENT= cross platform, open source .NET developement framework V= 6.8.0.105 -REVISION= 1 +REVISION= 2 DISTNAME= mono-${V} Index: patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_Dictionary_cs =================================================================== RCS file: patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_Dictionary_cs diff -N patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_Dictionary_cs --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_Dictionary_cs 10 Jun 2020 06:32:28 -0000 @@ -0,0 +1,17 @@ +$OpenBSD$ + +More MONO_FORCE_COMPAT where it may be needed. + +Index: external/corefx/src/Common/src/CoreLib/System/Collections/Generic/Dictionary.cs +--- external/corefx/src/Common/src/CoreLib/System/Collections/Generic/Dictionary.cs.orig ++++ external/corefx/src/Common/src/CoreLib/System/Collections/Generic/Dictionary.cs +@@ -1610,7 +1610,8 @@ namespace System.Collections.Generic + { + if (_version != _dictionary._version) + { +- ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion(); ++ if (Environment.GetEnvironmentVariable ("MONO_FORCE_COMPAT") == null) ++ ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion(); + } + + while ((uint)_index < (uint)_dictionary._count) Index: patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs =================================================================== RCS file: /cvs/ports/lang/mono/patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs,v retrieving revision 1.1 diff -u -p -r1.1 patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs --- patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs 11 Nov 2019 17:05:02 -0000 1.1 +++ patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs 10 Jun 2020 06:32:28 -0000 @@ -8,17 +8,25 @@ well-defined cases. Index: external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs --- external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs.orig +++ external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs -@@ -578,8 +578,11 @@ namespace System.Collections.Generic - action(_items[i]); +@@ -579,7 +579,10 @@ namespace System.Collections.Generic } -- if (version != _version) + if (version != _version) - ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion(); -+ if (Environment.GetEnvironmentVariable ("MONO_FORCE_COMPAT") == null) + { -+ if (version != _version) ++ if (Environment.GetEnvironmentVariable ("MONO_FORCE_COMPAT") == null) + ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion(); + } } // Returns an enumerator for this list with the given +@@ -1160,7 +1163,8 @@ namespace System.Collections.Generic + { + if (_version != _list._version) + { +- ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion(); ++ if (Environment.GetEnvironmentVariable ("MONO_FORCE_COMPAT") == null) ++ ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion(); + } + + _index = _list._size + 1;