Added Scilab function runVMKit to be used to change how the AST is visited.
[scilab.git] / scilab / modules / core / src / cpp / tasks.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
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 "tasks.hxx"
14 #include "timer.hxx"
15 #include "context.hxx"
16 #include "visitor.hxx"
17 #include "printvisitor.hxx"
18 #include "execvisitor.hxx"
19 #include "timedvisitor.hxx"
20 #include "debugvisitor.hxx"
21 #include "stepvisitor.hxx"
22 #include "configvariable.hxx"
23
24 #include "scilabWrite.hxx"
25 #include "runner.hxx"
26
27 #define SCILAB_START    L"/etc/scilab.start"
28 #define SCILAB_QUIT     L"/etc/scilab.quit"
29
30 Timer _timer;
31
32 // Defined at modules/core/src/cpp/scilab.cpp
33 extern bool ASTrunVMKit;
34
35 //#define DEBUG
36
37 /*
38 ** Parse
39 **
40 ** Parse the given file and create the AST.
41 */
42 void parseFileTask(Parser *parser, bool timed, const wchar_t* file_name, const wchar_t* prog_name)
43 {
44 #ifdef DEBUG
45     std::cerr << "*** Processing " << file_name << " file..." << std::endl;
46 #endif
47
48     if(timed)
49     {
50         _timer.start();
51     }
52
53     parser->parseFile(file_name, prog_name);
54
55     if(timed)
56     {
57         _timer.check("Parsing");
58     }
59 }
60
61 /*
62 ** Parse
63 **
64 ** Parse the given command and create the AST.
65 */
66 void parseCommandTask(Parser *parser, bool timed, wchar_t *command)
67 {
68 #ifdef DEBUG
69     std::cerr << "*** Processing [" <<  command << "]..." << std::endl;
70 #endif
71
72     if(timed)
73     {
74         _timer.start();
75     }
76
77     parser->parse(command);
78
79     if(timed && parser->getControlStatus() == Parser::AllControlClosed)
80     {
81         _timer.check("Parsing");
82     }
83 }
84
85 /*
86 ** Dump AST
87 **
88 ** Display the AST in human readable format.
89 */
90 void dumpAstTask(ast::Exp *tree, bool timed)
91 {
92     if(timed)
93     {
94         _timer.start();
95     }
96
97     ast::DebugVisitor debugMe;
98     if (tree)
99     {
100         tree->accept(debugMe);
101     }
102
103     if(timed)
104     {
105         _timer.check("AST Dump");
106     }
107 }
108
109 /*
110 ** Pretty Print
111 **
112 ** Pretty print the Stored AST.
113 */
114 void printAstTask(ast::Exp *tree, bool timed)
115 {
116     if(timed)
117     {
118         _timer.start();
119     }
120
121     if (tree)
122     {
123         ast::PrintVisitor printMe = *new ast::PrintVisitor(std::wcout);
124         tree->accept(printMe);
125     }
126
127     if(timed)
128     {
129         _timer.check("Pretty Print");
130     }
131 }
132
133
134 /*
135 ** Exec Tree
136 **
137 ** Execute the stored AST.
138 */
139 void execAstTask(ast::Exp* tree, bool timed, bool ASTtimed, bool execVerbose, bool ASTrunVMKit)
140 {
141     if(tree == NULL)
142     {
143         return;
144     }
145
146     ast::ExecVisitor *exec;
147     if(timed)
148     {
149         _timer.start();
150     }
151
152     if(ASTtimed)
153     {
154         exec = (ast::ExecVisitor*)new ast::TimedVisitor();
155     }
156
157     if(execVerbose)
158     {
159        exec = (ast::ExecVisitor*)new ast::StepVisitor();
160     }
161
162     if(!execVerbose && !ASTtimed)
163     {
164         exec = new ast::ExecVisitor();
165     }
166
167     if (ASTrunVMKit) {
168         printf("VMKit implementation goes here\n");
169         exit(1);
170     } else {
171         Runner::execAndWait(tree, exec);
172         //delete exec;
173     }
174
175     if(timed)
176     {
177         _timer.check("Execute AST");
178     }
179 }
180
181 /*
182 ** Dump Stack Trace
183 **
184 ** Display what is stored in scilab.
185 */
186 void dumpStackTask(bool timed)
187 {
188     if(timed)
189     {
190         _timer.start();
191     }
192
193     symbol::Context::getInstance()->print(std::wcout);
194
195     if(timed)
196     {
197         _timer.check("Dumping Stack");
198     }
199 }
200
201 /*
202 ** Execute scilab.start
203 **
204 */
205 void execScilabStartTask(void)
206 {
207     Parser parse;
208     wstring stSCI = ConfigVariable::getSCIPath();
209
210     stSCI += SCILAB_START;
211     parse.parseFile(stSCI, L"");
212
213     if(parse.getExitStatus() != Parser::Succeded)
214     {
215         scilabWriteW(parse.getErrorMessage());
216         scilabWriteW(L"Failed to parse scilab.start");
217         return;
218     }
219
220     execAstTask(parse.getTree(), false, false, false, ASTrunVMKit);
221 }
222
223 /*
224 ** Execute scilab.start
225 **
226 */
227 void execScilabQuitTask(void)
228 {
229     Parser parse;
230     wstring stSCI = ConfigVariable::getSCIPath();
231
232     stSCI += SCILAB_QUIT;
233     parse.parseFile(stSCI, L"");
234
235     if(parse.getExitStatus() != Parser::Succeded)
236     {
237         scilabWriteW(parse.getErrorMessage());
238         scilabWriteW(L"Failed to parse scilab.start");
239         return;
240     }
241
242     execAstTask(parse.getTree(), false, false, false, ASTrunVMKit);
243 }
244
245