Ejemplo n.º 1
0
            public override void Handle(RHost host, Message response)
            {
                response.ExpectArguments(1, 3);
                var firstArg = response[0] as JValue;

                if (firstArg != null && firstArg.Value == null)
                {
                    CompletionSource.TrySetCanceled();
                    return;
                }

                response.ExpectArguments(3);
                var parseStatus = response.GetEnum <RParseStatus>(0, "parseStatus", parseStatusNames);
                var error       = response.GetString(1, "error", allowNull: true);

                REvaluationResult result;

                if (Kind.HasFlag(REvaluationKind.NoResult))
                {
                    result = new REvaluationResult(error, parseStatus);
                }
                else if (Kind.HasFlag(REvaluationKind.RawResult))
                {
                    result = new REvaluationResult(response.Blob, error, parseStatus);
                }
                else
                {
                    result = new REvaluationResult(response[2], error, parseStatus);
                }

                CompletionSource.TrySetResult(result);
            }
Ejemplo n.º 2
0
            public EvaluationRequest(RHost host, string expression, REvaluationKind kind, out JArray message)
            {
                Expression = expression;
                Kind       = kind;

                var nameBuilder = new StringBuilder("=");

                if (kind.HasFlag(REvaluationKind.Reentrant))
                {
                    nameBuilder.Append('@');
                }
                if (kind.HasFlag(REvaluationKind.Cancelable))
                {
                    nameBuilder.Append('/');
                }
                if (kind.HasFlag(REvaluationKind.BaseEnv))
                {
                    nameBuilder.Append('B');
                }
                if (kind.HasFlag(REvaluationKind.EmptyEnv))
                {
                    nameBuilder.Append('E');
                }
                if (kind.HasFlag(REvaluationKind.NoResult))
                {
                    nameBuilder.Append('0');
                }
                MessageName = nameBuilder.ToString();

                expression = expression.Replace("\r\n", "\n");

                message = host.CreateMessage(out Id, MessageName, expression);
            }
Ejemplo n.º 3
0
        private async Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, bool waitUntilInitialized, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }

            if (waitUntilInitialized)
            {
                await _initializedTcs.Task;
            }

            try {
                var result = await _host.EvaluateAsync(expression, kind, cancellationToken);

                if (kind.HasFlag(REvaluationKind.Mutating))
                {
                    OnMutated();
                }
                return(result);
            } catch (MessageTransportException) when(!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }
        }
Ejemplo n.º 4
0
 public Task<REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct = default(CancellationToken)) {
     LastExpression = expression;
     if (kind.HasFlag(REvaluationKind.Mutating)) {
         Mutated?.Invoke(this, EventArgs.Empty);
     }
     return Task.FromResult(new REvaluationResult());
 }
Ejemplo n.º 5
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct = default(CancellationToken))
 {
     if (kind.HasFlag(REvaluationKind.Mutating))
     {
         Mutated?.Invoke(this, EventArgs.Empty);
     }
     return(Task.FromResult(new REvaluationResult()));
 }
Ejemplo n.º 6
0
 public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal, CancellationToken ct = default(CancellationToken))
 {
     if (kind.HasFlag(REvaluationKind.Mutating))
     {
         IsMutating = true;
     }
     return(Task.FromResult(new REvaluationResult()));
 }
Ejemplo n.º 7
0
        public Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind, CancellationToken ct)
        {
            if (kind.HasFlag(REvaluationKind.Mutating))
            {
                IsMutating = true;
            }

            ct.Register(() => _tcs.TrySetCanceled());
            return(_evaluator.EvaluateAsync(expression, kind, ct));
        }
Ejemplo n.º 8
0
        public async Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal, CancellationToken ct = default(CancellationToken))
        {
            if (!IsHostRunning)
            {
                return(await CanceledEvaluateTask);
            }

            try {
                var result = await _host.EvaluateAsync(expression, kind, ct);

                if (kind.HasFlag(REvaluationKind.Mutating))
                {
                    OnMutated();
                }
                return(result);
            } catch (MessageTransportException) when(!IsHostRunning)
            {
                return(await CanceledEvaluateTask);
            }
        }
Ejemplo n.º 9
0
        public async Task <REvaluationResult> EvaluateAsync(string expression, REvaluationKind kind = REvaluationKind.Normal, CancellationToken ct = default(CancellationToken))
        {
            if (!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }

            await _afterHostStartedTask;

            try {
                var result = await _host.EvaluateAsync(expression, kind, ct);

                if (kind.HasFlag(REvaluationKind.Mutating))
                {
                    OnMutated();
                }
                return(result);
            } catch (MessageTransportException) when(!IsHostRunning)
            {
                throw new RHostDisconnectedException();
            }
        }
Ejemplo n.º 10
0
            public static async Task <EvaluationRequest> SendAsync(RHost host, string expression, REvaluationKind kind, CancellationToken cancellationToken)
            {
                var nameBuilder = new StringBuilder("?=");

                if (kind.HasFlag(REvaluationKind.Reentrant))
                {
                    nameBuilder.Append('@');
                }
                if (kind.HasFlag(REvaluationKind.Cancelable))
                {
                    nameBuilder.Append('/');
                }
                if (kind.HasFlag(REvaluationKind.BaseEnv))
                {
                    nameBuilder.Append('B');
                }
                if (kind.HasFlag(REvaluationKind.EmptyEnv))
                {
                    nameBuilder.Append('E');
                }
                if (kind.HasFlag(REvaluationKind.NoResult))
                {
                    nameBuilder.Append('0');
                }
                if (kind.HasFlag(REvaluationKind.RawResult))
                {
                    nameBuilder.Append('r');
                }
                string messageName = nameBuilder.ToString();

                expression = expression.Replace("\r\n", "\n");

                var message = host.CreateMessage(messageName, ulong.MaxValue, new JArray {
                    expression
                });
                var request = new EvaluationRequest(host, message, kind, cancellationToken);

                await host.SendAsync(message, cancellationToken);

                return(request);
            }
