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

  1. #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
  2. using System;
  3. using System.Diagnostics;
  4. using System.Runtime.CompilerServices;
  5. using System.Runtime.InteropServices;
  6. using System.Security;
  7. namespace Cysharp.Threading.Tasks.CompilerServices
  8. {
  9. [StructLayout(LayoutKind.Auto)]
  10. public struct AsyncUniTaskMethodBuilder
  11. {
  12. IStateMachineRunnerPromise runnerPromise;
  13. Exception ex;
  14. // 1. Static Create method.
  15. [DebuggerHidden]
  16. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  17. public static AsyncUniTaskMethodBuilder Create()
  18. {
  19. return default;
  20. }
  21. // 2. TaskLike Task property.
  22. public UniTask Task
  23. {
  24. [DebuggerHidden]
  25. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  26. get
  27. {
  28. if (runnerPromise != null)
  29. {
  30. return runnerPromise.Task;
  31. }
  32. else if (ex != null)
  33. {
  34. return UniTask.FromException(ex);
  35. }
  36. else
  37. {
  38. return UniTask.CompletedTask;
  39. }
  40. }
  41. }
  42. // 3. SetException
  43. [DebuggerHidden]
  44. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  45. public void SetException(Exception exception)
  46. {
  47. if (runnerPromise == null)
  48. {
  49. ex = exception;
  50. }
  51. else
  52. {
  53. runnerPromise.SetException(exception);
  54. }
  55. }
  56. // 4. SetResult
  57. [DebuggerHidden]
  58. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  59. public void SetResult()
  60. {
  61. if (runnerPromise != null)
  62. {
  63. runnerPromise.SetResult();
  64. }
  65. }
  66. // 5. AwaitOnCompleted
  67. [DebuggerHidden]
  68. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  69. public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
  70. where TAwaiter : INotifyCompletion
  71. where TStateMachine : IAsyncStateMachine
  72. {
  73. if (runnerPromise == null)
  74. {
  75. AsyncUniTask<TStateMachine>.SetStateMachine(ref stateMachine, ref runnerPromise);
  76. }
  77. awaiter.OnCompleted(runnerPromise.MoveNext);
  78. }
  79. // 6. AwaitUnsafeOnCompleted
  80. [DebuggerHidden]
  81. [SecuritySafeCritical]
  82. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  83. public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
  84. where TAwaiter : ICriticalNotifyCompletion
  85. where TStateMachine : IAsyncStateMachine
  86. {
  87. if (runnerPromise == null)
  88. {
  89. AsyncUniTask<TStateMachine>.SetStateMachine(ref stateMachine, ref runnerPromise);
  90. }
  91. awaiter.UnsafeOnCompleted(runnerPromise.MoveNext);
  92. }
  93. // 7. Start
  94. [DebuggerHidden]
  95. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  96. public void Start<TStateMachine>(ref TStateMachine stateMachine)
  97. where TStateMachine : IAsyncStateMachine
  98. {
  99. stateMachine.MoveNext();
  100. }
  101. // 8. SetStateMachine
  102. [DebuggerHidden]
  103. public void SetStateMachine(IAsyncStateMachine stateMachine)
  104. {
  105. // don't use boxed stateMachine.
  106. }
  107. #if DEBUG || !UNITY_2018_3_OR_NEWER
  108. // Important for IDE debugger.
  109. object debuggingId;
  110. private object ObjectIdForDebugger
  111. {
  112. get
  113. {
  114. if (debuggingId == null)
  115. {
  116. debuggingId = new object();
  117. }
  118. return debuggingId;
  119. }
  120. }
  121. #endif
  122. }
  123. [StructLayout(LayoutKind.Auto)]
  124. public struct AsyncUniTaskMethodBuilder<T>
  125. {
  126. IStateMachineRunnerPromise<T> runnerPromise;
  127. Exception ex;
  128. T result;
  129. // 1. Static Create method.
  130. [DebuggerHidden]
  131. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  132. public static AsyncUniTaskMethodBuilder<T> Create()
  133. {
  134. return default;
  135. }
  136. // 2. TaskLike Task property.
  137. public UniTask<T> Task
  138. {
  139. [DebuggerHidden]
  140. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  141. get
  142. {
  143. if (runnerPromise != null)
  144. {
  145. return runnerPromise.Task;
  146. }
  147. else if (ex != null)
  148. {
  149. return UniTask.FromException<T>(ex);
  150. }
  151. else
  152. {
  153. return UniTask.FromResult(result);
  154. }
  155. }
  156. }
  157. // 3. SetException
  158. [DebuggerHidden]
  159. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  160. public void SetException(Exception exception)
  161. {
  162. if (runnerPromise == null)
  163. {
  164. ex = exception;
  165. }
  166. else
  167. {
  168. runnerPromise.SetException(exception);
  169. }
  170. }
  171. // 4. SetResult
  172. [DebuggerHidden]
  173. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  174. public void SetResult(T result)
  175. {
  176. if (runnerPromise == null)
  177. {
  178. this.result = result;
  179. }
  180. else
  181. {
  182. runnerPromise.SetResult(result);
  183. }
  184. }
  185. // 5. AwaitOnCompleted
  186. [DebuggerHidden]
  187. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  188. public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
  189. where TAwaiter : INotifyCompletion
  190. where TStateMachine : IAsyncStateMachine
  191. {
  192. if (runnerPromise == null)
  193. {
  194. AsyncUniTask<TStateMachine, T>.SetStateMachine(ref stateMachine, ref runnerPromise);
  195. }
  196. awaiter.OnCompleted(runnerPromise.MoveNext);
  197. }
  198. // 6. AwaitUnsafeOnCompleted
  199. [DebuggerHidden]
  200. [SecuritySafeCritical]
  201. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  202. public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
  203. where TAwaiter : ICriticalNotifyCompletion
  204. where TStateMachine : IAsyncStateMachine
  205. {
  206. if (runnerPromise == null)
  207. {
  208. AsyncUniTask<TStateMachine, T>.SetStateMachine(ref stateMachine, ref runnerPromise);
  209. }
  210. awaiter.UnsafeOnCompleted(runnerPromise.MoveNext);
  211. }
  212. // 7. Start
  213. [DebuggerHidden]
  214. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  215. public void Start<TStateMachine>(ref TStateMachine stateMachine)
  216. where TStateMachine : IAsyncStateMachine
  217. {
  218. stateMachine.MoveNext();
  219. }
  220. // 8. SetStateMachine
  221. [DebuggerHidden]
  222. public void SetStateMachine(IAsyncStateMachine stateMachine)
  223. {
  224. // don't use boxed stateMachine.
  225. }
  226. #if DEBUG || !UNITY_2018_3_OR_NEWER
  227. // Important for IDE debugger.
  228. object debuggingId;
  229. private object ObjectIdForDebugger
  230. {
  231. get
  232. {
  233. if (debuggingId == null)
  234. {
  235. debuggingId = new object();
  236. }
  237. return debuggingId;
  238. }
  239. }
  240. #endif
  241. }
  242. }