File: Lowering\AsyncRewriter\AsyncRewriter.SpillFieldAllocator.vb
Web Access
Project: src\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports System.Collections.Generic
Imports System.Threading
Imports Microsoft.Cci
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Collections
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
 
Namespace Microsoft.CodeAnalysis.VisualBasic
 
    Partial Friend NotInheritable Class AsyncRewriter
        Inherits StateMachineRewriter(Of CapturedSymbolOrExpression)
 
        ''' <summary>
        ''' Spill field allocator controls allocation and reuse of the set of fields 
        ''' used to spilling expressions; current implementation allows reuse of fields 
        ''' of the same type on high-level statement level
        ''' </summary>
        Private Class SpillFieldAllocator
            Private ReadOnly _F As SyntheticBoundNodeFactory
            Private ReadOnly _allocatedFields As New KeyedStack(Of TypeSymbol, FieldSymbol)
            Private ReadOnly _realizedSpills As New HashSet(Of FieldSymbol)(ReferenceEqualityComparer.Instance)
 
            Private _nextHoistedFieldId As Integer
 
            Friend Sub New(f As SyntheticBoundNodeFactory)
                Me._F = f
                Me._nextHoistedFieldId = 0
            End Sub
 
            Friend Function AllocateField(type As TypeSymbol) As FieldSymbol
                Dim field As FieldSymbol = Nothing
                If Not Me._allocatedFields.TryPop(type, field) Then
                    _nextHoistedFieldId += 1
 
                    field = _F.StateMachineField(type,
                                              _F.CurrentMethod,
                                              GeneratedNames.ReusableHoistedLocalFieldName(_nextHoistedFieldId),
                                              Accessibility.Friend)
                End If
                Me._realizedSpills.Add(field)
                Return field
            End Function
 
            Friend Sub FreeField(field As FieldSymbol)
                Debug.Assert(Me._realizedSpills.Contains(field))
                Me._realizedSpills.Remove(field)
                Me._allocatedFields.Push(field.Type, field)
            End Sub
 
        End Class
    End Class
 
End Namespace