@@ -4,6 +4,7 @@ namespace Language
44
55open Xunit
66open FSharp.Test .Compiler
7+ open FSharp.Test
78
89module StateMachineTests =
910
@@ -160,4 +161,83 @@ let main _ =
160161 |> ignoreWarnings
161162 |> withOptimize
162163 |> compileExeAndRun
163- |> shouldSucceed
164+ |> shouldSucceed
165+
166+ [<Fact>]
167+ let ``State machine defined as top level value is statically compiled`` () =
168+ Fsx """
169+ let test = task { return 42 }
170+ if test.Result <> 42 then failwith "expected 42"
171+
172+ task { printfn "Hello, World!"; return 42 }
173+ """
174+ |> runFsi
175+ |> shouldSucceed
176+
177+ [<Fact>]
178+ let ``State machine defined as top level has a generated MoveNext method`` () =
179+ FSharp """
180+ module TestStateMachine
181+ let test = task { return 42 }
182+ """
183+ |> compile
184+ |> verifyIL [ """
185+ .method public strict virtual instance void MoveNext() cil managed
186+ {
187+ .override [runtime]System.Runtime.CompilerServices.IAsyncStateMachine::MoveNext
188+
189+ .maxstack 4
190+ .locals init (int32 V_0,
191+ class [runtime]System.Exception V_1,
192+ bool V_2,
193+ class [runtime]System.Exception V_3)
194+ IL_0000: ldarg.0
195+ IL_0001: ldfld int32 TestStateMachine/test@3::ResumptionPoint
196+ IL_0006: stloc.0
197+ .try
198+ {
199+ IL_0007: ldarg.0
200+ IL_0008: ldflda valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32> TestStateMachine/test@3::Data
201+ IL_000d: ldc.i4.s 42
202+ IL_000f: stfld !0 valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32>::Result
203+ IL_0014: ldc.i4.1
204+ IL_0015: stloc.2
205+ IL_0016: ldloc.2
206+ IL_0017: brfalse.s IL_0036
207+
208+ IL_0019: ldarg.0
209+ IL_001a: ldflda valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32> TestStateMachine/test@3::Data
210+ IL_001f: ldflda valuetype [runtime]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<!0> valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32>::MethodBuilder
211+ IL_0024: ldarg.0
212+ IL_0025: ldflda valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32> TestStateMachine/test@3::Data
213+ IL_002a: ldfld !0 valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32>::Result
214+ IL_002f: call instance void valuetype [netstandard]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32>::SetResult(!0)
215+ IL_0034: leave.s IL_0042
216+
217+ IL_0036: leave.s IL_0042
218+
219+ }
220+ catch [runtime]System.Object
221+ {
222+ IL_0038: castclass [runtime]System.Exception
223+ IL_003d: stloc.3
224+ IL_003e: ldloc.3
225+ IL_003f: stloc.1
226+ IL_0040: leave.s IL_0042
227+
228+ }
229+ IL_0042: ldloc.1
230+ IL_0043: stloc.3
231+ IL_0044: ldloc.3
232+ IL_0045: brtrue.s IL_0048
233+
234+ IL_0047: ret
235+
236+ IL_0048: ldarg.0
237+ IL_0049: ldflda valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32> TestStateMachine/test@3::Data
238+ IL_004e: ldflda valuetype [runtime]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<!0> valuetype [FSharp.Core]Microsoft.FSharp.Control.TaskStateMachineData`1<int32>::MethodBuilder
239+ IL_0053: ldloc.3
240+ IL_0054: call instance void valuetype [netstandard]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32>::SetException(class [netstandard]System.Exception)
241+ IL_0059: ret
242+ }
243+ """ ]
0 commit comments