public ImmutableSortedSet <int> GetInScopeHoistedLocalIndices(int ilOffset, ref ILSpan methodContextReuseSpan) { if (HoistedLocalScopeRecords.IsDefaultOrEmpty) { return(ImmutableSortedSet <int> .Empty); } methodContextReuseSpan = MethodContextReuseConstraints.CalculateReuseSpan( ilOffset, methodContextReuseSpan, HoistedLocalScopeRecords.Select(record => new ILSpan((uint)record.StartOffset, (uint)(record.StartOffset + record.Length)))); var scopesBuilder = ArrayBuilder <int> .GetInstance(); int i = 0; foreach (var record in HoistedLocalScopeRecords) { var delta = ilOffset - record.StartOffset; if (0 <= delta && delta < record.Length) { scopesBuilder.Add(i); } i++; } var result = scopesBuilder.ToImmutableSortedSet(); scopesBuilder.Free(); return(result); }
public ImmutableSortedSet<int> GetInScopeHoistedLocalIndices(int ilOffset, ref MethodContextReuseConstraints methodContextReuseConstraints) { if (this.HoistedLocalScopeRecords.IsDefault) { return ImmutableSortedSet<int>.Empty; } var constraintsBuilder = new MethodContextReuseConstraints.Builder(methodContextReuseConstraints, ilOffset, areRangesEndInclusive: false); var scopesBuilder = ArrayBuilder<int>.GetInstance(); int i = 0; foreach (var record in this.HoistedLocalScopeRecords) { constraintsBuilder.AddRange(record.StartOffset, record.StartOffset + record.Length); var delta = ilOffset - record.StartOffset; if (0 <= delta && delta < record.Length) { scopesBuilder.Add(i); } i++; } methodContextReuseConstraints = constraintsBuilder.Build(); var result = scopesBuilder.ToImmutableSortedSet(); scopesBuilder.Free(); return result; }
private static ILSpan GetReuseSpan(ArrayBuilder <ISymUnmanagedScope> scopes, int ilOffset, bool isEndInclusive) { return(MethodContextReuseConstraints.CalculateReuseSpan( ilOffset, ILSpan.MaxValue, scopes.Select(scope => new ILSpan((uint)scope.GetStartOffset(), (uint)(scope.GetEndOffset() + (isEndInclusive ? 1 : 0)))))); }
public ImmutableSortedSet <int> GetInScopeHoistedLocalIndices(int ilOffset, ref MethodContextReuseConstraints methodContextReuseConstraints) { if (this.HoistedLocalScopeRecords.IsDefault) { return(ImmutableSortedSet <int> .Empty); } var constraintsBuilder = new MethodContextReuseConstraints.Builder(methodContextReuseConstraints, ilOffset, areRangesEndInclusive: false); var scopesBuilder = ArrayBuilder <int> .GetInstance(); int i = 0; foreach (var record in this.HoistedLocalScopeRecords) { constraintsBuilder.AddRange(record.StartOffset, record.StartOffset + record.Length); var delta = ilOffset - record.StartOffset; if (0 <= delta && delta < record.Length) { scopesBuilder.Add(i); } i++; } methodContextReuseConstraints = constraintsBuilder.Build(); var result = scopesBuilder.ToImmutableSortedSet(); scopesBuilder.Free(); return(result); }
public Builder(MethodContextReuseConstraints existingConstraints, int ilOffset, bool areRangesEndInclusive) { _methodToken = existingConstraints._methodToken; _methodVersion = existingConstraints._methodVersion; _ilOffset = ilOffset; _areRangesEndInclusive = areRangesEndInclusive; _startOffset = existingConstraints._startOffset; _endOffsetExclusive = existingConstraints._endOffsetExclusive; }
public Builder(MethodContextReuseConstraints existingConstraints, int ilOffset, bool areRangesEndInclusive) { _moduleVersionId = existingConstraints._moduleVersionId; _methodToken = existingConstraints._methodToken; _methodVersion = existingConstraints._methodVersion; _ilOffset = ilOffset; _areRangesEndInclusive = areRangesEndInclusive; _startOffset = existingConstraints._startOffset; _endOffsetExclusive = existingConstraints._endOffsetExclusive; }
private EvaluationContext( MethodContextReuseConstraints? methodContextReuseConstraints, CSharpCompilation compilation, MethodSymbol currentFrame, ImmutableArray<LocalSymbol> locals, InScopeHoistedLocals inScopeHoistedLocals, MethodDebugInfo<TypeSymbol, LocalSymbol> methodDebugInfo) { Debug.Assert(inScopeHoistedLocals != null); Debug.Assert(methodDebugInfo != null); this.MethodContextReuseConstraints = methodContextReuseConstraints; this.Compilation = compilation; _currentFrame = currentFrame; _locals = locals; _inScopeHoistedLocals = inScopeHoistedLocals; _methodDebugInfo = methodDebugInfo; }
public void AreSatisfied() { var moduleVersionId = Guid.NewGuid(); const int methodToken = 0x06000001; const int methodVersion = 1; const uint startOffset = 1; const uint endOffsetExclusive = 3; var constraints = new MethodContextReuseConstraints( moduleVersionId, methodToken, methodVersion, new ILSpan(startOffset, endOffsetExclusive)); Assert.True(constraints.AreSatisfied(moduleVersionId, methodToken, methodVersion, (int)startOffset)); Assert.True(constraints.AreSatisfied(moduleVersionId, methodToken, methodVersion, (int)endOffsetExclusive - 1)); Assert.False(constraints.AreSatisfied(Guid.NewGuid(), methodToken, methodVersion, (int)startOffset)); Assert.False(constraints.AreSatisfied(moduleVersionId, methodToken + 1, methodVersion, (int)startOffset)); Assert.False(constraints.AreSatisfied(moduleVersionId, methodToken, methodVersion + 1, (int)startOffset)); Assert.False(constraints.AreSatisfied(moduleVersionId, methodToken, methodVersion, (int)startOffset - 1)); Assert.False(constraints.AreSatisfied(moduleVersionId, methodToken, methodVersion, (int)endOffsetExclusive)); }