예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
                }
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }