private static Jint.Runtime.Debugger.StepMode Engine_Step(object sender, Jint.Runtime.Debugger.DebugInformation e, ScriptDebugger.DebugSession session) { if (session.EndOfSession) { return(Jint.Runtime.Debugger.StepMode.None); } var info = new ScriptDebugger.DebugInfo { Start = e.CurrentStatement.Location.Start, End = e.CurrentStatement.Location.End, Variables = Kooboo.Sites.Scripting.Manager.GetVariables(sender as Jint.Engine) }; session.DebugInfo = info; int count = 1; while (session.Action == null) { System.Threading.Thread.Sleep(100); count += 1; if (count > 10000) { break; } if (session.EndOfSession) { return(Jint.Runtime.Debugger.StepMode.None); } } if (session.EndOfSession) { return(Jint.Runtime.Debugger.StepMode.None); } if (session.Action != null) { var mode = session.Action.StepMode; session.Action = null; return(mode); } return(Jint.Runtime.Debugger.StepMode.None); }
public static object ExecuteDataSource(RenderContext context, Guid CodeId, Dictionary <string, object> parameters) { var sitedb = context.WebSite.SiteDb(); var code = sitedb.Code.Get(CodeId); if (code == null) { return(null); } object result = null; Jint.Engine engine = null; var debugsession = Kooboo.Sites.ScriptDebugger.SessionManager.GetDebugSession(context, code.Id); if (debugsession == null) { engine = Kooboo.Sites.Scripting.Manager.GetJsEngine(context); } else { engine = Kooboo.Sites.Scripting.Manager.GetDebugJsEngine(context); foreach (var item in debugsession.BreakLines) { engine.BreakPoints.Add(new Jint.Runtime.Debugger.BreakPoint(item, 0)); } debugsession.JsEngine = engine; engine.Break += (s, e) => Engine_Break(s, e, debugsession); engine.Step += (s, e) => Engine_Step(s, e, debugsession); } try { var kcontext = context.GetItem <k>(); Dictionary <string, string> config = new Dictionary <string, string>(); if (parameters != null) { foreach (var item in parameters) { if (item.Value != null) { config.Add(item.Key, item.Value.ToString()); } else { config.Add(item.Key, null); } } } kcontext.config = config; kcontext.ReturnValues.Clear(); engine.Execute(code.Body); kcontext.config = null; if (kcontext.ReturnValues.Count > 0) { result = kcontext.ReturnValues.Last(); } } catch (Exception ex) { return(ex.Message); } if (debugsession != null) { var info = new ScriptDebugger.DebugInfo { Start = new Jint.Parser.Position() { Line = -1 }, End = new Jint.Parser.Position() { Line = -1 }, EndOfExe = true, HasValue = true }; debugsession.DebugInfo = info; } return(result); }
public static string ExecuteCode(RenderContext context, string JsCode, Guid CodeId = default(Guid)) { if (string.IsNullOrEmpty(JsCode)) { return(null); } Jint.Engine engine = null; var debugsession = Kooboo.Sites.ScriptDebugger.SessionManager.GetDebugSession(context, CodeId); if (debugsession == null) { engine = Kooboo.Sites.Scripting.Manager.GetJsEngine(context); } else { engine = Kooboo.Sites.Scripting.Manager.GetDebugJsEngine(context); foreach (var item in debugsession.BreakLines) { engine.BreakPoints.Add(new Jint.Runtime.Debugger.BreakPoint(item, 0)); } debugsession.JsEngine = engine; engine.Break += (s, e) => Engine_Break(s, e, debugsession); engine.Step += (s, e) => Engine_Step(s, e, debugsession); } try { engine.Execute(JsCode); } catch (Exception ex) { if (debugsession != null) { var info = new ScriptDebugger.DebugInfo { Start = new Jint.Parser.Position() { Line = -1 }, End = new Jint.Parser.Position() { Line = -1 }, EndOfExe = true, HasValue = true, IsException = true }; if (ex is JavaScriptException) { var jsex = ex as JavaScriptException; info.Start.Line = jsex.LineNumber; info.End.Line = jsex.LineNumber; info.Message = "Line " + jsex.LineNumber.ToString() + " " + jsex.Error.ToString() + " " + jsex.Message + " " + jsex.Source; } else { info.Message = ex.Message + ex.StackTrace; } debugsession.DebugInfo = info; } return(ex.Message + " " + ex.Source); } if (debugsession != null) { if (debugsession.DebugInfo != null) { debugsession.DebugInfo.EndOfExe = true; } else { var info = new ScriptDebugger.DebugInfo { Start = new Jint.Parser.Position() { Line = -1 }, End = new Jint.Parser.Position() { Line = -1 }, EndOfExe = true, HasValue = true }; debugsession.DebugInfo = info; } } string output = context.GetItem <string>(Constants.OutputName); if (!string.IsNullOrWhiteSpace(output)) { context.SetItem <string>(null, Constants.OutputName); } return(output); }
public static string ExecuteInnerScript(RenderContext context, string InnerJsCode) { if (string.IsNullOrEmpty(InnerJsCode)) { return(null); } Jint.Engine engine = null; var debugsession = Kooboo.Sites.ScriptDebugger.SessionManager.GetDebugSession(context, InnerJsCode); if (debugsession == null) { engine = Kooboo.Sites.Scripting.Manager.GetJsEngine(context); } else { engine = Kooboo.Sites.Scripting.Manager.GetDebugJsEngine(context); foreach (var item in debugsession.BreakLines) { engine.BreakPoints.Add(new Jint.Runtime.Debugger.BreakPoint(item, 0)); } debugsession.JsEngine = engine; engine.Break += (s, e) => Engine_Break(s, e, debugsession); engine.Step += (s, e) => Engine_Step(s, e, debugsession); } try { engine.Execute(InnerJsCode); } catch (Exception ex) { return(ex.Message); } if (debugsession != null) { var info = new ScriptDebugger.DebugInfo { Start = new Jint.Parser.Position() { Line = -1 }, End = new Jint.Parser.Position() { Line = -1 }, EndOfExe = true, HasValue = true }; debugsession.DebugInfo = info; } string output = context.GetItem <string>(Kooboo.Sites.Scripting.Constants.OutputName); if (!string.IsNullOrWhiteSpace(output)) { context.SetItem <string>(null, Kooboo.Sites.Scripting.Constants.OutputName); } return(output); }
public static string ExecuteInnerScript(RenderContext context, string InnerJsCode) { if (string.IsNullOrEmpty(InnerJsCode)) { return(null); } Jint.Engine engine = null; var debugsession = Kooboo.Sites.ScriptDebugger.SessionManager.GetDebugSession(context, InnerJsCode); if (debugsession == null) { engine = Kooboo.Sites.Scripting.Manager.GetJsEngine(context); } else { engine = Kooboo.Sites.Scripting.Manager.GetDebugJsEngine(context); foreach (var item in debugsession.BreakLines) { engine.BreakPoints.Add(new Jint.Runtime.Debugger.BreakPoint(item, 0)); } debugsession.JsEngine = engine; engine.Break += (s, e) => Engine_Break(s, e, debugsession); engine.Step += (s, e) => Engine_Step(s, e, debugsession); } try { engine.ExecuteWithErrorHandle(InnerJsCode, new Jint.Parser.ParserOptions() { Tolerant = true }); } catch (Exception ex) { Kooboo.Data.Log.Instance.Exception.WriteException(ex); return(ex.Message); } if (debugsession != null) { var info = new ScriptDebugger.DebugInfo { Start = new Jint.Parser.Position() { Line = -1 }, End = new Jint.Parser.Position() { Line = -1 }, EndOfExe = true, HasValue = true }; debugsession.DebugInfo = info; } return(ReturnValue(context, engine)); }