Beispiel #1
0
        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)));
        }
Beispiel #2
0
        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++)));
        }