public static void Run(MethodSymbol method, BoundStatement block, ILBuilder builder, PEModuleBuilder module, DiagnosticBag diagnostics, bool optimize, bool emitSequencePoints, out int asyncCatchHandlerOffset, out ImmutableArray<int> asyncYieldPoints, out ImmutableArray<int> asyncResumePoints) { CodeGenerator generator = new CodeGenerator(method, block, builder, module, diagnostics, optimize, emitSequencePoints); generator.Generate(); if (!diagnostics.HasAnyErrors()) { builder.Realize(); } asyncCatchHandlerOffset = (generator.asyncCatchHandlerOffset < 0) ? -1 : generator.builder.GetILOffsetFromMarker(generator.asyncCatchHandlerOffset); ArrayBuilder<int> yieldPoints = generator.asyncYieldPoints; ArrayBuilder<int> resumePoints = generator.asyncResumePoints; if (yieldPoints == null) { asyncYieldPoints = ImmutableArray<int>.Empty; asyncResumePoints = ImmutableArray<int>.Empty; } else { var yieldPointBuilder = ArrayBuilder<int>.GetInstance(); var resumePointBuilder = ArrayBuilder<int>.GetInstance(); int n = yieldPoints.Count; for (int i = 0; i < n; i++) { int yieldOffset = generator.builder.GetILOffsetFromMarker(yieldPoints[i]); int resumeOffset = generator.builder.GetILOffsetFromMarker(resumePoints[i]); Debug.Assert(resumeOffset >= 0); // resume marker should always be reachable from dispatch // yield point may not be reachable if the whole // await is not reachable; we just ignore such awaits if (yieldOffset > 0) { yieldPointBuilder.Add(yieldOffset); resumePointBuilder.Add(resumeOffset); } } asyncYieldPoints = yieldPointBuilder.ToImmutableAndFree(); asyncResumePoints = resumePointBuilder.ToImmutableAndFree(); yieldPoints.Free(); resumePoints.Free(); } }
public static void Run(MethodSymbol method, BoundStatement block, ILBuilder builder, PEModuleBuilder module, DiagnosticBag diagnostics, bool optimize, bool emitSequencePoints) { CodeGenerator generator = new CodeGenerator(method, block, builder, module, diagnostics, optimize, emitSequencePoints); generator.Generate(); Debug.Assert(generator.asyncCatchHandlerOffset < 0); Debug.Assert(generator.asyncYieldPoints == null); Debug.Assert(generator.asyncResumePoints == null); if (!diagnostics.HasAnyErrors()) { builder.Realize(); } }