Skip to content

[mono] expression Cannot box IsByRefLike type 'System.ReadOnlySpan`1' #98805

Open

Description

Description

we are using Spanjson on ios use interp mode, it will throw exception when use expression generate deserialize/serialize code

Reproduction Steps

our source code:

internal class SpanJson
	{
		/// <summary>
		/// 一个简单的SpanJson测试用例
		/// </summary>
		[Test("SpanJson.SimpleSample")]
		public static void Run()
		{
			Person person = new Person { Name = "John Doe", Age = 30 };

			//Utf16
			{
				//Generic
				{
					var json = JsonSerializer.Generic.Utf16.Serialize(person);
					var deserializeData = JsonSerializer.Generic.Utf16.Deserialize<Person>(json);
					TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
				}

				//NonGeneric
				{
					var json = JsonSerializer.NonGeneric.Utf16.Serialize(person);
					var deserializeData = JsonSerializer.NonGeneric.Utf16.Deserialize(json, typeof(Person)) as Person;
					TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
				}
			}

			//Utf8
			{
				//Generic
				{
					var bytes = JsonSerializer.Generic.Utf8.Serialize(person);
					var deserializeData = JsonSerializer.Generic.Utf8.Deserialize<Person>(bytes);
					TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
				}

				//NonGeneric
				{
					var bytes = JsonSerializer.NonGeneric.Utf8.Serialize(person);
					var deserializeData = JsonSerializer.NonGeneric.Utf8.Deserialize(bytes, typeof(Person)) as Person;
					TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
				}
			}
		}
	}

	[JsonFormatterGenerator]
	public class Person
	{
		public string Name { get; set; }
		public int Age { get; set; }
	}

Expected behavior

walk correctly

Actual behavior

throw exception, the stacktrace show below:

···
Exception Test Name: SpanJson.SimpleSample
Cannot box IsByRefLike type 'System.ReadOnlySpan`1'
   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure, Boolean allowClosed) in System.Private.CoreLib.dll:token 0x6000258+0x86
   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure) in System.Private.CoreLib.dll:token 0x6000256+0x0
   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method) in System.Private.CoreLib.dll:token 0x600026d+0x0
   at System.Reflection.Emit.DynamicMethod.CreateDelegate(Type delegateType, Object target) in System.Private.CoreLib.dll:token 0x6005d6b+0x11
   at System.Dynamic.Utils.DelegateHelpers.CreateObjectArrayDelegateRefEmit(Type delegateType, Func`2 handler) in System.Linq.Expressions.dll:token 0x6001038+0x355
   at System.Dynamic.Utils.DelegateHelpers.CreateObjectArrayDelegate(Type delegateType, Func`2 handler) in System.Linq.Expressions.dll:token 0x600102d+0x2
   at System.Linq.Expressions.Interpreter.LightLambda.MakeDelegate(Type delegateType) in System.Linq.Expressions.dll:token 0x6000c1c+0x31
   at System.Linq.Expressions.Interpreter.LightDelegateCreator.CreateDelegate(IStrongBox[] closure) in System.Linq.Expressions.dll:token 0x6000c19+0x0
   at System.Linq.Expressions.Interpreter.LightDelegateCreator.CreateDelegate() in System.Linq.Expressions.dll:token 0x6000c18+0x0
   at System.Linq.Expressions.Expression`1[[SpanJson.JsonSerializer.NonGeneric.Inner`2.DeserializeDelegate[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].Compile() in System.Linq.Expressions.dll:token 0x6000641+0x3
   at SpanJson.JsonSerializer.NonGeneric.Inner`2[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].BuildDeserializer(Type type) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 233
   at SpanJson.JsonSerializer.NonGeneric.Inner`2[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].BuildInvoker(Type type) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 160
   at SpanJson.JsonSerializer.NonGeneric.Inner`2.<>c[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].<InnerSerializeToString>b__2_0(Type x) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 44
   at System.Collections.Concurrent.ConcurrentDictionary`2[[System.Type, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.JsonSerializer.NonGeneric.Inner`2.Invoker[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].GetOrAdd(Type key, Func`2 valueFactory) in System.Collections.Concurrent.dll:token 0x60000d1+0x47
   at SpanJson.JsonSerializer.NonGeneric.Inner`2[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].InnerSerializeToString(Object input) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 44
   at SpanJson.JsonSerializer.NonGeneric.Utf16.Serialize[ExcludeNullsOriginalCaseResolver`1](Object input) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 416
   at SpanJson.JsonSerializer.NonGeneric.Utf16.Serialize(Object input) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 346
   at UnrealEngine.Game.Tests.SpanJson.SpanJson.Run() in /Users/game-netease/unrealmono/UEDemo-427/UEDemo/Content/Script/Game/Tests/SpanJson/SpanJson.cs:line 27
···

Regression?

we have only try use on .net7, but I think .net8 also have this problem.

Known Workarounds

no

Configuration

ios

Other information

No response

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions