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)); }
DbgDotNetValueResult?Box_CorDebug(DbgEvaluationInfo evalInfo) { engine.VerifyCorDebugThread(); evalInfo.CancellationToken.ThrowIfCancellationRequested(); var corValue = TryGetCorValue(); if (corValue == null) { return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.InternalError)); } if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(evalInfo.Frame, out var ilFrame)) { return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.InternalError)); } // Even if it's boxed, box the unboxed value. This code path should only be called if // the compiler thinks it's an unboxed value, so we must make a new boxed value. if (corValue.IsReference) { corValue = corValue.GetDereferencedValue(out int hr); if (corValue == null) { return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.GetErrorMessage(hr))); } } if (corValue.IsBox) { corValue = corValue.GetBoxedValue(out int hr); if (corValue == null) { return(DbgDotNetValueResult.CreateError(CordbgErrorHelper.GetErrorMessage(hr))); } } return(engine.Box_CorDebug(evalInfo, ilFrame.GetCorAppDomain(), corValue, Type)); }
string?StoreIndirect_CorDebug(DbgEvaluationInfo evalInfo, object?value) { engine.VerifyCorDebugThread(); evalInfo.CancellationToken.ThrowIfCancellationRequested(); if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(evalInfo.Frame, out var ilFrame)) { return(CordbgErrorHelper.InternalError); } if (!Type.IsByRef && !Type.IsPointer) { return(CordbgErrorHelper.InternalError); } Func <CreateCorValueResult> createTargetValue = () => { var objValue = TryGetCorValue(); if (objValue is null) { return(new CreateCorValueResult(null, -1)); } Debug.Assert(objValue.ElementType == CorElementType.ByRef || objValue.ElementType == CorElementType.Ptr); if (objValue.ElementType == CorElementType.ByRef || objValue.ElementType == CorElementType.Ptr) { var derefencedValue = objValue.GetDereferencedValue(out int hr); if (derefencedValue is null) { return(new CreateCorValueResult(null, hr)); } if (!derefencedValue.IsReference) { if (derefencedValue.IsGeneric) { return(new CreateCorValueResult(derefencedValue, 0, canDispose: true)); } engine.DisposeHandle_CorDebug(derefencedValue); return(new CreateCorValueResult(null, -1)); } return(new CreateCorValueResult(derefencedValue, 0, canDispose: true)); } else { return(new CreateCorValueResult(null, -1)); } }; return(engine.StoreValue_CorDebug(evalInfo, ilFrame, createTargetValue, Type.GetElementType() !, value)); }
string StoreIndirect_CorDebug(DbgEvaluationContext context, DbgStackFrame frame, object value, CancellationToken cancellationToken) { engine.VerifyCorDebugThread(); cancellationToken.ThrowIfCancellationRequested(); if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame)) { return(CordbgErrorHelper.InternalError); } if (!Type.IsByRef) { return(CordbgErrorHelper.InternalError); } Func <CreateCorValueResult> createTargetValue = () => { var objValue = TryGetCorValue(); if (objValue == null) { return(new CreateCorValueResult(null, -1)); } Debug.Assert(objValue.ElementType == CorElementType.ByRef); if (objValue.ElementType == CorElementType.ByRef) { var derefencedValue = objValue.DereferencedValue; if (derefencedValue == null) { return(new CreateCorValueResult(null, -1)); } if (!derefencedValue.IsReference) { if (derefencedValue.IsGeneric) { return(new CreateCorValueResult(derefencedValue, 0, canDispose: true)); } engine.DisposeHandle_CorDebug(derefencedValue); return(new CreateCorValueResult(null, -1)); } return(new CreateCorValueResult(derefencedValue, 0, canDispose: true)); } else { return(new CreateCorValueResult(null, -1)); } }; return(engine.StoreValue_CorDebug(context, frame.Thread, ilFrame, createTargetValue, Type.GetElementType(), value, cancellationToken)); }
DbgDotNetValue Box_CorDebug(DbgEvaluationContext context, DbgStackFrame frame, CancellationToken cancellationToken) { engine.VerifyCorDebugThread(); cancellationToken.ThrowIfCancellationRequested(); var corValue = TryGetCorValue(); if (corValue == null) { return(null); } if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame)) { return(null); } // Even if it's boxed, box the unboxed value. This code path should only be called if // the compiler thinks it's an unboxed value, so we must make a new boxed value. if (corValue.IsReference) { corValue = corValue.DereferencedValue; if (corValue == null) { return(null); } } if (corValue.IsBox) { corValue = corValue.BoxedValue; if (corValue == null) { return(null); } } var res = engine.Box_CorDebug(context, frame.Thread, ilFrame.GetCorAppDomain(), corValue, Type, cancellationToken); if (res.IsNormalResult) { return(res.Value); } res.Value?.Dispose(); return(null); }
public bool TryGetNativeCode(DbgStackFrame frame, out DbgDotNetNativeCode nativeCode) { if (!ILDbgEngineStackFrame.TryGetEngineStackFrame(frame, out var ilFrame)) { nativeCode = default; return(false); } if (Dispatcher.CheckAccess()) { return(TryGetNativeCodeCore(ilFrame, out nativeCode)); } return(TryGetNativeCode2(ilFrame, out nativeCode)); bool TryGetNativeCode2(ILDbgEngineStackFrame ilFrame2, out DbgDotNetNativeCode nativeCode2) { DbgDotNetNativeCode nativeCodeTmp = default; bool res = Dispatcher.InvokeRethrow(() => TryGetNativeCodeCore(ilFrame2, out nativeCodeTmp)); nativeCode2 = nativeCodeTmp; return(res); } }