Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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;
        }
 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))))));
 }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
            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;
            }
Ejemplo n.º 7
0
        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));
        }