6 #include <boost/unordered_map.hpp>
7 #include <boost/ptr_container/ptr_vector.hpp>
16 boost::unordered_map<MNode*, int> linenum;
18 boost::ptr_vector<MotorVar> localVar;
25 MotorSet includedFile;
33 starttime = limittime = 0;
35 virtual ~MlPool () {};
37 virtual void setStartTime ();
38 virtual bool qtimeup (std::ostream* log);
39 virtual void resetProg () {
43 virtual void breakProg () {
45 breaksym ()->set_car (new MNode);
48 virtual void inclIncCount ();
49 virtual bool inclIncCount_nothrow ();
50 virtual void declIncCount ();
62 MStackVal (FTableVal* mf): mfunc (mf), mobj (NULL) {};
63 virtual ~MStackVal () {};
65 std::vector<MStackVal> mstack;
71 virtual ~MlFTable () {};
73 virtual void setFTable (FTable* ft, MTable* mt) {
81 typedef void (*datastoreFunc_t)(MLFunc*);
82 class autoDatastoreFunc {
86 autoDatastoreFunc (MlEnv* _mlenv, MLFunc* mobj, datastoreFunc_t fn) {
88 mlenv->datastoreFuncStack.push_back (std::pair<MLFunc*,datastoreFunc_t> (mobj, fn));
90 virtual ~autoDatastoreFunc () {
91 mlenv->datastoreFuncStack.pop_back ();
97 std::vector<std::pair<MLFunc*,datastoreFunc_t> > datastoreFuncStack;
99 boost::wsmatch regmatch;
101 MNodePtr currentCell;
105 MlEnv (MlPool* _mlpool, MlFTable* _mlftable) {
107 mlFTable = _mlftable;
111 virtual ~MlEnv () {};
113 virtual bool searchMTable (const ustring& name, FTableVal*& ans);
114 virtual bool searchSTable (const ustring& name, FTableVal*& ans, MLFunc*& mobj);
115 virtual bool searchFTable (const ustring& name, FTableVal*& ans);
116 virtual void pushMStack (FTableVal* obj) {
117 mlFTable->mstack.push_back (MlFTable::MStackVal (obj));
119 virtual void popMStack () {
120 mlFTable->mstack.pop_back ();
122 virtual void setStartTime () {
123 mlPool->setStartTime ();
125 virtual bool qtimeup () {
126 mlPool->qtimeup (log);
128 virtual void resetProg () {
129 mlPool->resetProg ();
131 virtual void breakProg () {
132 mlPool->breakProg ();
134 virtual void inclIncCount () {
135 mlPool->inclIncCount ();
137 virtual bool inclIncCount_nothrow () {
138 mlPool->inclIncCount_nothrow ();
140 virtual void declIncCount () {
141 mlPool->declIncCount ();
143 virtual bool validName (const ustring& name);
144 virtual void setGlobalAry (const ustring& name, size_t i, MNode* val);
145 virtual void setGlobalArySize (const ustring& name, size_t n);
146 virtual void setLocalAry (MotorVar* pool, const ustring& name, size_t i, MNode* val);
147 virtual void setLocalArySize (MotorVar* pool, const ustring& name, size_t n);
148 virtual MNode* getGlobalAry (const ustring& name, size_t i);
149 virtual size_t getGlobalArySize (const ustring& name);
150 virtual MNode* getLocalAry (MotorVar* pool, const ustring& name, size_t i);
151 virtual size_t getLocalArySize (MotorVar* pool, const ustring& name);
152 virtual void setVar (const ustring& name, MNode* val);
153 virtual void setVar_nolog (const ustring& name, MNode* val);
154 virtual void setVar2 (const ustring& name, MNode* val);
155 virtual void setAry (const ustring& name, size_t i, MNode* val);
156 virtual void setArySize (const ustring& name, size_t n);
157 virtual void setAry (const ustring& name, MNode* list);
158 virtual MNode* getVar (const ustring& name);
159 virtual ustring getVar_string (const ustring& name);
160 virtual MNode* getAry (const ustring& name, size_t i);
161 virtual ustring getAry_string (const ustring& name, size_t i);
162 virtual size_t getArySize (const ustring& name);
163 virtual void beginLocal ();
164 virtual void setLocalVar (const ustring& name, MNode* val);
165 virtual void defineLocalVar (const ustring& name);
166 virtual void endLocal ();
167 virtual MotorVar* findLocal (const ustring& name);
169 virtual void logSetVar (const ustring& name, MNode* val, bool flocal = false);
170 virtual void logSetVarError (const ustring& name, MNode* val);
171 virtual void logSetAryError (const ustring& name, size_t i, MNode* val);
172 virtual void logSetArySizeError (const ustring& name, size_t n);
175 virtual void push_linenum (MNode* c, int ln);
176 virtual void logLinenum (MNode* c);
177 virtual void logSexp (MNode* c);
178 virtual void setMStack (MLFunc* mobj);
179 virtual void execDatastoreFunc ();
180 virtual MNode* breaksym () {
181 return mlPool->breaksym ();
183 virtual MNode* breakval () {
184 return mlPool->breakval ();
186 virtual void setBreak (MNode* sym, MNode* val) {
187 mlPool->breaksym = sym;
188 mlPool->breakval = val;
190 virtual bool stopBreak (MNode* fnname) {
192 && (breaksym ()->isNil ()
193 || equal (breaksym (), fnname))) {
194 setBreak (NULL, NULL);
200 virtual void setNodebugFunc (const ustring& name) {
201 mlPool->nodebugFunc.set (name);
204 virtual bool includedFile (const ustring& name) {
205 return mlPool->includedFile.get (name);
207 virtual void setIncludedFile (const ustring& name) {
208 mlPool->includedFile.set (name);
212 template<class T> class AutoDelete {
216 AutoDelete (): p (NULL) {};
217 virtual ~AutoDelete () {
224 T* operator = (T* b) {
236 class AutoLocalVariable {
240 AutoLocalVariable (MlEnv* e) {
242 mlenv->beginLocal ();
244 virtual ~AutoLocalVariable () {
249 class AutoInclCount {
254 AutoInclCount (MlEnv* e) {
258 virtual ~AutoInclCount () {
261 mlenv->declIncCount ();
264 mlenv->inclIncCount ();
268 if (mlenv->inclIncCount_nothrow ()) {
277 class AutoBackupBool {
282 AutoBackupBool (bool* _ptr) {
286 virtual ~AutoBackupBool () {
291 template<class T> class AutoBackupPtr {
296 AutoBackupPtr (T** _p, T* _v) {
301 virtual ~AutoBackupPtr () {