in csharp/Repl/RoslynScriptEngine.cs [89:161]
public ScriptResult Execute(string code)
{
if (string.IsNullOrWhiteSpace(code))
{
return ScriptResult.Empty;
}
if (!IsCompleteSubmission(code))
{
return ScriptResult.Incomplete;
}
Script<object> script;
if (previousState == null)
{
script = CreateScript(code);
Environment.SetEnvironmentVariable("SPARKCLR_RUN_MODE", "R");
if (sparkConf.Get("spark.master", "local").StartsWith("local", StringComparison.InvariantCultureIgnoreCase))
{
Environment.SetEnvironmentVariable("SPARKCLR_SCRIPT_COMPILATION_DIR", compilationDumpDirectory);
}
}
else
{
script = previousState.Script.ContinueWith(code);
}
var diagnostics = script.Compile();
bool hasErrors = Enumerable.Any(diagnostics, diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
if (hasErrors)
{
var diagnosticMessages = diagnostics.Select(diagnostic => "[" + diagnostic.Severity + "] " + diagnostic).ToList();
return new ScriptResult(compilationException: new Exception(string.Join("\r\n", diagnosticMessages)));
}
var compilationDump = DumpCompilation(script.GetCompilation());
if (new FileInfo(compilationDump).Length > 0)
{
// Ship compilation binary to executor side leveraging sparkContext.AddFile() method.
sc.AddFile(new Uri(compilationDump).ToString());
}
try
{
ScriptState<object> endState = null;
if (previousState == null)
{
endState = script.RunAsync(host).Result;
}
else
{
// Currently "ContinueAsync" is a internal methold, might go public in 1.2.0(https://github.com/dotnet/roslyn/issues/6612)
const string methodName = "ContinueAsync";
var m = script.GetType().GetMethod(methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (m != null)
{
endState = ((Task<ScriptState<object>>)m.Invoke(script, new object[] { previousState, default(CancellationToken) })).Result;
}
else
{
throw new InvalidOperationException(string.Format("Can't find method {0}", methodName));
}
}
previousState = endState;
return new ScriptResult(returnValue: endState.ReturnValue);
}
catch (Exception e)
{
return new ScriptResult(executionException: e);
}
}