private StateMachineFieldSymbol GetOrAllocateReusableHoistedField(TypeSymbol type, out bool reused, LocalSymbol local = null) { // In debug builds we don't reuse any hoisted variable. Debug.Assert(F.Compilation.Options.OptimizationLevel == OptimizationLevel.Release); ArrayBuilder <StateMachineFieldSymbol> fields; if (_lazyAvailableReusableHoistedFields != null && _lazyAvailableReusableHoistedFields.TryGetValue(type, out fields) && fields.Count > 0) { var field = fields.Last(); fields.RemoveLast(); reused = true; return(field); } reused = false; var slotIndex = _nextHoistedFieldId++; if (local?.SynthesizedKind == SynthesizedLocalKind.UserDefined) { string fieldName = GeneratedNames.MakeHoistedLocalFieldName(SynthesizedLocalKind.UserDefined, slotIndex, local.Name); return(F.StateMachineField(type, fieldName, SynthesizedLocalKind.UserDefined, slotIndex)); } return(F.StateMachineField(type, GeneratedNames.ReusableHoistedLocalFieldName(slotIndex))); }
private SynthesizedFieldSymbolBase GetOrAllocateHoistedField(TypeSymbol type) { ArrayBuilder <SynthesizedFieldSymbolBase> fields; if (availableHoistedFields.TryGetValue(type, out fields) && fields.Count > 0) { var field = fields.Last(); fields.RemoveLast(); return(field); } var fieldName = GeneratedNames.ReusableHoistedLocalFieldName(nextHoistedFieldId++); return(F.StateMachineField(type, fieldName, isPublic: true)); }
private StateMachineFieldSymbol GetOrAllocateReusableHoistedField(TypeSymbol type) { // In debug builds we don't reuse any hoisted variable. Debug.Assert(F.Compilation.Options.OptimizationLevel == OptimizationLevel.Release); ArrayBuilder <StateMachineFieldSymbol> fields; if (_lazyAvailableReusableHoistedFields != null && _lazyAvailableReusableHoistedFields.TryGetValue(type, out fields) && fields.Count > 0) { var field = fields.Last(); fields.RemoveLast(); return(field); } return(F.StateMachineField(type, GeneratedNames.ReusableHoistedLocalFieldName(_nextHoistedFieldId++))); }