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); }
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)); }
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); }
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)); } }
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))); } }