s4g  0.9.2
высокоуровневый, императивный, процедурный, встраиваемый, скриптовый язык программирования общего назначения, написанный на C++.
s4g_types.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_TYPES_H
17 #define __S4G_TYPES_H
18 
19 #include <common/array.h>
20 #include <common/assotiativearray.h>
21 #include <common/memalloc.h>
22 #include "s4g.h"
23 #include "s4g_Stack.h"
24 #include <common/sxtypes.h>
25 
26 class s4g_GC;
27 class s4g_VM;
28 
29 
33 #define S4G_GC_TYPE_DATA_FREE 0
35 
37 #define S4G_GC_TYPE_DATA_PRIVATE 1
38 
40 #define S4G_GC_TYPE_DATA_SYS 2
41 
43 
44 
48 //#define S4G_GC_TYPE_VAR_DEL -1
50 
52 #define S4G_GC_TYPE_VAR_FREE 0
53 
55 #define S4G_GC_TYPE_VAR_SYS 1
56 
58 
59 
60 enum S4G_OWNERVAR
61 {
62  S4G_OWNERVAR_NONE = -1,
63  S4G_OWNERVAR_CONTEXT = 0,
64  S4G_OWNERVAR_DATA
65 };
66 
67 class s4g_OwnerVar
68 {
69 public:
70  virtual ~s4g_OwnerVar(){}
71 
72  virtual S4G_OWNERVAR getType() = 0;
73 };
74 
76 struct s4g_Data : public s4g_OwnerVar
77 {
78  s4g_Data();
79  ~s4g_Data();
80 
81  virtual S4G_OWNERVAR getType();
82 
83  union
84  {
85  void *p;
86  s4g_int i;
87  s4g_uint ui;
88  s4g_float f;
89  s4g_bool b;
90  } data;
91 
95  ID m_idData;
96 };
97 
98 
102 {
103  s4g_Variable();
104  ~s4g_Variable();
105 
107  ID m_idVar;
108  s4g_OwnerVar *m_pOwner;
110 
115 };
116 
117 
124 {
125 public:
126  s4g_Table();
127  ~s4g_Table();
128 
129  void clear();
130 
131  ID getKey(const char *szName);
132 
134  ID getKeyByVar(const s4g_Variable *pVar);
135 
137  int getSize(){ return m_iCount; }
138  const char* getNameByNum(ID key);
139 
140  void reserve(int iCount);
141 
142  void remove(const char *szName);
143  void remove(ID key);
144 
146  ID getIdData(){ return m_idData; }
147 
148  s4g_Variable* getByNum(ID key);
149  s4g_Variable* getByName(const char *str);
150 
151  ID isExistsName(const char *str);
152  bool isExistsNum(ID key);
153 
155  ID isExistsName2(const char *szName, s4g_Variable **ppVar);
156 
157  //существует ли переменная по указанному ключу, если да то в ppVar запишет найденную переменную
158  bool isExistsNum2(ID key, s4g_Variable **ppVar);
159 
160  void addVarName(const char *szName, s4g_Variable *pVar);
161  void addVarNum(ID key, s4g_Variable *pVar);
162  void appendVar(s4g_Variable *pVar);
163 
164 protected:
165  friend class s4g_GC;
166  struct item_name
167  {
168  mutable char Name[S4G_MAX_LEN_VAR_NAME];
169  mutable const char * tmpName;
170  __forceinline bool operator==(const item_name & str) const
171  {
172  return(strcmp(tmpName ? tmpName : Name, str.tmpName ? str.tmpName : str.Name) == 0);
173  }
174 
175  __forceinline bool operator<(const item_name & str) const
176  {
177  return(strcmp(tmpName ? tmpName : Name, str.tmpName ? str.tmpName : str.Name) < 0);
178  }
179 
180  __forceinline void SetName(const char * str)const
181  {
182  strcpy(Name, str);
183  tmpName = NULL;
184  }
185 
186  __forceinline const char * GetName() const
187  {
188  return(tmpName ? tmpName : Name);
189  }
190 
191  __forceinline item_name(const char * str)
192  {
193  tmpName = str;
194  Name[0] = 0;
195  }
196 
197  __forceinline item_name()
198  {
199  tmpName = NULL;
200  Name[0] = 0;
201  }
202  };
203  struct table_desc
204  {
205  const item_name * name;
206  s4g_Variable* Value;
207  };
208  int m_iCount;
210  MemAlloc<table_desc, S4G_RESERVE_TABLE_ELEM, 8> m_Mem;
211  typedef AssotiativeArray<item_name, long, false, S4G_RESERVE_TABLE_ELEM> IndexType;
212  typedef const IndexType::Node * IndexNode;
213  IndexType NameIndex;
214  ID m_idData;
215 };
216 
217 
222 {
223 public:
224  s4g_Array();
225  ~s4g_Array();
226 
228  void clear();
229 
231  ID getKeyByVar(const s4g_Variable *pVar);
232 
234  s4g_Variable* get(int iNum);
235 
237  void append(s4g_Variable *pVar);
238 
240  s4g_Variable* getNewLast();
241 
243  int getCount();
244 
246  ID getIdData(){ return m_idData; }
247 
248 protected:
249  friend s4g_GC;
250 
251  s4g_Main *s4gm;
253 
254  ID m_idData;
255 };
256 
257 
258 class s4g_ClassObject;
259 
263 {
264 public:
265  s4g_Class();
266  ~s4g_Class();
267 
269  ID getKeyByVar(const s4g_Variable *pVar);
270 
272  const char* getNameByNum(ID key);
273 
275  void setName(const char *szName);
276 
278  const char* getName();
279 
281  void addBaseClass(s4g_Variable *pVarBaseClass);
282 
284  void addVar(const char *szName);
285 
287  void addMethod(const char *szName, s4g_Variable *pVar);
288 
290  ID getIdData(){ return m_idData; }
291 
292  bool isExported(){ return m_isExported; }
293 
294 protected:
295  friend s4g_ClassObject;
296  friend s4g_Class;
297  friend s4g_GC;
298 
301 
303 
304  String m_sName;
306 
309  s4g_Variable *m_pVarTableMethods;
311 
312  ID m_idData;
313 };
314 
315 
318 {
319 public:
320 
321  s4g_ClassObject();
322  ~s4g_ClassObject();
323 
325  ID getKeyByVar(const s4g_Variable *pVar);
326 
328  const char* getNameByNum(ID key);
329 
331  void Init(s4g_Variable *pVarMetaClass);
332 
334  s4g_Variable* getVar(const char *szName);
335 
337  s4g_Variable* getVarClass();
338 
340 
342  ID getIdData(){ return m_idData; }
343 
344 protected:
345  friend s4g_GC;
346  friend s4g_VM;
347 
350 
354 
355  ID m_idData;
356 };
357 
358 
359 class s4g_Command;
360 
363 {
364  s4g_Sfunction(){ m_pExternVar = 0; m_pExternTable = 0; m_isMarg = false; m_pMargVar = 0; m_pMargTable = 0; }
365  ~s4g_Sfunction(){}
371  bool m_isMarg;
374 };
375 
376 
379 {
383 };
384 
385 
388 struct s4g_Context : public s4g_OwnerVar
389 {
390  s4g_Context(){ m_pTable = 0; m_TypeWork = S4G_CONTEXT_TYPE_WORK_OFFLINE; m_pOldTable = 0; }
391  ~s4g_Context() {}
392  virtual S4G_OWNERVAR getType() { return S4G_OWNERVAR_CONTEXT; }
394 
401 
405 
406 };
407 
408 
412 {
421 
426 
433 
438  S4G_VM_COMMAND_ARITHMETIC_MOD,
439 
444 
446 
451 
455 
456  //переход относительный, относительно адреса (положения) в массиве команд
460 
461  //логические
462  //S4G_VM_COMMAND_LOGIC_AND, //!< (-2) && (-1), оба выталкиваются, на стек ложится результат
463  //S4G_VM_COMMAND_LOGIC_OR, //!< (-2) || (-1), оба выталкиваются, на стек ложится результат
473 
474  S4G_VM_COMMAND_BIT_XOR,
475  S4G_VM_COMMAND_BIT_NOT,
476  S4G_VM_COMMAND_BIT_SHIFTR,
477  S4G_VM_COMMAND_BIT_SHIFTL,
478  S4G_VM_COMMAND_BIT_AND,
479  S4G_VM_COMMAND_BIT_OR,
480 
482 };
483 
487 #define S4G_COMMAND_EXTRADATA_FETCH_GET_STRING 0
489 
491 #define S4G_COMMAND_EXTRADATA_FETCH_GET_NUMERIC 1
492 
494 
495 
498 {
499  s4g_Command()
500  {
501  m_Command = S4G_VM_COMMAND_HALT;
502  m_pArg = 0;
503  m_numFile = m_numStr = -1;
504  m_iExtraData = 0;
505  }
506 
507  s4g_Command(S4G_VM_COMMAND Command, s4g_Variable* pVar, ID numFile, ID numStr, int iExtraData = 0)
508  {
509  m_Command = Command;
510  m_pArg = pVar;
511  m_numFile = numFile;
512  m_numStr = numStr;
513  m_iExtraData = iExtraData;
514  }
515 
516  ~s4g_Command(){}
517 
521  ID m_numStr;
523 };
524 
525 #endif
526 
527 //!@} types
(-2) != (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:466
создать и положить на вершину стека значение переменной, имя берет из аргумента
Definition: s4g_types.h:416
сформированная команда, готовая к выполнению, возможно содерижит аргумент и дополнительную переменную...
Definition: s4g_types.h:497
(-2) <= (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:468
получить значение из объекта (таблица, массив, объект класса, строка), который должен содержать други...
Definition: s4g_types.h:429
не рабочий
Definition: s4g_types.h:380
Заголовочный файл стека для языка
сообщение о том что вскоре будет вызвана функция, записать в стек вызовов размер стека исполнения ...
Definition: s4g_types.h:445
S4G_TYPE
все типы данных которые могут быть использованы в скриптах
Definition: s4g.h:160
s4g_Table * m_pOldTable
прошлая таблица с переменными каждый контекст при создании создает себе таблицу, и если мы в текущий ...
Definition: s4g_types.h:400
(-2) - (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:435
int m_iCurrNumCollect
текущй номер сборки мусора
Definition: s4g_types.h:109
переход условный, на вершине стека исполнения должно быть Zero (выталкивается со стека) ...
Definition: s4g_types.h:458
(-2) === (равенство без приведения типов) (-1), оба выталкиваются, на стек ложится результат ...
Definition: s4g_types.h:472
s4g_Variable * m_pExternVar
значение для m_pExternTable.
Definition: s4g_types.h:366
положить на вершину стека
Definition: s4g_types.h:431
ID m_idVar
идентификатор этой переменной в массиве переменных (управляемым сборщиком мусора) ...
Definition: s4g_types.h:107
(-2) == (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:465
тип скриптовая функция
Definition: s4g_types.h:362
контекст содержащий в себе все переменные текущего исполнения
Definition: s4g_types.h:388
Заголовочный файл со всеми необхожимыми данными для использования языка, посредством api функций ...
ID getIdData()
получить id значения этого значения в общем массиве значений (в сборщике мусора)
Definition: s4g_types.h:342
long s4g_int
int
Definition: s4g.h:270
создать массив, поместить в него все элементы со стека (после этого все элементы будут вытолкнуты со ...
Definition: s4g_types.h:417
s4g_Main * s4gm
скриптовая система которая создала
Definition: s4g_types.h:349
удалить значение с вершины стека
Definition: s4g_types.h:432
(-2) < (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:470
void * s4g_pdata
указатель
Definition: s4g.h:282
создать метод, имя в аргументе, -1 - функция-аргумент, -2 сам класс
Definition: s4g_types.h:425
ложит на вершину стека переменную из контекста, из аргумента извлеваются: номер контекста относительн...
Definition: s4g_types.h:428
таблица, наиболее распространенный тип в скриптах
Definition: s4g_types.h:123
создать переменную класса, имя в аргументе, -1 сам класс
Definition: s4g_types.h:424
добавить в таблицу, которая -2, -1 элемент со стека, если есть аргумент то значит это имя для этого п...
Definition: s4g_types.h:419
переход без условный
Definition: s4g_types.h:457
s4g_Variable * m_pMargVar
значение для m_pMargTable.
Definition: s4g_types.h:372
(-2) + (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:434
удаление окружения блока выражений
Definition: s4g_types.h:453
(-2) > (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:469
ID m_numFile
номер файла с кодом
Definition: s4g_types.h:520
s4g_Table * m_pTable
таблица с переменными
Definition: s4g_types.h:393
S4G_VM_COMMAND m_Command
команда виртуальной машины
Definition: s4g_types.h:518
остановить текущее выполнение
Definition: s4g_types.h:413
ID m_numStr
номер строки с кодом которая сгенерировала данную команду
Definition: s4g_types.h:521
создать таблицу и положить на вершину стека
Definition: s4g_types.h:418
добавить родителя (-1) к к классу (-2), после pop(1)
Definition: s4g_types.h:423
s4g_Table * m_pExternTable
подстановка переменных из предыдщуего контекста, в случае если у нас замыкание
Definition: s4g_types.h:367
s4g_Table * m_pTableVars
таблица данных
Definition: s4g_types.h:353
bool m_isMarg
принимает ли функция перенное количество аргументов?
Definition: s4g_types.h:371
S4G_CONTEXT_TYPE_WORK m_TypeWork
тип контекста S4G_CONTEXT_TYPE_WORK, это нужно в случе когда вызывается функция, вызываемая блокирует...
Definition: s4g_types.h:404
s4g_Main * s4gm
скриптовая система которая создала
Definition: s4g_types.h:300
s4g_Stack< String > m_aExternStrs
имена переменных для подстановки из предыдущего контекста, в случае если у нас замыкание ...
Definition: s4g_types.h:368
ID getIdData()
получить id значения этого значения в общем массиве значений (в сборщике мусора)
Definition: s4g_types.h:246
S4G_CONTEXT_TYPE_WORK
типы контекстов
Definition: s4g_types.h:378
переход условный, на вершине стека исполнения должно быть Non-Zero (выталкивается со стека) ...
Definition: s4g_types.h:459
int m_iCurrNumCollect
текущй номер сборки мусора
Definition: s4g_types.h:92
s4g_OwnerVar * m_pOwner
идентификатор владельца (в массиве значений) к которому принадлежит данная переменная ...
Definition: s4g_types.h:108
s4g_Stack< String > m_aArgsNames
имена аргументов
Definition: s4g_types.h:369
(-2) * (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:436
s4g_Table * m_pMargTable
таблица с переменным количеством аргументов
Definition: s4g_types.h:373
постинкремент val++ (-1 элемент стека)
Definition: s4g_types.h:442
!(-1), выталкивается, на стек ложится результат (если значение было что-то похожее на true - значит f...
Definition: s4g_types.h:471
преинкремент ++val (-1 элемент стека)
Definition: s4g_types.h:440
int m_iTypeClass
тип данных для сборщика мусора, см.
Definition: s4g_types.h:94
(-2) !== (неравенство без приведения типов) (-1), оба выталкиваются, на стек ложится результат ...
Definition: s4g_types.h:464
s4g_Data * m_pData
значение переменной
Definition: s4g_types.h:114
Сборщик мусора
Definition: s4g_gc.h:32
s4g_Stack< s4g_Variable * > m_aListVarBaseClass
список базовых классов
Definition: s4g_types.h:310
S4G_VM_COMMAND
команды виртуальной машины
Definition: s4g_types.h:411
рабочий
Definition: s4g_types.h:381
S4G_TYPE m_TypeValue
тип хранимый в data S4G_TYPE.
Definition: s4g_types.h:93
short int s4g_bool
bool
Definition: s4g.h:279
s4g_Stack< String > m_aListVars
список переменных
Definition: s4g_types.h:305
int m_iExtraData
дополнительные переменная
Definition: s4g_types.h:522
сохранить в переменной -2 значение из -1, затем -1 выталкивает
Definition: s4g_types.h:430
s4g_pdata m_pData
указатель на юзердату в случае экпортированного класса
Definition: s4g_types.h:339
int getSize()
размер таблицы в элементах
Definition: s4g_types.h:137
добавить новый (null) элемент в конец таблицы, которая -1, выталкивает таблицу, ложит новый элемент н...
Definition: s4g_types.h:420
bool m_isExported
экспортирован ли класс из C++?
Definition: s4g_types.h:302
ID getIdData()
получить id значения этой таблицы в общем массиве значений (в сборщике мусора)
Definition: s4g_types.h:146
предекремент – val (-1 элемент стека)
Definition: s4g_types.h:441
#define S4G_MAX_LEN_VAR_NAME
максимальная длина имени переменной
Definition: s4g.h:188
создание нового окружения для блока выражений (выделяется новый контекст куда сохраняются все созданн...
Definition: s4g_types.h:452
основа взаимодествия
Definition: s4g_main.h:45
массив переменной длины
Definition: s4g_types.h:221
ID getIdData()
получить id значения этого значения в общем массиве значений (в сборщике мусора)
Definition: s4g_types.h:290
s4g_Stack< s4g_Command > m_aCommands
команды исполнения функции
Definition: s4g_types.h:370
переменная
Definition: s4g_types.h:101
(-2) / (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:437
unsigned long s4g_uint
uint
Definition: s4g.h:273
постдекремент val++ (-1 элемент стека)
Definition: s4g_types.h:443
создать пустой класс и положить его на стек, имя в аргументе
Definition: s4g_types.h:422
s4g_Table * m_pTableMethods
таблица с методами
Definition: s4g_types.h:308
виртуальная машина
Definition: s4g_vm.h:104
вызов функции, из precall бере количество аргументов (count_arg), забирает их со стека, берет переменную функции (count_arg-1) со стека и выталкивает ее
Definition: s4g_types.h:450
s4g_Variable * m_pVarMetaClass
метакласс
Definition: s4g_types.h:351
String m_sName
имя класса
Definition: s4g_types.h:304
мета класс
Definition: s4g_types.h:262
значение
Definition: s4g_types.h:76
очистить верхний контекст
Definition: s4g_types.h:454
ID m_idData
ключ по которому можно обратится к массиву значений и найти этот экземпляр
Definition: s4g_types.h:95
s4g_Variable * m_pVarTableVars
переменная для m_pTableVars.
Definition: s4g_types.h:352
float s4g_float
float
Definition: s4g.h:276
положить на вершину стека значение переменной, имя переменной берется из аргумента, поиск осуществляется во всех доступных контекстах
Definition: s4g_types.h:427
int m_iTypeClass
тип данных для сборщика мусора, см.
Definition: s4g_types.h:106
создать объект класса, класс берет -1 из стека и выталкивает, на стек ложит объект класса ...
Definition: s4g_types.h:415
объект класса
Definition: s4g_types.h:317
s4g_Variable * m_pArg
аргумент для команды (может быть NULL)
Definition: s4g_types.h:519
поместить вершину стека на вершину, то есть -2 и -1 идентичны (не копирует!)
Definition: s4g_types.h:414
рабочий всегда
Definition: s4g_types.h:382
размер всего массива команд
Definition: s4g_types.h:481
(-2) >= (-1), оба выталкиваются, на стек ложится результат
Definition: s4g_types.h:467