You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
7.6 KiB
269 lines
7.6 KiB
|
|
#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 |
|
|
|
} |
|
} |