private void RecordReadInLocalFunction(int slot) { var localFunc = GetNearestLocalFunctionOpt(currentSymbol); Debug.Assert(localFunc != null); var usages = GetOrCreateLocalFuncUsages(localFunc); // If this slot is a struct with individually assignable // fields we need to record each field assignment separately, // since some fields may be assigned when this read is replayed VariableIdentifier id = variableBySlot[slot]; var type = VariableType(id.Symbol).TypeSymbol; Debug.Assert(!_emptyStructTypeCache.IsEmptyStructType(type)); if (EmptyStructTypeCache.IsTrackableStructType(type)) { foreach (var field in _emptyStructTypeCache.GetStructInstanceFields(type)) { int fieldSlot = GetOrCreateSlot(field, slot); if (fieldSlot > 0 && !State.IsAssigned(fieldSlot)) { RecordReadInLocalFunction(fieldSlot); } } } else { usages.ReadVars[slot] = true; } }
protected LocalDataFlowPass( CSharpCompilation compilation, Symbol member, BoundNode node, EmptyStructTypeCache emptyStructs, bool trackUnassignments) : base(compilation, member, node, nonMonotonicTransferFunction: trackUnassignments) { _emptyStructTypeCache = emptyStructs; }