Ejemplo n.º 11
0
        private async Task<REvaluationResult> EvaluateAsyncBackground(string expression, REvaluationKind kind, CancellationToken ct) { 
            await TaskUtilities.SwitchToBackgroundThread();

            if (!_canEval) {
                throw new InvalidOperationException("EvaluateAsync can only be called while ReadConsole or YesNoCancel is pending.");
            }

            bool reentrant = false, jsonResult = false;

            var nameBuilder = new StringBuilder("=");
            if (kind.HasFlag(REvaluationKind.Reentrant)) {
                nameBuilder.Append('@');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Cancelable)) {
                nameBuilder.Append('/');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Json)) {
                nameBuilder.Append('j');
                jsonResult = true;
            }
            if (kind.HasFlag(REvaluationKind.BaseEnv)) {
                nameBuilder.Append('B');
            }
            if (kind.HasFlag(REvaluationKind.EmptyEnv)) {
                nameBuilder.Append('E');
            }
            if (kind.HasFlag(REvaluationKind.NewEnv)) {
                nameBuilder.Append("N");
            }
            var name = nameBuilder.ToString();

            _canEval = false;
            try {
                expression = expression.Replace("\r\n", "\n");
                var id = await SendAsync(name, ct, expression);

                var response = await RunLoop(ct, reentrant);
                if (response == null) {
                    throw new OperationCanceledException("Evaluation canceled because host process has been terminated.");
                }

                if (response.RequestId != id || response.Name != name) {
                    throw ProtocolError($"Mismatched host response ['{response.Id}',':','{response.Name}',...] to evaluation request ['{id}','{name}','{expression}']");
                }

                response.ExpectArguments(1, 3);
                var firstArg = response[0] as JValue;
                if (firstArg != null && firstArg.Value == null) {
                    throw new OperationCanceledException(Invariant($"Evaluation canceled: {expression}"));
                }

                response.ExpectArguments(3);
                var parseStatus = response.GetEnum<RParseStatus>(0, "parseStatus", parseStatusNames);
                var error = response.GetString(1, "error", allowNull: true);

                if (jsonResult) {
                    return new REvaluationResult(response[2], error, parseStatus);
                } else {
                    return new REvaluationResult(response.GetString(2, "value", allowNull: true), error, parseStatus);
                }
            } finally {
                _canEval = true;
            }
        }
Ejemplo n.º 12
0
        private async Task <REvaluationResult> EvaluateAsyncBackground(string expression, REvaluationKind kind, CancellationToken ct)
        {
            await TaskUtilities.SwitchToBackgroundThread();

            if (!_canEval)
            {
                throw new InvalidOperationException("EvaluateAsync can only be called while ReadConsole or YesNoCancel is pending.");
            }

            bool reentrant = false, jsonResult = false;

            var nameBuilder = new StringBuilder("=");

            if (kind.HasFlag(REvaluationKind.Reentrant))
            {
                nameBuilder.Append('@');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Cancelable))
            {
                nameBuilder.Append('/');
                reentrant = true;
            }
            if (kind.HasFlag(REvaluationKind.Json))
            {
                nameBuilder.Append('j');
                jsonResult = true;
            }
            if (kind.HasFlag(REvaluationKind.BaseEnv))
            {
                nameBuilder.Append('B');
            }
            if (kind.HasFlag(REvaluationKind.EmptyEnv))
            {
                nameBuilder.Append('E');
            }
            if (kind.HasFlag(REvaluationKind.NewEnv))
            {
                nameBuilder.Append("N");
            }
            var name = nameBuilder.ToString();

            _canEval = false;
            try {
                expression = expression.Replace("\r\n", "\n");
                var id = await SendAsync(name, ct, expression);

                var response = await RunLoop(ct, reentrant);

                if (response == null)
                {
                    throw new OperationCanceledException("Evaluation canceled because host process has been terminated.");
                }

                if (response.RequestId != id || response.Name != name)
                {
                    throw ProtocolError($"Mismatched host response ['{response.Id}',':','{response.Name}',...] to evaluation request ['{id}','{name}','{expression}']");
                }

                response.ExpectArguments(1, 3);
                var firstArg = response[0] as JValue;
                if (firstArg != null && firstArg.Value == null)
                {
                    throw new OperationCanceledException(Invariant($"Evaluation canceled: {expression}"));
                }

                response.ExpectArguments(3);
                var parseStatus = response.GetEnum <RParseStatus>(0, "parseStatus", parseStatusNames);
                var error       = response.GetString(1, "error", allowNull: true);

                if (jsonResult)
                {
                    return(new REvaluationResult(response[2], error, parseStatus));
                }
                else
                {
                    return(new REvaluationResult(response.GetString(2, "value", allowNull: true), error, parseStatus));
                }
            } finally {
                _canEval = true;
            }
        }