示例#1
0
        bool GetArrayInfo_CorDebug(out uint elementCount, [NotNullWhen(true)] out DbgDotNetArrayDimensionInfo[]?dimensionInfos)
        {
            Debug.Assert(Type.IsArray);
            engine.VerifyCorDebugThread();
            var corValue = TryGetCorValue();

            if (corValue is null || corValue.IsNull)
            {
                elementCount   = 0;
                dimensionInfos = null;
                return(false);
            }
            using (var obj = new ArrayObjectValue(engine, corValue)) {
                if (obj.Value is null)
                {
                    elementCount   = 0;
                    dimensionInfos = null;
                    return(false);
                }
                elementCount = obj.Value.ArrayCount;
                var baseIndexes = (obj.Value.HasBaseIndicies ? obj.Value.BaseIndicies : null) ?? Array.Empty <uint>();
                var dimensions  = obj.Value.Dimensions;
                if (!(dimensions is null))
                {
                    var infos = new DbgDotNetArrayDimensionInfo[dimensions.Length];
                    for (int i = 0; i < infos.Length; i++)
                    {
                        infos[i] = new DbgDotNetArrayDimensionInfo((int)(i < baseIndexes.Length ? baseIndexes[i] : 0), dimensions[i]);
                    }
                    dimensionInfos = infos;
                    return(true);
                }
示例#2
0
        string SetArrayElementAt_CorDebug(DbgEvaluationContext context, DbgStackFrame frame, uint index, object value, CancellationToken cancellationToken)
        {
            engine.VerifyCorDebugThread();
            cancellationToken.ThrowIfCancellationRequested();
            if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame))
            {
                return(CordbgErrorHelper.InternalError);
            }
            Func <CreateCorValueResult> createTargetValue = () => {
                var corValue = TryGetCorValue();
                if (corValue == null || corValue.IsNull)
                {
                    return(new CreateCorValueResult(null, -1));
                }
                using (var obj = new ArrayObjectValue(engine, corValue)) {
                    if (obj.Value == null)
                    {
                        return(new CreateCorValueResult(null, -1));
                    }
                    var elemValue = obj.Value.GetElementAtPosition(index, out int hr);
                    return(new CreateCorValueResult(elemValue, hr));
                }
            };

            return(engine.StoreValue_CorDebug(context, frame.Thread, ilFrame, createTargetValue, Type.GetElementType(), value, cancellationToken));
        }
示例#3
0
        uint GetArrayCountCore_CorDebug()
        {
            Debug.Assert(Type.IsArray);
            engine.VerifyCorDebugThread();
            var corValue = TryGetCorValue();

            if (corValue is null || corValue.IsNull)
            {
                return(0);
            }
            using (var obj = new ArrayObjectValue(engine, corValue))
                return(obj.Value?.ArrayCount ?? 0);
        }
示例#4
0
        DbgDotNetValue GetArrayElementAt_CorDebug(uint index)
        {
            Debug.Assert(Type.IsArray);
            engine.VerifyCorDebugThread();
            var corValue = TryGetCorValue();

            if (corValue == null || corValue.IsNull)
            {
                return(null);
            }
            using (var obj = new ArrayObjectValue(engine, corValue)) {
                var elemValue = obj.Value?.GetElementAtPosition(index, out int hr);
                if (elemValue == null)
                {
                    return(null);
                }
                return(engine.CreateDotNetValue_CorDebug(elemValue, Type.AppDomain, tryCreateStrongHandle: true));
            }
        }
示例#5
0
        DbgDotNetValueResult GetArrayElementAt_CorDebug(uint index)
        {
            Debug.Assert(Type.IsArray);
            engine.VerifyCorDebugThread();
            var corValue = TryGetCorValue();

            if (corValue == null || corValue.IsNull)
            {
                return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.InternalError));
            }
            using (var obj = new ArrayObjectValue(engine, corValue)) {
                int hr        = -1;
                var elemValue = obj.Value?.GetElementAtPosition(index, out hr);
                if (elemValue == null)
                {
                    return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.GetErrorMessage(hr)));
                }
                return(DbgDotNetValueResult.Create(engine.CreateDotNetValue_CorDebug(elemValue, Type.AppDomain, tryCreateStrongHandle: true)));
            }
        }