s4g  0.9.2
высокоуровневый, императивный, процедурный, встраиваемый, скриптовый язык программирования общего назначения, написанный на C++.
s4g_vm.h
См. документацию.
1 
2 /*
3 Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
4 license MIT see in LICENSE or
5 https://s4g.su/
6 */
7 
16 #ifndef __S4G_VM_H
17 #define __S4G_VM_H
18 
19 #include <math.h>
20 #include "s4g_types.h"
21 #include "s4g_main.h"
22 
25 {
29 };
30 
31 #define S4G_VM_OP_ARIF_ERROR_TYPE1(tval1) \
32  sprintf(this->m_szError, "[%s]:%d - attempt to perform arithmetic on arg #1 (a '%s' value)", getCurrExeFile(), getCurrExeStr(), s4g_GetStrType(tval1->m_pData->m_TypeValue)); \
33  return;
34 
35 #define S4G_VM_OP_ARIF_ERROR_TYPE2(tval2) \
36  sprintf(this->m_szError, "[%s]:%d - attempt to perform arithmetic on arg #2 (a '%s' value)", getCurrExeFile(), getCurrExeStr(), s4g_GetStrType(tval2->m_pData->m_TypeValue)); \
37  return;
38 
39 #define S4G_VM_OP_ARIF_ERROR_UNSUN_UNRES(tval2) \
40  sprintf(this->m_szError, "[%s]:%d - unary symbol is unresolved to '%s' type", getCurrExeFile(), getCurrExeStr(), s4g_GetStrType(tval2->m_pData->m_TypeValue)); \
41  return;
42 
43 #define S4G_VM_OP_ARIF_INCR_DECR_ERR(tval) \
44  sprintf(this->m_szError, "[%s]:%d - expected number type, but got '%s' type", getCurrExeFile(), getCurrExeStr(), s4g_GetStrType(tval->m_pData->m_TypeValue)); \
45  return;
46 
47 #define S4G_VM_PRECOND_STACKEXE(state, retval) if(!state) return retval;
48 
49 #define S4G_VM_PRECOND_COMMANDARG(arg, funcname) \
50  if(!arg) \
51  { \
52  m_iError = -1; \
53  sprintf(this->m_szError, "[%s]:%d - argument of command is empty, vm function '%s'", getCurrExeFile(), getCurrExeStr(), funcname); \
54  return; \
55  }
56 
57 //##########################################################################
58 
61 {
62  s4g_CallData()
63  {
65  m_pTableVars = 0;
67  m_pVarFunc = 0;
69  m_iStackSize = -1;
70  }
71 
72  ~s4g_CallData(){}
73 
83 };
84 
85 //##########################################################################
86 
89 {
90  s4g_PrecallData(){ m_iSizeStack = 0; m_pVar = 0; }
91  s4g_PrecallData(int iSizeStack, s4g_Variable *pVar){ m_iSizeStack = iSizeStack; m_pVar = pVar; }
92 
95 
98 };
99 
100 //##########################################################################
101 
104 class s4g_VM
105 {
106 public:
107 
108  s4g_VM(s4g_Main *_s4gm);
109  ~s4g_VM();
110 
114  void clear();
115 
117  int run(s4g_Stack<s4g_Command> *pCommands, s4g_Table *pCurrTable);
118 
120  void returnPrevState();
121 
123  bool precondStackExe(int iCountExpected, const char *szFuncName);
124 
125  //######################################################################
126 
130  void comObjectNew();
132 
134  void comVarNew();
135 
137  void comFetch();
138 
140  void comFetchIdx();
141 
143  void comAccess();
144 
146  void comStore();
147 
149  void comArrayNew();
150 
151 
153  void comClassNew();
154 
156  void comClassParentAdd();
157 
159  void comClassVarAdd();
160 
162  void comClassMethodAdd();
163 
164 
166  void comTableNew();
167 
169  void comTableInsert();
170 
172  void comTableAppend();
173 
174 
176  void comHalt();
177 
179  void comDoubleTop();
180 
182  void comPush();
183 
185  void comPop();
186 
187 
189  void comPrecall();
190 
192  void comCall();
193 
194 
196  void comArithmeticAdd();
197 
199  void comArithmeticSub();
200 
202  void comArithmeticMul();
203 
205  void comArithmeticDiv();
206 
208  void comArithmeticMod();
209 
210 
212  void comJump();
213 
215  void comJumpZero();
216 
218  void comJumpNonZero();
219 
220 
222  void comLogicNeqt();
223 
225  void comLogicEq();
226 
228  void comLogicNeq();
229 
231  void comLogicGe();
232 
234  void comLogicLe();
235 
237  void comLogicGt();
238 
240  void comLogicLt();
241 
243  void comLogicNot();
244 
246  void comLogicEqt();
247 
248 
250  void comBitXor();
251 
253  void comBitNot();
254 
256  void comBitShiftR();
257 
259  void comBitShiftL();
260 
262  void comBitAnd();
263 
265  void comBitOr();
266 
267 
269  void comBlockNew();
270 
272  void comBlockDel();
273 
275  void comTopContextClear();
276 
277 
279  void comPreincr();
280 
282  void comPostincr();
283 
285  void comPredecr();
286 
288  void comPostdecr();
289 
291 
293  typedef void(s4g_VM::*opfunc) ();
294 
296  opfunc m_aOpFunc[S4G_VM_COMMAND_LAST];
297 
298  //######################################################################
299 
301  const char* getCurrExeFile(char *szStr = 0);
302 
304  int getCurrExeStr(char *szStr = 0);
305 
307  const char* getCurrExeFunc(char *szStr = 0);
308 
310  const char* stackTrace();
311 
313 
315  void setError(const char *szStr);
316 
318  const char* getError();
319 
321  bool hasError(){ return (m_iError < 0); };
322 
324  int getStackArgsSize() { return m_aStackArgs.getSize(); };
325 
327  s4g_Variable* getArgFromStackArgs(int iNum){ return m_aStackArgs.get(iNum - 1); };
328 
330  void pushStackExecute(s4g_Variable *pVar) { m_oStackExecute.push(pVar); };
331 
333  void popStackExecute(int iCount = 1) { m_oStackExecute.pop(iCount); };
334 
336  s4g_Variable* getStackExecute(int iNum) { return m_oStackExecute.get(iNum); };
337 
339  int getSizeStackExecute(){ return m_oStackExecute.getSize(); };
340 
342  S4G_TYPE getTypeLastCall(){ return typeLastCallFunc; }
343 
344 protected:
345  friend s4g_Main;
346 
347  s4g_Main* s4gm;
348 
351 
354 
357 
360 
363 
366 
369 
372 
373 
374  String m_sStackTrace;
375 
376  int m_iError;
377  char m_szError[1024];
378 
380 
383 
384 
385 
387 
392 
394 
396 
401 
402  MemAlloc<s4g_CallData, S4G_RESERVE_BLOCKS_MEM> m_oMemCallData;
403 };
404 
405 #endif
406 
407 //!@} vm
ID m_idContextNew
созданный контекст (id)
Definition: s4g_vm.h:78
int getSizeStackExecute()
возвращает размер стека исполнения
Definition: s4g_vm.h:339
int m_idCurrPos2ArrCommand
позиция в стеке исполняемых команд
Definition: s4g_vm.h:76
S4G_TYPE getTypeLastCall()
возвращает тип последней исполняемой/исполненной функции
Definition: s4g_vm.h:342
S4G_TYPE typeLastCallFunc
тип последней исполняемой/исполненной функции
Definition: s4g_vm.h:353
сформированная команда, готовая к выполнению, возможно содерижит аргумент и дополнительную переменную...
Definition: s4g_types.h:497
s4g_Variable * m_pGvar
переменная хранящая в себе глобальное пространство имен
Definition: s4g_vm.h:365
S4G_TYPE
все типы данных которые могут быть использованы в скриптах
Definition: s4g.h:160
структура описывающая сохраненное предыдущее состояние при вызове функции и содержащее имя вызыванной...
Definition: s4g_vm.h:60
void popStackExecute(int iCount=1)
вытолкнуть со стека исполнения данные
Definition: s4g_vm.h:333
s4g_Table * m_pTableVars
таблица с переменными (окружением)
Definition: s4g_vm.h:75
s4g_Variable * getStackExecute(int iNum)
возвращает переменную со стека исполнения
Definition: s4g_vm.h:336
s4g_Stack< s4g_Variable *, 64 > m_aStackArgs
стек аргументов вызванной в даннй момент Си функции
Definition: s4g_vm.h:393
int m_iCountCurrOpenBlocks
количество текущих открытых блоков, именно текущих, потому что нужно их котролировать и внутри функци...
Definition: s4g_vm.h:391
s4g_Table * m_pCurrTable
текущее установленное пространство имен, если выполняется функция то пространство имен функции ...
Definition: s4g_vm.h:368
S4G_VM_LOCALEXE
локальное состоние работы машины
Definition: s4g_vm.h:24
запуск функции (пвторный запуск уже запущенной машины), при этом машина после завершения функции зака...
Definition: s4g_vm.h:28
s4g_Stack< s4g_CallData * > m_aStackCall
стэк вызовов с сохраненным предыдущим состоянием
Definition: s4g_vm.h:395
основной запуск
Definition: s4g_vm.h:27
Заголовочный файл основы взаимодествия хоста со скриптами
void pushStackExecute(s4g_Variable *pVar)
запихнуть в стек исполнения значение
Definition: s4g_vm.h:330
таблица, наиболее распространенный тип в скриптах
Definition: s4g_types.h:123
int m_iStackSize
размер стека исполнения
Definition: s4g_vm.h:81
ID m_idContextLastDeactivated
поледний деактивированный контекст (id)
Definition: s4g_vm.h:77
S4G_VM_COMMAND m_vm_command
текущая команда машины
Definition: s4g_vm.h:381
String m_sStackTrace
строка для трассировки стека
Definition: s4g_vm.h:374
выход, ожидает выхода
Definition: s4g_vm.h:26
int getStackArgsSize()
возвращает количество аргументов вызываемой С++ функции
Definition: s4g_vm.h:324
данные превызова функции
Definition: s4g_vm.h:88
s4g_Variable * getArgFromStackArgs(int iNum)
возвращает аргумент из стека аргументов для вызываемой C++ функции, по номеру (1 ... N)
Definition: s4g_vm.h:327
int m_iSizeStack
размер стека
Definition: s4g_vm.h:94
s4g_Stack< s4g_Command > * m_pCurrArrCommand
команды выполнения
Definition: s4g_vm.h:74
s4g_Stack< s4g_CallData * > m_aStackBloks
стэк блоков с сохраненным предыдущим состоянием
Definition: s4g_vm.h:386
int m_iCountCurrOpenBlocks
количество открытых блоков
Definition: s4g_vm.h:80
S4G_VM_COMMAND
команды виртуальной машины
Definition: s4g_types.h:411
s4g_Stack< s4g_Command > * m_pCurrArrCommand
текущий указатель на стэк команд в исполнении
Definition: s4g_vm.h:356
s4g_Table * m_pGtable
глобальное пространство имен _g.
Definition: s4g_vm.h:362
s4g_Variable * m_pVar
переменная объекта которому принадлежит функция, в случае вызова метода класса, иначе 0...
Definition: s4g_vm.h:97
основа взаимодествия
Definition: s4g_main.h:45
s4g_Stack< s4g_Variable *, S4G_VM_MAX_SIZE_STACK_EXE > m_oStackExecute
стек выполнения
Definition: s4g_vm.h:371
s4g_Stack< s4g_PrecallData *, S4G_MAX_CALL+1 > m_aStackSizesStackExe
хранит размер стека исполнения на момент добавления значения
Definition: s4g_vm.h:400
s4g_Variable * pVarCurrArg
аргумент текущей команды
Definition: s4g_vm.h:382
переменная
Definition: s4g_types.h:101
s4g_Command * m_pCurrCommand
текущая команда с данными
Definition: s4g_vm.h:379
bool m_canExecute
можно ли выполнять код ( run при удачном запуске установит ее в true)
Definition: s4g_vm.h:350
ID m_idContextExtern
подставляемый контекст для замыканий (id)
Definition: s4g_vm.h:79
bool hasError()
установлена ли ошибка машине?
Definition: s4g_vm.h:321
ID m_idCurrPos2ArrCommand
текущее положение в текущем стеке исполнения m_pCurrArrCommand.
Definition: s4g_vm.h:359
MemAlloc< s4g_CallData, S4G_RESERVE_BLOCKS_MEM > m_oMemCallData
резерваци памяти для s4g_CallData.
Definition: s4g_vm.h:402
s4g_Variable * m_pVarFunc
переменная со значением функции
Definition: s4g_vm.h:82
виртуальная машина
Definition: s4g_vm.h:104
Заголовочный файл с основными типами данных
int m_iError
есть ли ошибка? -1 есть, остальное все в норме
Definition: s4g_vm.h:376
размер всего массива команд
Definition: s4g_types.h:481