public async Task <ICompileResult> Compile() { if (Script.Code != SourceCode) { Create(); } var runResult = await ExecuteThreaded <ImmutableArray <Diagnostic> > .Execute( () => { //Actual compilation var compilation = Script.GetCompilation(); return(compilation.GetDiagnostics()); }, (int)CompilerProperties.Timeout ); if (!runResult.Successful) { throw new CompileException("The compilation timed out!"); } if (runResult.ReturnValue == null) { throw new CompileException("The compiler Thread was not returning any diagnostics!"); } ImmutableArray <Diagnostic> resultDiagnostics = runResult.ReturnValue; //Pre-Enumerate so it's not enumerating multiple times IEnumerable <CSharpDiagnostic> diagnostics = resultDiagnostics .Select(d => new CSharpDiagnostic( d.GetMessage(), d.Location.GetLineSpan().StartLinePosition.Line + 1, //+1: it's 1-based d.Location.GetLineSpan().EndLinePosition.Line + 1, //+1: it's 1-based d.Location.GetLineSpan().StartLinePosition.Character + 1, //+1: it's 1-based d.Location.GetLineSpan().EndLinePosition.Character + 1, //+1: it's 1-based Host.ToSeverity(d.Severity))); IEnumerable <CSharpDiagnostic> warnings = resultDiagnostics .Where(d => d.Severity == DiagnosticSeverity.Warning) .Select(d => new CSharpDiagnostic( d.GetMessage(), d.Location.GetLineSpan().StartLinePosition.Line + 1, //+1: it's 1-based d.Location.GetLineSpan().EndLinePosition.Line + 1, //+1: it's 1-based d.Location.GetLineSpan().StartLinePosition.Character + 1, //+1: it's 1-based d.Location.GetLineSpan().EndLinePosition.Character + 1, //+1: it's 1-based Host.ToSeverity(d.Severity))); IEnumerable <Exception> errors = resultDiagnostics .Where(d => d.Severity == DiagnosticSeverity.Error) .Select(d => new Exception(d.GetMessage())); //Build compile result object CompileResult = new CSharpCompileResult( runResult.ElapsedMilliseconds, SourceCode, Script, diagnostics, warnings, errors); return(CompileResult); }
public async Task <IExecuteResult> Execute() { if (CompileResult == null || CompileResult.SourceCode != SourceCode) { await Compile(); } if (!CompileResult.Success) { var result = new JavaExecuteResult(0, "", null, CompileResult, new CompileException("Could not compile, javac responded with some errors!")); ExecuteResult = result; return(result); } else { var runResult = await ExecuteThreaded <string> .Execute( () => JreHelper.ExecuteJava(JavaPath, ClassName, ExecuteProperties), (int)ExecuteProperties.Timeout ); string output = runResult.ReturnValue; int time = runResult.ElapsedMilliseconds; var error = runResult.Exception; var result = new JavaExecuteResult(time, output, null, CompileResult, error); ExecuteResult = result; return(result); } }
public async Task <IExecuteResult> Execute() { if (Lua == default(Lua)) { await Compile(); } Writer?.Dispose(); Writer = new StringWriter(); if (Globals != null) { Globals.Console?.Dispose(); Globals.Console = Writer; } var result = await ExecuteThreaded <object[]> .Execute(() => Lua.DoString(SourceCode), (int)ExecuteProperties.Timeout); if (result.Exception is LuaScriptException scriptEx) { var number = new Regex("[0-9]+"); var match = number.Match(scriptEx.Message); if (match.Success) { int num = int.Parse(match.Value); List <IDiagnostic> diagnostics = new List <IDiagnostic> { new LuaDiagnostic(scriptEx.Message, num, Severity.Error) }; CompileResult = new LuaCompileResult(result.ElapsedMilliseconds, SourceCode, diagnostics, diagnostics, new List <Exception> { scriptEx }); } } else { CompileResult = new LuaCompileResult(0, SourceCode, null, null, null); } IExecuteResult executeResult = new LuaExecuteResult( result.ElapsedMilliseconds, Writer.ToString(), result.ReturnValue, CompileResult, result.Exception); ExecuteResult = executeResult; return(executeResult); }
public async Task <IExecuteResult> Execute() { await Compile(); if (!CompileResult.Success) { return(new VbExecuteResult(-1, null, null, CompileResult, new CompileException("The compilation was not successful!"))); } using (var writer = new StringWriter()) { Console.SetOut(writer); Console.SetError(writer); var result = await ExecuteThreaded <object> .Execute(() => ScriptAssembly.EntryPoint == null ?ScriptAssembly.DefinedTypes.Last().DeclaredMethods.First().Invoke(null, null) : ScriptAssembly.EntryPoint.Invoke(null, null), (int)ExecuteProperties.Timeout); if (result.Successful) { IExecuteResult executeResult = new VbExecuteResult( result.ElapsedMilliseconds, writer.ToString(), result.ReturnValue, CompileResult, result.Exception); ExecuteResult = executeResult; return(executeResult); } else { IExecuteResult executeResult = new VbExecuteResult( result.ElapsedMilliseconds, null, null, CompileResult, new Exception("The execution timed out!")); ExecuteResult = executeResult; return(executeResult); } } }
public async Task <IExecuteResult> Execute() { if (CompileResult == default(ICompileResult) || SourceCode != Script.Code) { await Compile(); } if (!CompileResult.Success) { return(new CSharpExecuteResult(-1, null, null, CompileResult, new CompileException("The compilation was not successful!"))); } //Reset builder/Clear console var builder = new StringBuilder(); Globals.Console?.Dispose(); Globals.Console = new StringWriter(builder); int timeout = (int)ExecuteProperties.Timeout; var threadRunResult = await ExecuteThreaded <ScriptState <object> > .Execute(() => Script.RunAsync(Globals, CatchException), timeout); ScriptState <object> state = threadRunResult.ReturnValue; int elapsed = threadRunResult.ElapsedMilliseconds; IExecuteResult result = threadRunResult.Successful ? new CSharpExecuteResult( elapsed, builder.ToString(), state.ReturnValue, CompileResult, state.Exception) : new CSharpExecuteResult( elapsed, null, null, CompileResult, new TimeoutException($"The execution timed out! (Timeout: {timeout}ms)")); ExecuteResult = result; return(result); }
public async Task <ICompileResult> Compile() { ToValidCode(); string tmp = Path.Combine(Path.GetTempPath(), $"{ClassName}.java"); File.WriteAllText(tmp, SourceCode); var runResult = await ExecuteThreaded <string> .Execute( () => JdkHelper.CompileJava(JavacPath, tmp, CompilerProperties), (int)CompilerProperties.Timeout ); string output = runResult.ReturnValue; var error = runResult.Exception; int time = runResult.ElapsedMilliseconds; IEnumerable <IDiagnostic> diagnostics = null; IEnumerable <Exception> errors = null; if (!string.IsNullOrWhiteSpace(output)) { diagnostics = new List <IDiagnostic> { new JavaDiagnostic(output, -1, -1, -1, -1, Severity.Info) } } ; if (error != null) { errors = new List <Exception> { error } } ; var result = new JavaCompileResult(time, SourceCode, diagnostics, null, errors); CompileResult = result; return(result); }
public async Task <IExecuteResult> Execute() { //recompile if source code changed, not yet compiled or Console has already text printed if (Compilation == null || SourceCode != Source.GetCode() || Writer.ToString().Length > 0) { await Compile(); } if (Compilation == null || !CompileResult.Success) //if still not successful after compiling { return(new PyExecuteResult(-1, null, null, CompileResult, new Exception("Compilation was not successful!"))); } var result = await ExecuteThreaded <object> .Execute(() => Compilation.Execute(Scope), (int)ExecuteProperties.Timeout); if (result.ReturnValue?.GetType() == typeof(Exception)) { IExecuteResult execResultInner = new PyExecuteResult( result.ElapsedMilliseconds, null, null, CompileResult, result.ReturnValue as Exception); ExecuteResult = execResultInner; return(execResultInner); } IExecuteResult execResult = new PyExecuteResult( result.ElapsedMilliseconds, Writer.ToString(), result.ReturnValue, CompileResult, result.Exception); ExecuteResult = execResult; return(execResult); }