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); }
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); }
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(); } }
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()); }
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())); }
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())); }
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)); }
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); } }
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(); } }
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); }
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; } }
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; } }