public string RunJavascript( string[] args, out Func <string> generateJavascript, out long elapsedTranslation, out long elapsedJs, out string stderr, out string trailingOutput, Func <Configuration> makeConfiguration = null, JSEvaluationConfig evaluationConfig = null, Action <Exception> onTranslationFailure = null, Action <AssemblyTranslator> initializeTranslator = null, bool?scanForProxies = null, IEnumerable <IAnalyzer> analyzers = null ) { var tempFilename = GenerateJavascript( args, out generateJavascript, out elapsedTranslation, makeConfiguration, throwOnUnimplementedExternals: evaluationConfig == null || evaluationConfig.ThrowOnUnimplementedExternals, onTranslationFailure: onTranslationFailure, initializeTranslator: initializeTranslator, scanForProxies: scanForProxies, analyzers: analyzers ); using (Evaluator = EvaluatorPool.Get()) { var startedJs = DateTime.UtcNow.Ticks; var sentinelStart = "// Test output begins here //"; var sentinelEnd = "// Test output ends here //"; var elapsedPrefix = "// elapsed: "; var manifest = String.Format( "['Script', {0}]", Util.EscapeString(tempFilename) ); if (evaluationConfig != null && evaluationConfig.AdditionalFilesToLoad != null) { foreach (var file in evaluationConfig.AdditionalFilesToLoad) { manifest += "," + Environment.NewLine + String.Format("['Script', {0}]", Util.EscapeString(file)); } } var dlls = Directory.GetFiles(SourceDirectory, "*.emjs"); foreach (var dll in dlls) { manifest += "," + Environment.NewLine + String.Format("['NativeLibrary', {0}]", Util.EscapeString(Path.GetFullPath(dll))); } StartupPrologue = String.Format("contentManifest['Test'] = [{0}]; ", manifest); StartupPrologue += String.Format("function runMain () {{ " + "print({0}); try {{ var elapsedTime = runTestCase(Date.now); }} catch (exc) {{ reportException(exc); }} print({1}); print({2} + elapsedTime);" + "}}; shellStartup();", Util.EscapeString(sentinelStart), Util.EscapeString(sentinelEnd), Util.EscapeString(elapsedPrefix) ); Evaluator.WriteInput(StartupPrologue); Evaluator.Join(); long endedJs = DateTime.UtcNow.Ticks; elapsedJs = endedJs - startedJs; if (Evaluator.ExitCode != 0) { var _stdout = (Evaluator.StandardOutput ?? "").Trim(); var _stderr = (Evaluator.StandardError ?? "").Trim(); var exceptions = new List <JavaScriptException>(); var exceptionMatches = ExceptionRegex.Matches(_stdout); foreach (Match match in exceptionMatches) { var errorText = match.Groups["errorText"].Value; string stackText = null; if (match.Groups["stack"].Success) { stackText = match.Groups["stack"].Value; } var exception = new JavaScriptException(errorText, stackText); exceptions.Add(exception); } throw new JavaScriptEvaluatorException( Evaluator.ExitCode, _stdout, _stderr, exceptions.ToArray() ); } var stdout = Evaluator.StandardOutput; if (stdout != null) { var m = ElapsedRegex.Match(stdout); if (m.Success) { elapsedJs = TimeSpan.FromMilliseconds( double.Parse(m.Groups["elapsed"].Value, CultureInfo.InvariantCulture) ).Ticks; stdout = stdout.Replace(m.Value, ""); } } // Strip spurious output from the JS.exe REPL and from the standard libraries trailingOutput = null; if (stdout != null) { var startOffset = stdout.LastIndexOf(sentinelStart); if (startOffset >= 0) { startOffset += sentinelStart.Length; // End sentinel might not be there if the test case calls quit(). var endOffset = stdout.IndexOf(sentinelEnd, startOffset); if (endOffset >= 0) { trailingOutput = stdout.Substring(endOffset + sentinelEnd.Length); stdout = stdout.Substring(startOffset, endOffset - startOffset); } else { stdout = stdout.Substring(startOffset); } } } stderr = Evaluator.StandardError; return(stdout ?? ""); } }
public string RunJavascript( string[] args, out string generatedJavascript, out long elapsedTranslation, out long elapsedJs, out string stderr, out string trailingOutput, Func <Configuration> makeConfiguration = null, Action <Exception> onTranslationFailure = null ) { var tempFilename = GenerateJavascript(args, out generatedJavascript, out elapsedTranslation, makeConfiguration, onTranslationFailure); using (var evaluator = EvaluatorPool.Get()) { var startedJs = DateTime.UtcNow.Ticks; var sentinelStart = "// Test output begins here //"; var sentinelEnd = "// Test output ends here //"; var elapsedPrefix = "// elapsed: "; StartupPrologue = String.Format("contentManifest['Test'] = [['Script', {0}]]; " + "function runMain () {{ " + "print({1}); try {{ var elapsedTime = runTestCase(timeout, dateNow); }} catch (exc) {{ reportException(exc); }} print({2}); print({3} + elapsedTime);" + "}}; shellStartup();", Util.EscapeString(tempFilename), Util.EscapeString(sentinelStart), Util.EscapeString(sentinelEnd), Util.EscapeString(elapsedPrefix) ); evaluator.WriteInput(StartupPrologue); evaluator.Join(); long endedJs = DateTime.UtcNow.Ticks; elapsedJs = endedJs - startedJs; if (evaluator.ExitCode != 0) { var _stdout = (evaluator.StandardOutput ?? "").Trim(); var _stderr = (evaluator.StandardError ?? "").Trim(); var exceptions = new List <JavaScriptException>(); var exceptionMatches = ExceptionRegex.Matches(_stdout); foreach (Match match in exceptionMatches) { var errorText = match.Groups["errorText"].Value; string stackText = null; if (match.Groups["stack"].Success) { stackText = match.Groups["stack"].Value; } var exception = new JavaScriptException(errorText, stackText); exceptions.Add(exception); } throw new JavaScriptEvaluatorException( evaluator.ExitCode, _stdout, _stderr, exceptions.ToArray() ); } var stdout = evaluator.StandardOutput; if (stdout != null) { var m = ElapsedRegex.Match(stdout); if (m.Success) { elapsedJs = TimeSpan.FromMilliseconds( double.Parse(m.Groups["elapsed"].Value, CultureInfo.InvariantCulture) ).Ticks; stdout = stdout.Replace(m.Value, ""); } } // Strip spurious output from the JS.exe REPL and from the standard libraries trailingOutput = null; if (stdout != null) { var startOffset = stdout.IndexOf(sentinelStart); if (startOffset >= 0) { startOffset += sentinelStart.Length; // End sentinel might not be there if the test case calls quit(). var endOffset = stdout.IndexOf(sentinelEnd, startOffset); if (endOffset >= 0) { trailingOutput = stdout.Substring(endOffset + sentinelEnd.Length); stdout = stdout.Substring(startOffset, endOffset - startOffset); } else { stdout = stdout.Substring(startOffset); } } } stderr = evaluator.StandardError; return(stdout ?? ""); } }