using System;
using System.Runtime.CompilerServices;
using UnityFusion.CLR.Method;
using UnityFusion.Runtime.Enviorment;
using UnityFusion.Runtime.Intepreter;
using UnityEngine;
using AppDomain = UnityFusion.Runtime.Enviorment.AppDomain;
namespace UnityFusion.CLRBinding.Adapter
{
///
/// Adapter for .
/// Enables async/await functionality for methods within the hot-reload domain.
///
public class AsyncStateMachineClassInheritanceAdaptor : CrossBindingAdaptor
{
public override Type BaseCLRType => typeof(IAsyncStateMachine);
public override Type AdaptorType => typeof(AsyncStateMachineAdaptor);
public override object CreateCLRInstance(AppDomain _appdomain, ILTypeInstance _instance)
{
return new AsyncStateMachineAdaptor(_appdomain, _instance);
}
///
/// The implementation class that bridges async state machine calls to the hot-reload domain.
///
public class AsyncStateMachineAdaptor : IAsyncStateMachine, CrossBindingAdaptorType
{
private readonly ILTypeInstance instance;
private readonly AppDomain appDomain;
private IMethod mMoveNext;
private IMethod mSetStateMachine;
private readonly object[] param1 = new object[1];
public AsyncStateMachineAdaptor()
{
}
public AsyncStateMachineAdaptor(AppDomain _appDomain, ILTypeInstance _instance)
{
this.appDomain = _appDomain;
this.instance = _instance;
}
public ILTypeInstance ILInstance
{
get { return instance; }
}
public void MoveNext()
{
mMoveNext ??= instance.Type.GetMethod("MoveNext", 0);
appDomain.Invoke(mMoveNext, instance, null);
}
public void SetStateMachine(IAsyncStateMachine _stateMachine)
{
mSetStateMachine ??= instance.Type.GetMethod("SetStateMachine");
appDomain.Invoke(mSetStateMachine, instance, _stateMachine);
}
public override string ToString()
{
IMethod m = appDomain.ObjectType.GetMethod("ToString", 0);
m = instance.Type.GetVirtualMethod(m);
if (m == null || m is ILMethod)
{
return instance.ToString();
}
return instance.Type.FullName;
}
}
}
}