예제 #1
0
        private void TextArea_MarginClick(object sender, MarginClickEventArgs e)
        {
            if (e.Margin == BOOKMARK_MARGIN)
            {
                var line = TextArea.Lines[TextArea.LineFromPosition(e.Position)];

                // Do we have a marker for this line?
                if ((line.MarkerGet() & BREAKPOINT_MASK) > 0)
                {
                    if (!_debugger.RemoveBreakpoint(line.Index))
                    {
                        SendLogToPanel("Error removing breakpoint.");
                        return;
                    }

                    // Remove existing from UI
                    line.MarkerDelete(BREAKPOINT_MARKER);
                }
                else
                {
                    if (!_debugger.AddBreakpoint(line.Index))
                    {
                        SendLogToPanel("Error adding breakpoint.");
                        return;
                    }

                    // Add breakpoint to UI
                    line.MarkerAdd(BREAKPOINT_MARKER);
                }
            }
        }
예제 #2
0
        public Backend(ServerSettings serverSettings)
        {
            var settings = new DebuggerSettings(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

            var curPath = Directory.GetCurrentDirectory();

            if (!settings.compilerPaths.ContainsKey(SourceLanguage.CSharp))
            {
                settings.compilerPaths[SourceLanguage.CSharp] = curPath + "/compilers";
            }

            if (!settings.compilerPaths.ContainsKey(SourceLanguage.Python))
            {
                settings.compilerPaths[SourceLanguage.Python] = curPath + "/compilers";
            }

            _debugger = new DebugManager(settings);
            _shell    = new DebuggerShell(_debugger);

            // initialize a logger
            //var log = new SynkServer.Core.Logger();

            var server = new HTTPServer(serverSettings);

            // instantiate a new site, the second argument is the file path where the public site contents will be found
            //var site = new Site("../public");

            var templateEngine = new TemplateEngine(server, "../views");

            LoadContract(curPath + "/contracts/DefaultContract.cs");

            server.Get("/", (request) =>
            {
                var context = GetContext();

                return(templateEngine.Render(context, new string[] { "index" }));
            });

            server.Post("/switch", (request) =>
            {
                var code = request.args["code"];
                projectFiles[this.activeDocumentID].content = code;

                this.activeDocumentID = request.args["id"];

                var context = GetContext();

                return("ok");
            });

            server.Get("/content", (request) =>
            {
                var content = projectFiles[activeDocumentID].content;
                return(content);
            });

            server.Get("/breakpoint/list", (request) =>
            {
                var breakpoints = projectFiles[activeDocumentID].breakpoints;
                var node        = DataNode.CreateArray();
                foreach (var line in breakpoints)
                {
                    var item = DataNode.CreateValue(line);
                    node.AddNode(item);
                }
                return(node);
            });

            server.Post("/breakpoint/add", (request) =>
            {
                int line = int.Parse(request.args["line"]);

                var file = projectFiles[activeDocumentID];
                if (_debugger.AddBreakpoint(line, file.path))
                {
                    var breakpoints = file.breakpoints;
                    breakpoints.Add(line);

                    return("ok");
                }

                return("fail");
            });

            server.Post("/breakpoint/remove", (request) =>
            {
                int line = int.Parse(request.args["line"]);

                var file        = projectFiles[activeDocumentID];
                var breakpoints = file.breakpoints;

                breakpoints.Remove(line);

                _debugger.RemoveBreakpoint(line, file.path);

                return("ok");
            });

            server.Post("/compile", (request) =>
            {
                var code = request.args["code"];
                request.session.SetString("code", code);

                if (Compile(serverSettings, code))
                {
                    return("OK");
                }

                return("FAIL");
            });

            server.Post("/shell", (request) =>
            {
                var input  = request.args["input"];
                var output = DataNode.CreateObject();

                var lines = DataNode.CreateArray("lines");
                output.AddNode(lines);

                if (!_shell.Execute(input, (type, text) =>
                {
                    lines.AddValue(text);
                }))
                {
                    output.AddValue("Invalid command");
                }

                string filePath;
                var curLine = _shell.Debugger.ResolveLine(_shell.Debugger.Info.offset, true, out filePath);

                output.AddField("state", _shell.Debugger.Info.state);
                output.AddField("offset", _shell.Debugger.Info.offset);
                output.AddField("line", curLine);
                output.AddField("path", filePath);

                if (_shell.Debugger.Info.state == Emulation.DebuggerState.State.Finished)
                {
                    var val = _debugger.Emulator.GetOutput();

                    _debugger.Blockchain.Save();

                    var methodName = _debugger.Emulator.currentMethod;
                    var hintType   = !string.IsNullOrEmpty(methodName) && _debugger.ABI != null && _debugger.ABI.functions.ContainsKey(methodName) ? _debugger.ABI.functions[methodName].returnType : Emulator.Type.Unknown;

                    var temp = FormattingUtils.StackItemAsString(val, false, hintType);
                    output.AddField("result", temp);
                    output.AddField("gas", _debugger.Emulator.usedGas);
                }

                var json = JSONWriter.WriteToString(output);
                return(json);
            });

            server.Run();
        }