internal static void Analyze( CSharpCompilation compilation, Symbol member, BoundNode node, BoundNode firstInRegion, BoundNode lastInRegion, HashSet <PrefixUnaryExpressionSyntax> unassignedVariableAddressOfSyntaxes, out IEnumerable <Symbol> readInside, out IEnumerable <Symbol> writtenInside, out IEnumerable <Symbol> readOutside, out IEnumerable <Symbol> writtenOutside, out IEnumerable <Symbol> captured, out IEnumerable <Symbol> unsafeAddressTaken) { var walker = new ReadWriteWalker(compilation, member, node, firstInRegion, lastInRegion, unassignedVariableAddressOfSyntaxes); try { bool badRegion = false; walker.Analyze(ref badRegion); if (badRegion) { readInside = writtenInside = readOutside = writtenOutside = captured = unsafeAddressTaken = Enumerable.Empty <Symbol>(); } else { readInside = walker._readInside; writtenInside = walker._writtenInside; readOutside = walker._readOutside; writtenOutside = walker._writtenOutside; captured = walker.GetCaptured(); unsafeAddressTaken = walker.GetUnsafeAddressTaken(); } } finally { walker.Free(); } }
private void AnalyzeReadWrite() { IEnumerable <Symbol> readInside, writtenInside, readOutside, writtenOutside, captured, unsafeAddressTaken, capturedInside, capturedOutside; if (Succeeded) { ReadWriteWalker.Analyze(_context.Compilation, _context.Member, _context.BoundNode, _context.FirstInRegion, _context.LastInRegion, UnassignedVariableAddressOfSyntaxes, readInside: out readInside, writtenInside: out writtenInside, readOutside: out readOutside, writtenOutside: out writtenOutside, captured: out captured, unsafeAddressTaken: out unsafeAddressTaken, capturedInside: out capturedInside, capturedOutside: out capturedOutside); } else { readInside = writtenInside = readOutside = writtenOutside = captured = unsafeAddressTaken = capturedInside = capturedOutside = Enumerable.Empty <Symbol>(); } ImmutableInterlocked.InterlockedInitialize(ref _readInside, Normalize(readInside)); ImmutableInterlocked.InterlockedInitialize(ref _writtenInside, Normalize(writtenInside)); ImmutableInterlocked.InterlockedInitialize(ref _readOutside, Normalize(readOutside)); ImmutableInterlocked.InterlockedInitialize(ref _writtenOutside, Normalize(writtenOutside)); ImmutableInterlocked.InterlockedInitialize(ref _captured, Normalize(captured)); ImmutableInterlocked.InterlockedInitialize(ref _capturedInside, Normalize(capturedInside)); ImmutableInterlocked.InterlockedInitialize(ref _capturedOutside, Normalize(capturedOutside)); ImmutableInterlocked.InterlockedInitialize(ref _unsafeAddressTaken, Normalize(unsafeAddressTaken)); }
internal static void Analyze( CSharpCompilation compilation, Symbol member, BoundNode node, BoundNode firstInRegion, BoundNode lastInRegion, HashSet<PrefixUnaryExpressionSyntax> unassignedVariableAddressOfSyntaxes, out IEnumerable<Symbol> readInside, out IEnumerable<Symbol> writtenInside, out IEnumerable<Symbol> readOutside, out IEnumerable<Symbol> writtenOutside, out IEnumerable<Symbol> captured, out IEnumerable<Symbol> unsafeAddressTaken) { var walker = new ReadWriteWalker(compilation, member, node, firstInRegion, lastInRegion, unassignedVariableAddressOfSyntaxes); try { bool badRegion = false; walker.Analyze(ref badRegion); if (badRegion) { readInside = writtenInside = readOutside = writtenOutside = captured = unsafeAddressTaken = Enumerable.Empty<Symbol>(); } else { readInside = walker._readInside; writtenInside = walker._writtenInside; readOutside = walker._readOutside; writtenOutside = walker._writtenOutside; captured = walker.GetCaptured(); unsafeAddressTaken = walker.GetUnsafeAddressTaken(); } } finally { walker.Free(); } }
private void AnalyzeReadWrite() { IEnumerable <Symbol> readInside, writtenInside, readOutside, writtenOutside, captured, unsafeAddressTaken; if (Succeeded) { ReadWriteWalker.Analyze(context.Compilation, context.Member, context.BoundNode, context.FirstInRegion, context.LastInRegion, UnassignedVariableAddressOfSyntaxes, readInside: out readInside, writtenInside: out writtenInside, readOutside: out readOutside, writtenOutside: out writtenOutside, captured: out captured, unsafeAddressTaken: out unsafeAddressTaken); } else { readInside = writtenInside = readOutside = writtenOutside = captured = unsafeAddressTaken = Enumerable.Empty <Symbol>(); } Interlocked.CompareExchange(ref this.readInside, readInside, null); Interlocked.CompareExchange(ref this.writtenInside, writtenInside, null); Interlocked.CompareExchange(ref this.readOutside, readOutside, null); Interlocked.CompareExchange(ref this.writtenOutside, writtenOutside, null); Interlocked.CompareExchange(ref this.captured, captured, null); Interlocked.CompareExchange(ref this.unsafeAddressTaken, unsafeAddressTaken, null); }
private void AnalyzeReadWrite() { ImmutableArray <ISymbol> readInside, writtenInside, readOutside, writtenOutside, captured, unsafeAddressTaken; if (Succeeded) { ReadWriteWalker.Analyze(context.Compilation, context.Member, context.BoundNode, context.FirstInRegion, context.LastInRegion, UnassignedVariableAddressOfSyntaxes, readInside: out readInside, writtenInside: out writtenInside, readOutside: out readOutside, writtenOutside: out writtenOutside, captured: out captured, unsafeAddressTaken: out unsafeAddressTaken); } else { readInside = writtenInside = readOutside = writtenOutside = captured = unsafeAddressTaken = ImmutableArray <ISymbol> .Empty; } ImmutableInterlocked.InterlockedInitialize(ref this.readInside, readInside); ImmutableInterlocked.InterlockedInitialize(ref this.writtenInside, writtenInside); ImmutableInterlocked.InterlockedInitialize(ref this.readOutside, readOutside); ImmutableInterlocked.InterlockedInitialize(ref this.writtenOutside, writtenOutside); ImmutableInterlocked.InterlockedInitialize(ref this.captured, captured); ImmutableInterlocked.InterlockedInitialize(ref this.unsafeAddressTaken, unsafeAddressTaken); }