Exemple #1
0
        public VariableSubscription Subscribe(
            int frameIndex,
            string variableExpression,
            Action <DebugEvaluationResult> executeAction)
        {
            var token = new VariableSubscriptionToken(frameIndex, variableExpression);

            var subscription = new VariableSubscription(
                token,
                executeAction,
                Unsubscribe);

            lock (_subscribers) {
                List <VariableSubscription> subscriptions;
                if (_subscribers.TryGetValue(subscription.Token, out subscriptions))
                {
                    subscriptions.Add(subscription);
                }
                else
                {
                    _subscribers.Add(
                        token,
                        new List <VariableSubscription>()
                    {
                        subscription
                    });
                }
            }

            return(subscription);
        }
Exemple #2
0
        public VariableSubscription(
            VariableSubscriptionToken token,
            Action <DebugEvaluationResult> executeAction,
            Action <VariableSubscription> unsubscribeAction)
        {
            Token = token;

            _weakReference = new WeakReference(executeAction.Target);
            _method        = executeAction.Method;
            _delegateType  = executeAction.GetType();

            _unsubscribe = unsubscribeAction;
        }
Exemple #3
0
        private async Task PublishAsync(VariableSubscriptionToken token, IList <VariableSubscription> subscriptions)
        {
            if (subscriptions.Count == 0)
            {
                return;
            }

            Debug.Assert(_debugSession != null);

            var stackFrames = await _debugSession.GetStackFramesAsync();

            var stackFrame = stackFrames.FirstOrDefault(f => f.Index == token.FrameIndex);

            if (stackFrame != null)
            {
                const DebugEvaluationResultFields fields = DebugEvaluationResultFields.Classes
                                                           | DebugEvaluationResultFields.Expression
                                                           | DebugEvaluationResultFields.TypeName
                                                           | (DebugEvaluationResultFields.Repr | DebugEvaluationResultFields.ReprStr)
                                                           | DebugEvaluationResultFields.Dim
                                                           | DebugEvaluationResultFields.Length;

                DebugEvaluationResult evaluation = await stackFrame.EvaluateAsync(token.Expression, fields : fields);

                foreach (var sub in subscriptions)
                {
                    try {
                        var action = sub.GetExecuteAction();
                        if (action != null)
                        {
                            action(evaluation);
                        }
                    } catch (Exception e) {
                        Debug.Fail(e.ToString());
                        // swallow exception and continue
                    }
                }
            }
        }