public void can_compile_script_million_times() { _loadModuleDelegate = name => IntPtr.Zero; for (var i = 0; i < 10000000; i++) { IntPtr prelude = Js1.CompilePrelude("return {};", "test.js", _loadModuleDelegate, _logDelegate); Js1.DisposeScript(prelude); } }
public void long_execution_of_non_v8_code_does_not_crash() { Assert.Throws <Js1Exception>(() => { _cancelCallbackFactory = (timeout, action) => ThreadPool.QueueUserWorkItem(state => { Console.WriteLine("Calling a callback in " + timeout + "ms"); Thread.Sleep(timeout); action(); }); Action <string, object[]> logger = (m, _) => Console.WriteLine(m); Func <string, Tuple <string, string> > getModuleSource = name => { var fullScriptFileName = Path.GetFullPath(Path.Combine(_jsPath, name + ".js")); var scriptSource = File.ReadAllText(fullScriptFileName, Helper.UTF8NoBom); return(Tuple.Create(scriptSource, fullScriptFileName)); }; var preludeSource = getModuleSource("1Prelude"); var prelude = new PreludeScript(preludeSource.Item1, preludeSource.Item2, getModuleSource, _cancelCallbackFactory, logger); try { //var cancelToken = 123; prelude.ScheduleTerminateExecution(); Thread.Sleep(500); _commandHandlerRegisteredCallback = (name, handle) => { }; _reverseCommandHandlerDelegate = (name, body) => { }; Js1.CompileQuery( prelude.GetHandle(), "log(1);", "fn", _commandHandlerRegisteredCallback, _reverseCommandHandlerDelegate); prelude.CancelTerminateExecution(); } catch { prelude.Dispose(); // clean up unmanaged resources if failed to create throw; } }); }
private void Dispose(bool disposing) { if (_disposed) { return; } if (!disposing) { throw new Exception( "CompiledScript finalizer has been called, but scripts cannot be disposed from other threads. Original script file name: " + _fileName); } else { var scriptHandle = _script; _script = IntPtr.Zero; Js1.DisposeScript(scriptHandle); } _disposed = true; }
public static void CheckResult(IntPtr scriptHandle, bool disposeScriptOnException) { int? errorCode = null; string errorMessage = null; _reportErrorCallback = // NOTE: this local delegate must go to a field to keep references while ReportErrors is being executed (code, message) => { //NOTE: do not throw exceptions directly in this handler // let the CPP code clean up errorCode = code; errorMessage = message; }; Js1.ReportErrors(scriptHandle, _reportErrorCallback); if (errorCode != null) { if (disposeScriptOnException) { Js1.DisposeScript(scriptHandle); } throw new Js1Exception(errorCode.Value, errorMessage); } }
public void api_can_be_used() { var ver = Js1.ApiVersion(); Console.WriteLine(ver); }