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