Skip to content

Commit 541ad7c

Browse files
authored
Merge pull request MessagePack-CSharp#1461 from LineSmarts/master
Fix for "System.NotImplementedException: byref delegate" (second attempt)
2 parents 1092f85 + d75c56a commit 541ad7c

File tree

2 files changed

+26
-23
lines changed

2 files changed

+26
-23
lines changed

src/MessagePack.UnityClient/Assets/Scripts/MessagePack/MessagePackSerializer.NonGeneric.cs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,22 @@ public static object Deserialize(Type type, ReadOnlySequence<byte> bytes, Messag
8282
return GetOrAdd(type).Deserialize_ReadOnlySequence_Options_CancellationToken.Invoke(bytes, options, cancellationToken);
8383
}
8484

85+
/// <summary>
86+
/// Helper method used by reflection.
87+
/// </summary>
88+
private static void SerializeSemiGeneric<T>(ref MessagePackWriter writer, object valueObject, MessagePackSerializerOptions options = null)
89+
{
90+
Serialize(ref writer, (T)valueObject, options);
91+
}
92+
93+
/// <summary>
94+
/// Helper method used by reflection.
95+
/// </summary>
96+
private static object DeserializeSemiGeneric<T>(ref MessagePackReader reader, MessagePackSerializerOptions options = null)
97+
{
98+
return Deserialize<T>(ref reader, options);
99+
}
100+
85101
private static async ValueTask<object> DeserializeObjectAsync<T>(Stream stream, MessagePackSerializerOptions options, CancellationToken cancellationToken) => await DeserializeAsync<T>(stream, options, cancellationToken).ConfigureAwait(false);
86102

87103
private static CompiledMethods GetOrAdd(Type type)
@@ -219,39 +235,22 @@ internal CompiledMethods(Type type)
219235
}
220236

221237
{
222-
// public static void Serialize<T>(ref MessagePackWriter writer, T obj, MessagePackSerializerOptions options)
223-
MethodInfo serialize = GetMethod(nameof(Serialize), type, new Type[] { typeof(MessagePackWriter).MakeByRefType(), null, typeof(MessagePackSerializerOptions) });
238+
// private static void SerializeSemiGeneric<T>(ref MessagePackWriter writer, object obj, MessagePackSerializerOptions options)
239+
MethodInfo serialize = GetMethod(nameof(SerializeSemiGeneric), type, new Type[] { typeof(MessagePackWriter).MakeByRefType(), typeof(object), typeof(MessagePackSerializerOptions) });
224240
#if ENABLE_IL2CPP
225241
this.Serialize_MessagePackWriter_T_Options = (ref MessagePackWriter x, object y, MessagePackSerializerOptions z) => ThrowRefStructNotSupported();
226242
#else
227-
ParameterExpression param1 = Expression.Parameter(typeof(MessagePackWriter).MakeByRefType(), "writer");
228-
ParameterExpression param2 = Expression.Parameter(typeof(object), "obj");
229-
ParameterExpression param3 = Expression.Parameter(typeof(MessagePackSerializerOptions), "options");
230-
231-
MethodCallExpression body = Expression.Call(
232-
null,
233-
serialize,
234-
param1,
235-
ti.IsValueType ? Expression.Unbox(param2, type) : Expression.Convert(param2, type),
236-
param3);
237-
MessagePackWriterSerialize lambda = Expression.Lambda<MessagePackWriterSerialize>(body, param1, param2, param3).Compile(PreferInterpretation);
238-
239-
this.Serialize_MessagePackWriter_T_Options = lambda;
243+
this.Serialize_MessagePackWriter_T_Options = (MessagePackWriterSerialize)serialize.CreateDelegate(typeof(MessagePackWriterSerialize));
240244
#endif
241245
}
242246

243247
{
244-
// public static T Deserialize<T>(ref MessagePackReader reader, MessagePackSerializerOptions options)
245-
MethodInfo deserialize = GetMethod(nameof(Deserialize), type, new Type[] { typeof(MessagePackReader).MakeByRefType(), typeof(MessagePackSerializerOptions) });
248+
// private static object DeserializeSemiGeneric<T>(ref MessagePackReader reader, MessagePackSerializerOptions options)
249+
MethodInfo deserialize = GetMethod(nameof(DeserializeSemiGeneric), type, new Type[] { typeof(MessagePackReader).MakeByRefType(), typeof(MessagePackSerializerOptions) });
246250
#if ENABLE_IL2CPP
247251
this.Deserialize_MessagePackReader_Options = (ref MessagePackReader reader, MessagePackSerializerOptions options) => { ThrowRefStructNotSupported(); return null; };
248252
#else
249-
ParameterExpression param1 = Expression.Parameter(typeof(MessagePackReader).MakeByRefType(), "reader");
250-
ParameterExpression param2 = Expression.Parameter(typeof(MessagePackSerializerOptions), "options");
251-
UnaryExpression body = Expression.Convert(Expression.Call(null, deserialize, param1, param2), typeof(object));
252-
MessagePackReaderDeserialize lambda = Expression.Lambda<MessagePackReaderDeserialize>(body, param1, param2).Compile();
253-
254-
this.Deserialize_MessagePackReader_Options = lambda;
253+
this.Deserialize_MessagePackReader_Options = (MessagePackReaderDeserialize)deserialize.CreateDelegate(typeof(MessagePackReaderDeserialize));
255254
#endif
256255
}
257256

src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Resolvers/DynamicObjectResolver.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,9 @@ void OnNotFound()
12641264
il.Emit(OpCodes.Br, readNext);
12651265
}
12661266

1267+
#if NET_STANDARD_2_0
1268+
throw new NotImplementedException("NET_STANDARD_2_0 directive was used");
1269+
#else
12671270
if (canOverwrite)
12681271
{
12691272
automata.EmitMatch(il, buffer, longKey, OnFoundAssignDirect, OnNotFound);
@@ -1272,6 +1275,7 @@ void OnNotFound()
12721275
{
12731276
automata.EmitMatch(il, buffer, longKey, OnFoundAssignLocalVariable, OnNotFound);
12741277
}
1278+
#endif
12751279

12761280
il.MarkLabel(readNext);
12771281
reader.EmitLdarg();

0 commit comments

Comments
 (0)