public override void SetCurrentLanguage(Guid runtimeKindGuid, DbgLanguage language) { if (language is null) { throw new ArgumentNullException(nameof(language)); } dbgManager.Value.Dispatcher.BeginInvoke(() => SetCurrentLanguage_DbgThread(runtimeKindGuid, language)); }
TypeState GetOrCreateTypeState(DmdType type, DbgLanguage language) { var state = StateWithKey <TypeState> .TryGet(type, language); if (state != null) { return(state); } return(GetOrCreateTypeStateCore(type, language)); }
public static DbgValueNode[] ToValueNodeArray(DbgLanguage language, DbgRuntime runtime, DbgEngineValueNode[] engineNodes) { var nodes = new DbgValueNode[engineNodes.Length]; for (int i = 0; i < nodes.Length; i++) { nodes[i] = new DbgValueNodeImpl(language, runtime, engineNodes[i]); } runtime.CloseOnContinue(nodes); return(nodes); }
public override Guid?GetDecompilerGuid(DbgLanguage language) { switch (language.Name) { case PredefinedDbgLanguageNames.CSharp: return(DecompilerConstants.LANGUAGE_CSHARP); case PredefinedDbgLanguageNames.VisualBasic: return(DecompilerConstants.LANGUAGE_VISUALBASIC); default: return(null); } }
public DbgEvaluationContextImpl(DbgLanguage language, DbgRuntime runtime, TimeSpan funcEvalTimeout, DbgEvaluationContextOptions options) { lockObj = new object(); Language = language ?? throw new ArgumentNullException(nameof(language)); Runtime = runtime ?? throw new ArgumentNullException(nameof(runtime)); FuncEvalTimeout = funcEvalTimeout; Options = options; continueContext = new DbgContinueContext(); continueContext.Closed += DbgContinueContext_Closed; runtime.CloseOnContinue(continueContext); }
public DbgValueNodeImpl(DbgLanguage language, DbgRuntime runtime, DbgEngineValueNode engineValueNode) { Runtime = runtime ?? throw new ArgumentNullException(nameof(runtime)); Language = language ?? throw new ArgumentNullException(nameof(language)); this.engineValueNode = engineValueNode ?? throw new ArgumentNullException(nameof(engineValueNode)); var engineValue = engineValueNode.Value; if (!(engineValue is null)) { value = new DbgValueImpl(runtime, engineValue); }
Guid GetDecompilerGuid(DbgLanguage language) { foreach (var lz in dbgDotNetDecompilerGuidProviders) { var guid = lz.Value.GetDecompilerGuid(language); if (guid != null) { return(guid.Value); } } return(DecompilerConstants.LANGUAGE_CSHARP); }
public static DbgLocalsValueNodeInfo[] ToLocalsValueNodeInfoArray(DbgLanguage language, DbgRuntime runtime, DbgEngineLocalsValueNodeInfo[] engineNodeInfos) { var infos = new DbgLocalsValueNodeInfo[engineNodeInfos.Length]; var nodes = new DbgValueNode[engineNodeInfos.Length]; for (int i = 0; i < nodes.Length; i++) { var node = new DbgValueNodeImpl(language, runtime, engineNodeInfos[i].ValueNode); nodes[i] = node; infos[i] = new DbgLocalsValueNodeInfo(engineNodeInfos[i].Kind, node); } runtime.CloseOnContinue(nodes); return(infos); }
TypeState CreateTypeState(DmdType type, DbgLanguage language) { var info = GetDisplayParts(type); if (info.nameParts.Length == 0 && info.valueParts.Length == 0 && info.typeParts.Length == 0) { return(TypeState.Empty); } var context = language.CreateContext(evalInfo.Runtime, null); var state = new TypeState(context, info.nameParts, info.valueParts, info.typeParts); context.Runtime.CloseOnExit(state); return(state); }
TypeState CreateTypeState(DmdType type, DbgLanguage language) { var parts = GetDisplayParts(type) ?? Array.Empty <DisplayPart>(); if (parts.Length == 0) { return(TypeState.Empty); } var context = language.CreateContext(frame.Runtime, null, cancellationToken: cancellationToken); var state = new TypeState(context, parts); context.Runtime.CloseOnExit(state); return(state); }
void RefreshNodes_UI() { uiDispatcher.VerifyAccess(); var info = TryGetLanguage(); if (info.language != language) { language = info.language; LanguageChanged?.Invoke(this, EventArgs.Empty); } bool newIsReadOnly = info.frame == null; NodesChanged?.Invoke(this, EventArgs.Empty); SetIsReadOnly_UI(newIsReadOnly); }
public DbgValueNodeImpl(DbgLanguage language, DbgRuntime runtime, DbgEngineValueNode engineValueNode) { Runtime = runtime ?? throw new ArgumentNullException(nameof(runtime)); Language = language ?? throw new ArgumentNullException(nameof(language)); this.engineValueNode = engineValueNode ?? throw new ArgumentNullException(nameof(engineValueNode)); var engineValue = engineValueNode.Value; if (engineValue is not null) { value = new DbgValueImpl(runtime, engineValue); } else if (!engineValueNode.IsReadOnly) { throw new InvalidOperationException(); } }
public override DbgValueNodeInfo[] GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions) { if (expressions.Count == 0) { return(Array.Empty <DbgValueNodeInfo>()); } var infos = new DbgExpressionEvaluationInfo[expressions.Count]; Debug.Assert((evalOptions & DbgEvaluationOptions.NoSideEffects) == 0); for (int i = 0; i < infos.Length; i++) { var info = expressions[i]; // Root nodes in watch window can always func-eval var realEvalOptions = evalOptions & ~DbgEvaluationOptions.NoFuncEval; var realNodeEvalOptions = nodeEvalOptions & ~DbgValueNodeEvaluationOptions.NoFuncEval; if (info.ForceEval) { realEvalOptions = evalOptions & ~DbgEvaluationOptions.NoSideEffects; } else { realEvalOptions = evalOptions | DbgEvaluationOptions.NoSideEffects; } Debug.Assert(((realEvalOptions & DbgEvaluationOptions.NoFuncEval) != 0) == ((realNodeEvalOptions & DbgValueNodeEvaluationOptions.NoFuncEval) != 0)); info.ForceEval = false; infos[i] = new DbgExpressionEvaluationInfo(info.Expression, realNodeEvalOptions, realEvalOptions); } var compRes = language.ValueNodeFactory.Create(context, frame, infos); Debug.Assert(compRes.Length == infos.Length); var res = new DbgValueNodeInfo[compRes.Length]; for (int i = 0; i < res.Length; i++) { var info = compRes[i]; if (info.ValueNode.Expression != expressions[i].Expression) { throw new InvalidOperationException(); } res[i] = new DbgValueNodeInfo(info.ValueNode, expressions[i].Id, info.CausesSideEffects); } return(res); }
public override DbgValueNodeInfo[] GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions) { var returnValues = language.ReturnValuesProvider.GetNodes(context, frame, nodeEvalOptions); var variables = language.AutosProvider.GetNodes(context, frame, nodeEvalOptions); var res = new DbgValueNodeInfo[returnValues.Length + variables.Length]; int ri = 0; for (int i = 0; i < returnValues.Length; i++, ri++) { res[ri] = new DbgValueNodeInfo(returnValues[i], GetNextReturnValueId(), causesSideEffects: false); } for (int i = 0; i < variables.Length; i++, ri++) { res[ri] = new DbgValueNodeInfo(variables[i], causesSideEffects: false); } return(res); }
void SetCurrentLanguage_DbgThread(Guid runtimeKindGuid, DbgLanguage language) { dbgManager.Value.Dispatcher.VerifyAccess(); lock (lockObj) { if (!runtimeKindInfos.TryGetValue(runtimeKindGuid, out var info)) { return; } if (info.Languages is null) { return; } if (!info.Languages.Contains(language)) { return; } if (info.CurrentLanguage == language) { return; } info.CurrentLanguage = language; } LanguageChanged?.Invoke(this, new DbgLanguageChangedEventArgs(runtimeKindGuid, language)); }
public abstract void SetCurrentLanguage(DbgLanguage language);
public abstract void SetCurrentLanguage(IValueNodesVM vm, DbgLanguage language);
/// <summary> /// Gets the decompiler GUID or null /// </summary> /// <param name="language">Language</param> /// <returns></returns> public abstract Guid?GetDecompilerGuid(DbgLanguage language);
public abstract ValueNodesProviderResult GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions options, DbgValueNodeEvaluationOptions nodeEvalOptions);
public DbgValueNodeFactoryImpl(DbgLanguage language, Guid runtimeKindGuid, DbgEngineValueNodeFactory engineValueNodeFactory) { Language = language ?? throw new ArgumentNullException(nameof(language)); this.runtimeKindGuid = runtimeKindGuid; this.engineValueNodeFactory = engineValueNodeFactory ?? throw new ArgumentNullException(nameof(engineValueNodeFactory)); }
public override ValueNodesProviderResult GetNodes(DbgEvaluationInfo evalInfo, DbgLanguage language, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions, DbgValueFormatterOptions nameFormatterOptions) { var recreateAllNodes = forceRecreateAllNodes; forceRecreateAllNodes = false; const CultureInfo?cultureInfo = null; var exceptions = language.ExceptionsProvider.GetNodes(evalInfo, nodeEvalOptions); var returnValues = debuggerSettings.ShowReturnValues ? language.ReturnValuesProvider.GetNodes(evalInfo, nodeEvalOptions) : Array.Empty <DbgValueNode>(); var variables = language.LocalsProvider.GetNodes(evalInfo, nodeEvalOptions, GetLocalsValueNodeOptions()); var typeVariables = language.TypeVariablesProvider.GetNodes(evalInfo, nodeEvalOptions); var objectIds = dbgObjectIdService.GetObjectIds(evalInfo.Frame.Runtime); Array.Sort(objectIds, DbgObjectIdComparer.Instance); int count = exceptions.Length + returnValues.Length + objectIds.Length + variables.Length + typeVariables.Length; if (count == 0) { return(new ValueNodesProviderResult(Array.Empty <DbgValueNodeInfo>(), false)); } var res = new DbgValueNodeInfo[count]; int ri = 0; for (int i = 0; i < exceptions.Length; i++, ri++) { ulong id = (uint)i; var exception = exceptions[i]; if (exception.ImageName == PredefinedDbgValueNodeImageNames.StowedException) { id |= 1UL << 32; } res[ri] = new DbgValueNodeInfo(exception, GetNextExceptionId(id), causesSideEffects: false); } for (int i = 0; i < returnValues.Length; i++, ri++) { res[ri] = new DbgValueNodeInfo(returnValues[i], GetNextReturnValueId(), causesSideEffects: false); } var objectIdNodes = language.ValueNodeFactory.Create(evalInfo, objectIds, nodeEvalOptions); Debug.Assert(objectIdNodes.Length == objectIds.Length); for (int i = 0; i < objectIdNodes.Length; i++, ri++) { var id = GetObjectIdNodeId(objectIds[i]); res[ri] = new DbgValueNodeInfo(objectIdNodes[i], id, causesSideEffects: false); } variables = GetSortedVariables(evalInfo, variables, nameFormatterOptions, cultureInfo); for (int i = 0; i < variables.Length; i++, ri++) { res[ri] = new DbgValueNodeInfo(variables[i].ValueNode, causesSideEffects: false); } for (int i = 0; i < typeVariables.Length; i++, ri++) { res[ri] = new DbgValueNodeInfo(typeVariables[i], GetNextTypeVariableId((uint)i), causesSideEffects: false); } if (res.Length != ri) { throw new InvalidOperationException(); } return(new ValueNodesProviderResult(res, recreateAllNodes)); }
public override ValueNodesProviderResult GetNodes(DbgEvaluationInfo evalInfo, DbgLanguage language, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions, DbgValueFormatterOptions nameFormatterOptions) { if (expressions.Count == 0) { return(new ValueNodesProviderResult(Array.Empty <DbgValueNodeInfo>(), false)); } var infos = new DbgExpressionEvaluationInfo[expressions.Count]; Debug.Assert((evalOptions & DbgEvaluationOptions.NoSideEffects) == 0); for (int i = 0; i < infos.Length; i++) { var info = expressions[i]; // Root nodes in watch window can always func-eval var realEvalOptions = evalOptions & ~DbgEvaluationOptions.NoFuncEval; var realNodeEvalOptions = nodeEvalOptions & ~DbgValueNodeEvaluationOptions.NoFuncEval; if (info.ForceEval) { realEvalOptions &= ~DbgEvaluationOptions.NoSideEffects; } else { realEvalOptions |= DbgEvaluationOptions.NoSideEffects; } Debug.Assert(((realEvalOptions & DbgEvaluationOptions.NoFuncEval) != 0) == ((realNodeEvalOptions & DbgValueNodeEvaluationOptions.NoFuncEval) != 0)); info.ForceEval = false; if (info.ExpressionEvaluatorState is null) { info.ExpressionEvaluatorState = language.ExpressionEvaluator.CreateExpressionEvaluatorState(); } infos[i] = new DbgExpressionEvaluationInfo(info.Expression, realNodeEvalOptions, realEvalOptions, info.ExpressionEvaluatorState); } var compRes = language.ValueNodeFactory.Create(evalInfo, infos); Debug.Assert(compRes.Length == infos.Length); var res = new DbgValueNodeInfo[compRes.Length]; for (int i = 0; i < res.Length; i++) { var info = compRes[i]; if (info.ValueNode.Expression != expressions[i].Expression) { throw new InvalidOperationException(); } res[i] = new DbgValueNodeInfo(info.ValueNode, expressions[i].Id, info.CausesSideEffects); } return(new ValueNodesProviderResult(res, false)); }
public abstract ValueNodesProviderResult GetNodes(DbgEvaluationInfo evalInfo, DbgLanguage language, DbgEvaluationOptions options, DbgValueNodeEvaluationOptions nodeEvalOptions, DbgValueFormatterOptions nameFormatterOptions);
TypeState GetOrCreateTypeStateCore(DmdType type, DbgLanguage language) { var state = CreateTypeState(type, language); return(StateWithKey <TypeState> .GetOrCreate(type, language, () => state)); }
public override ValueNodesProviderResult GetNodes(DbgEvaluationInfo evalInfo, DbgLanguage language, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions, DbgValueFormatterOptions nameFormatterOptions) { var returnValues = language.ReturnValuesProvider.GetNodes(evalInfo, nodeEvalOptions); var variables = language.AutosProvider.GetNodes(evalInfo, nodeEvalOptions); var res = new DbgValueNodeInfo[returnValues.Length + variables.Length]; int ri = 0; for (int i = 0; i < returnValues.Length; i++, ri++) { res[ri] = new DbgValueNodeInfo(returnValues[i], GetNextReturnValueId(), causesSideEffects: false); } for (int i = 0; i < variables.Length; i++, ri++) { res[ri] = new DbgValueNodeInfo(variables[i], causesSideEffects: false); } const bool recreateAllNodes = false; return(new ValueNodesProviderResult(res, recreateAllNodes)); }
void SetDecompiler(DbgLanguage language) => SetDecompiler(decompilerService.FindOrDefault(GetDecompilerGuid(language)));
public abstract DbgValueNodeInfo[] GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions options, DbgValueNodeEvaluationOptions nodeEvalOptions);
public DbgLocalsValueNodeProviderImpl(DbgLanguage language, Guid runtimeKindGuid, DbgEngineLocalsValueNodeProvider engineLocalsValueNodeProvider) { Language = language ?? throw new ArgumentNullException(nameof(language)); this.runtimeKindGuid = runtimeKindGuid; this.engineLocalsValueNodeProvider = engineLocalsValueNodeProvider ?? throw new ArgumentNullException(nameof(engineLocalsValueNodeProvider)); }
public DbgValueFormatterImpl(DbgLanguage language, Guid runtimeKindGuid, DbgEngineValueFormatter engineValueFormatter) { Language = language ?? throw new ArgumentNullException(nameof(language)); this.runtimeKindGuid = runtimeKindGuid; this.engineValueFormatter = engineValueFormatter ?? throw new ArgumentNullException(nameof(engineValueFormatter)); }
public DbgExpressionEvaluatorImpl(DbgLanguage language, Guid runtimeKindGuid, DbgEngineExpressionEvaluator engineExpressionEvaluator) { Language = language ?? throw new ArgumentNullException(nameof(language)); this.runtimeKindGuid = runtimeKindGuid; this.engineExpressionEvaluator = engineExpressionEvaluator ?? throw new ArgumentNullException(nameof(engineExpressionEvaluator)); }