|
|
|
|
|
|
|
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
using System.Security;
|
|
|
|
|
|
|
|
|
|
namespace Cysharp.Threading.Tasks.CompilerServices
|
|
|
|
|
{
|
|
|
|
|
[StructLayout(LayoutKind.Auto)]
|
|
|
|
|
public struct AsyncUniTaskMethodBuilder
|
|
|
|
|
{
|
|
|
|
|
IStateMachineRunnerPromise runnerPromise;
|
|
|
|
|
Exception ex;
|
|
|
|
|
|
|
|
|
|
// 1. Static Create method.
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public static AsyncUniTaskMethodBuilder Create()
|
|
|
|
|
{
|
|
|
|
|
return default;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. TaskLike Task property.
|
|
|
|
|
public UniTask Task
|
|
|
|
|
{
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise != null)
|
|
|
|
|
{
|
|
|
|
|
return runnerPromise.Task;
|
|
|
|
|
}
|
|
|
|
|
else if (ex != null)
|
|
|
|
|
{
|
|
|
|
|
return UniTask.FromException(ex);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return UniTask.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 3. SetException
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void SetException(Exception exception)
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise == null)
|
|
|
|
|
{
|
|
|
|
|
ex = exception;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
runnerPromise.SetException(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4. SetResult
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void SetResult()
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise != null)
|
|
|
|
|
{
|
|
|
|
|
runnerPromise.SetResult();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 5. AwaitOnCompleted
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
|
|
|
|
|
where TAwaiter : INotifyCompletion
|
|
|
|
|
where TStateMachine : IAsyncStateMachine
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise == null)
|
|
|
|
|
{
|
|
|
|
|
AsyncUniTask<TStateMachine>.SetStateMachine(ref stateMachine, ref runnerPromise);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
awaiter.OnCompleted(runnerPromise.MoveNext);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 6. AwaitUnsafeOnCompleted
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[SecuritySafeCritical]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
|
|
|
|
|
where TAwaiter : ICriticalNotifyCompletion
|
|
|
|
|
where TStateMachine : IAsyncStateMachine
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise == null)
|
|
|
|
|
{
|
|
|
|
|
AsyncUniTask<TStateMachine>.SetStateMachine(ref stateMachine, ref runnerPromise);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
awaiter.UnsafeOnCompleted(runnerPromise.MoveNext);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 7. Start
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void Start<TStateMachine>(ref TStateMachine stateMachine)
|
|
|
|
|
where TStateMachine : IAsyncStateMachine
|
|
|
|
|
{
|
|
|
|
|
stateMachine.MoveNext();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 8. SetStateMachine
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
public void SetStateMachine(IAsyncStateMachine stateMachine)
|
|
|
|
|
{
|
|
|
|
|
// don't use boxed stateMachine.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if DEBUG || !UNITY_2018_3_OR_NEWER
|
|
|
|
|
// Important for IDE debugger.
|
|
|
|
|
object debuggingId;
|
|
|
|
|
private object ObjectIdForDebugger
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (debuggingId == null)
|
|
|
|
|
{
|
|
|
|
|
debuggingId = new object();
|
|
|
|
|
}
|
|
|
|
|
return debuggingId;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Auto)]
|
|
|
|
|
public struct AsyncUniTaskMethodBuilder<T>
|
|
|
|
|
{
|
|
|
|
|
IStateMachineRunnerPromise<T> runnerPromise;
|
|
|
|
|
Exception ex;
|
|
|
|
|
T result;
|
|
|
|
|
|
|
|
|
|
// 1. Static Create method.
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public static AsyncUniTaskMethodBuilder<T> Create()
|
|
|
|
|
{
|
|
|
|
|
return default;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. TaskLike Task property.
|
|
|
|
|
public UniTask<T> Task
|
|
|
|
|
{
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise != null)
|
|
|
|
|
{
|
|
|
|
|
return runnerPromise.Task;
|
|
|
|
|
}
|
|
|
|
|
else if (ex != null)
|
|
|
|
|
{
|
|
|
|
|
return UniTask.FromException<T>(ex);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return UniTask.FromResult(result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 3. SetException
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void SetException(Exception exception)
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise == null)
|
|
|
|
|
{
|
|
|
|
|
ex = exception;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
runnerPromise.SetException(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4. SetResult
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void SetResult(T result)
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise == null)
|
|
|
|
|
{
|
|
|
|
|
this.result = result;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
runnerPromise.SetResult(result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 5. AwaitOnCompleted
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
|
|
|
|
|
where TAwaiter : INotifyCompletion
|
|
|
|
|
where TStateMachine : IAsyncStateMachine
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise == null)
|
|
|
|
|
{
|
|
|
|
|
AsyncUniTask<TStateMachine, T>.SetStateMachine(ref stateMachine, ref runnerPromise);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
awaiter.OnCompleted(runnerPromise.MoveNext);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 6. AwaitUnsafeOnCompleted
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[SecuritySafeCritical]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
|
|
|
|
|
where TAwaiter : ICriticalNotifyCompletion
|
|
|
|
|
where TStateMachine : IAsyncStateMachine
|
|
|
|
|
{
|
|
|
|
|
if (runnerPromise == null)
|
|
|
|
|
{
|
|
|
|
|
AsyncUniTask<TStateMachine, T>.SetStateMachine(ref stateMachine, ref runnerPromise);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
awaiter.UnsafeOnCompleted(runnerPromise.MoveNext);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 7. Start
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
public void Start<TStateMachine>(ref TStateMachine stateMachine)
|
|
|
|
|
where TStateMachine : IAsyncStateMachine
|
|
|
|
|
{
|
|
|
|
|
stateMachine.MoveNext();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 8. SetStateMachine
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
public void SetStateMachine(IAsyncStateMachine stateMachine)
|
|
|
|
|
{
|
|
|
|
|
// don't use boxed stateMachine.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if DEBUG || !UNITY_2018_3_OR_NEWER
|
|
|
|
|
// Important for IDE debugger.
|
|
|
|
|
object debuggingId;
|
|
|
|
|
private object ObjectIdForDebugger
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (debuggingId == null)
|
|
|
|
|
{
|
|
|
|
|
debuggingId = new object();
|
|
|
|
|
}
|
|
|
|
|
return debuggingId;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|