Ejemplo n.º 1
0
 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));
 }
Ejemplo n.º 2
0
        TypeState GetOrCreateTypeState(DmdType type, DbgLanguage language)
        {
            var state = StateWithKey <TypeState> .TryGet(type, language);

            if (state != null)
            {
                return(state);
            }
            return(GetOrCreateTypeStateCore(type, language));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
 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);
 }
Ejemplo n.º 6
0
        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);
            }
Ejemplo n.º 7
0
 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);
 }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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();
            }
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 15
0
 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));
 }
Ejemplo n.º 16
0
 public abstract void SetCurrentLanguage(DbgLanguage language);
Ejemplo n.º 17
0
 public abstract void SetCurrentLanguage(IValueNodesVM vm, DbgLanguage language);
Ejemplo n.º 18
0
 /// <summary>
 /// Gets the decompiler GUID or null
 /// </summary>
 /// <param name="language">Language</param>
 /// <returns></returns>
 public abstract Guid?GetDecompilerGuid(DbgLanguage language);
Ejemplo n.º 19
0
 public abstract ValueNodesProviderResult GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions options, DbgValueNodeEvaluationOptions nodeEvalOptions);
Ejemplo n.º 20
0
 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));
        }
Ejemplo n.º 22
0
        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));
        }
Ejemplo n.º 23
0
 public abstract ValueNodesProviderResult GetNodes(DbgEvaluationInfo evalInfo, DbgLanguage language, DbgEvaluationOptions options, DbgValueNodeEvaluationOptions nodeEvalOptions, DbgValueFormatterOptions nameFormatterOptions);
Ejemplo n.º 24
0
        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));
        }
Ejemplo n.º 26
0
 void SetDecompiler(DbgLanguage language) => SetDecompiler(decompilerService.FindOrDefault(GetDecompilerGuid(language)));
Ejemplo n.º 27
0
 public abstract DbgValueNodeInfo[] GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions options, DbgValueNodeEvaluationOptions nodeEvalOptions);
Ejemplo n.º 28
0
 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));
 }
Ejemplo n.º 29
0
 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));
 }
Ejemplo n.º 30
0
 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));
 }