void DnEval_EvalEvent(object sender, EvalEventArgs e, DnEval eval) { if (eval == null || sender != eval) { return; } if (eval.EvalTimedOut) { EvalDisabled = true; } if (callingEvalComplete) { return; } callingEvalComplete = true; if (!dispatcher.HasShutdownStarted && !dispatcher.HasShutdownFinished) { dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => { callingEvalComplete = false; if (ProcessState == DebuggerProcessState.Paused) { Debugger.SignalEvalComplete(); } })); } }
public EvalArgumentConverter(DbgEngineImpl engine, DnEval dnEval, CorAppDomain appDomain, DmdAppDomain reflectionAppDomain, List <CorValue> createdValues) { this.engine = engine; this.dnEval = dnEval; this.appDomain = appDomain; this.reflectionAppDomain = reflectionAppDomain; this.createdValues = createdValues; }
void DnEval_EvalEvent(DnEval dnEval, DbgEvaluationInfo evalInfo) { if (dnEval.EvalTimedOut) { evalInfo.Context.ContinueContext.GetOrCreateData <EvalTimedOut>(); } dnDebugger.SignalEvalComplete(); }
CorValue BoxIfNeeded(DnEval dnEval, CorAppDomain appDomain, List <CorValue> createdValues, CorValue corValue, DmdType targetType, DmdType valueType) { if (!targetType.IsValueType && valueType.IsValueType && corValue.IsGeneric && !corValue.IsHeap) { var etype = corValue.ElementType; var corValueType = corValue.ExactType; if (corValueType?.HasClass == false) { corValueType = GetType(appDomain, valueType); } var boxedValue = dnEval.Box(corValue, corValueType) ?? throw new InvalidOperationException(); if (!boxedValue.Equals(corValue)) { createdValues.Add(boxedValue); } corValue = boxedValue; } return(corValue); }
string?StoreValue_CorDebug(DnEval dnEval, List <CorValue> createdValues, CorAppDomain appDomain, DnThread dnThread, CorValue targetValue, DmdType targetType, CorValue sourceValue, DmdType sourceType) { if (targetType.IsByRef) { return(CordbgErrorHelper.InternalError); } int hr; if (!targetType.IsValueType) { if (!targetValue.IsReference) { return(CordbgErrorHelper.InternalError); } if (!sourceValue.IsReference) { var boxedSourceValue = BoxIfNeeded(dnEval, appDomain, createdValues, sourceValue, targetType, sourceType); if (!boxedSourceValue.IsReference) { return(CordbgErrorHelper.InternalError); } sourceValue = boxedSourceValue; } if (!sourceValue.IsNull && sourceType.IsValueType) { var sourceDerefVal = sourceValue.GetDereferencedValue(out hr); if (sourceDerefVal is null) { return(CordbgErrorHelper.GetErrorMessage(hr)); } if (!sourceDerefVal.IsBox) { return(CordbgErrorHelper.InternalError); } } hr = targetValue.SetReferenceAddress(sourceValue.ReferenceAddress); if (hr != 0) { return(CordbgErrorHelper.GetErrorMessage(hr)); } return(null); } else { if (!sourceType.IsValueType) { return(CordbgErrorHelper.InternalError); } if (targetValue.IsReference) { if (!(targetValue.GetDereferencedValue(out hr) is CorValue derefValue)) { return(CordbgErrorHelper.GetErrorMessage(hr)); } targetValue = derefValue; } if (targetValue.IsBox) { return(CordbgErrorHelper.InternalError); } if (sourceValue.IsReference) { if (!(sourceValue.GetDereferencedValue(out hr) is CorValue derefValue)) { return(CordbgErrorHelper.GetErrorMessage(hr)); } sourceValue = derefValue; } if (sourceValue.IsBox) { if (!(sourceValue.GetBoxedValue(out hr) is CorValue unboxedValue)) { return(CordbgErrorHelper.GetErrorMessage(hr)); } sourceValue = unboxedValue; } if (!targetValue.IsGeneric || !sourceValue.IsGeneric) { return(CordbgErrorHelper.InternalError); } if (targetValue.Size != sourceValue.Size) { return(CordbgErrorHelper.InternalError); } hr = targetValue.WriteGenericValue(sourceValue.ReadGenericValue(), dnThread.Process.CorProcess); if (hr < 0) { return(CordbgErrorHelper.GetErrorMessage(hr)); } return(null); } }