Skip to content
This repository has been archived by the owner on May 16, 2022. It is now read-only.

Adds lock for mono threadsafety issue #126

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 25 additions & 21 deletions src/Utf8Json/Resolvers/DynamicObjectResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,7 @@ internal static class DynamicObjectTypeBuilder
static readonly Regex SubtractFullNameRegex = new Regex(@", Version=\d+.\d+.\d+.\d+, Culture=\w+, PublicKeyToken=\w+");
#endif

static readonly object gate = new object();

static int nameSequence = 0;

Expand Down Expand Up @@ -522,34 +523,37 @@ internal static class DynamicObjectTypeBuilder

public static object BuildFormatterToAssembly<T>(DynamicAssembly assembly, IJsonFormatterResolver selfResolver, Func<string, string> nameMutator, bool excludeNull)
{
var ti = typeof(T).GetTypeInfo();

if (ti.IsNullable())
lock (gate)
{
ti = ti.GenericTypeArguments[0].GetTypeInfo();
var ti = typeof(T).GetTypeInfo();

var innerFormatter = selfResolver.GetFormatterDynamic(ti.AsType());
if (innerFormatter == null)
if (ti.IsNullable())
{
return null;
ti = ti.GenericTypeArguments[0].GetTypeInfo();

var innerFormatter = selfResolver.GetFormatterDynamic(ti.AsType());
if (innerFormatter == null)
{
return null;
}
return (IJsonFormatter<T>)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter });
}
return (IJsonFormatter<T>)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter });
}

Type elementType;
if (typeof(Exception).GetTypeInfo().IsAssignableFrom(ti))
{
return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, true);
}
else if (ti.IsAnonymous() || TryGetInterfaceEnumerableElementType(typeof(T), out elementType))
{
return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, false);
}
Type elementType;
if (typeof(Exception).GetTypeInfo().IsAssignableFrom(ti))
{
return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, true);
}
else if (ti.IsAnonymous() || TryGetInterfaceEnumerableElementType(typeof(T), out elementType))
{
return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, false);
}

var formatterTypeInfo = DynamicObjectTypeBuilder.BuildType(assembly, typeof(T), nameMutator, excludeNull);
if (formatterTypeInfo == null) return null;
var formatterTypeInfo = DynamicObjectTypeBuilder.BuildType(assembly, typeof(T), nameMutator, excludeNull);
if (formatterTypeInfo == null) return null;

return (IJsonFormatter<T>)Activator.CreateInstance(formatterTypeInfo.AsType());
return (IJsonFormatter<T>)Activator.CreateInstance(formatterTypeInfo.AsType());
}
}

public static object BuildFormatterToDynamicMethod<T>(IJsonFormatterResolver selfResolver, Func<string, string> nameMutator, bool excludeNull, bool allowPrivate)
Expand Down