Merge remote-tracking branch 'origin/master' into jit
[scilab.git] / scilab / modules / ast / src / cpp / ast / consoledebugger.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "consoledebugger.hxx"
14 #include "debugmanager.hxx"
15 #include "printvisitor.hxx"
16
17 extern "C"
18 {
19 #include "sciprint.h"
20 #include "prompt.h"
21 }
22
23 namespace debugger
24 {
25 void ConsoleDebugger::onStop(int index)
26 {
27     if (index >= 0)
28     {
29         debugger::DebuggerMagager* manager = debugger::DebuggerMagager::getInstance();
30         debugger::Breakpoint* bp = manager->getBreakPoint(index);
31         if (bp)
32         {
33             sciprint(_("debugger stop on breakpoint(%d) in function %ls line %d\n"), index, bp->getFunctioName().data(), bp->getMacroLine());
34         }
35     }
36
37     printExp();
38 }
39
40 void ConsoleDebugger::onResume()
41 {
42     //sciprint("ConsoleDebugger::onResume.\n");
43 }
44
45 void ConsoleDebugger::onAbort()
46 {
47     sciprint(_("Execution aborted.\n"));
48 }
49
50 void ConsoleDebugger::onErrorInFile(const std::wstring& filename)
51 {
52     debugger::DebuggerMagager* manager = debugger::DebuggerMagager::getInstance();
53     ast::Exp* exp = manager->getExp();
54     sciprint(_("debugger stop on error in file %ls line %d\n"), filename.data(), exp->getLocation().first_line);
55     printExp();
56 }
57
58 void ConsoleDebugger::onErrorInScript(const std::wstring& funcname)
59 {
60     debugger::DebuggerMagager* manager = debugger::DebuggerMagager::getInstance();
61     ast::Exp* exp = manager->getExp();
62     sciprint(_("debugger stop on error in function %ls line %d\n"), funcname.data(), exp->getLocation().first_line);
63     printExp();
64 }
65
66 void ConsoleDebugger::onQuit()
67 {
68     sciprint(_("Leave debugger.\n"));
69 }
70
71 void ConsoleDebugger::updateBreakpoints()
72 {
73     debugger::DebuggerMagager* manager = debugger::DebuggerMagager::getInstance();
74     debugger::Breakpoints& brks = manager->getAllBreakPoint();
75
76     if (brks.size() == 0)
77     {
78         sciprint("No breakpoint\n");
79         return;
80     }
81
82     sciprint("% 3ls % 7ls %24ls % 5ls %ls\n\n", L"num", L"enable", L"function", L"line", L"condition");
83     int i = 0;
84     for (const auto& b : brks)
85     {
86         if (b->isMacro())
87         {
88             std::wstring condition = b->getCondition();
89             sciprint("% 3d % 7s %24ls % 5d %ls\n", i, b->isEnable() ? "true" : "false", b->getFunctioName().c_str(), b->getMacroLine(),
90                      condition.size() < 30 ? condition.c_str() :
91                      (std::wstring(condition.begin(), condition.begin() + 27) + L"...").c_str());
92         }
93
94         ++i;
95     }
96 }
97
98 void ConsoleDebugger::printExp()
99 {
100     debugger::DebuggerMagager* manager = debugger::DebuggerMagager::getInstance();
101     std::wostringstream ostr;
102     ast::PrintVisitor pp(ostr, true, true, true);
103     manager->getExp()->accept(pp);
104     sciprint("%s%ls\n", SCIPROMPT_PAUSE, ostr.str().data());
105 }
106 }