EnglishРусский  

   ..

   vm.c

   vm.h

   vm-a.h

   vmload.c

   vmload.h

   vmres.c

   vmres.h

   vmrun.c

   vmrun.h

   vmrun-a.c

   vmtype.c

   vmtype.h

Реклама

Инсталлятор CreateInstall
Бесплатные и коммерческие инсталляторы

  1 /******************************************************************************
  2 *
  3 * Copyright (C) 2006, The Gentee Group. All rights reserved. 
  4 * This file is part of the Gentee open source project - http://www.gentee.com. 
  5 * 
  6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT"). 
  7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS 
  8 * ACCEPTANCE OF THE AGREEMENT.
  9 *
 10 * ID: vm 18.10.06 0.0.A.
 11 *
 12 * Author: Alexey Krivonogov ( gentee )
 13 *
 14 * Summary: Functions, structures and defines of the Gentee virtual machine.
 15 * 
 16 ******************************************************************************/
 17 
 18 #ifndef _VM_
 19 #define _VM_
 20 
 21    #ifdef __cplusplus               
 22       extern "C" {                 
 23    #endif // __cplusplus      
 24 
 25 #include "../common/hash.h"
 26 #include "../common/msg.h"
 27 #include "../common/collection.h"
 28 #include "../bytecode/cmdlist.h"
 29 
 30 #define   KERNEL_COUNT  1024  // The count of the VM kernel commands
 31 #define   VAR_SIZE      1024  // Stack limit size of variables
 32 
 33 /*-----------------------------------------------------------------------------
 34 *
 35 * ID: gehead 19.10.06 0.0.A.
 36 * 
 37 * Summary: The structure type of the virtual machine.
 38 *  
 39 -----------------------------------------------------------------------------*/
 40 
 41 typedef struct
 42 {
 43    pvoid   ptr;     // The memory pointer
 44    pubyte  top;     // The free pointer
 45    pubyte  end;     // The end pointer
 46    pvoid   next;    // The next vmmanager
 47 } vmmanager, * pvmmanager;
 48 
 49 typedef struct
 50 {
 51    arr   objtbl;    // The table of the objects of the current VM.
 52    hash  objname;   // The table of the names of objects of the current VM.
 53 //   uint  stacksize; // The stack size
 54    uint  count;     // The count of the objects
 55    pvmmanager   pmng;  // The current vmmanager
 56    collect  resource;  // Resources
 57 
 58    uint  ipack;      // 1 if the current loading object is packed
 59    uint  isize;      // The input size of the current loading object
 60    uint  icnv;       // converting shift;
 61    uint  loadmode;   // 0 - if loading from GE otherwise loading from G
 62    uint  countinit;  // The count of the initialized id
 63    uint  pos;        // Pos for run-time error compiling
 64    uint  irescnv;    // shift for converting resources CResload
 65 } vm, * pvm;
 66 
 67 /*-----------------------------------------------------------------------------
 68 *
 69 * ID: vmtype! 19.10.06 0.0.A.
 70 * 
 71 * Summary: The types of objects of the VM.
 72 *  
 73 -----------------------------------------------------------------------------*/
 74 
 75 #define  OVM_NONE       0      // Not defined command
 76 #define  OVM_STACKCMD   0x01   // System command
 77 #define  OVM_PSEUDOCMD  0x02   // Pseudo System command
 78 #define  OVM_BYTECODE   0x03   // Byte-code
 79 #define  OVM_EXFUNC     0x04   // Executable function. It can be 'stdcall' or 
 80                                // 'cdecl' machine code function.
 81 #define  OVM_TYPE       0x05   // Type
 82 #define  OVM_GLOBAL     0x06   // Global variable
 83 #define  OVM_DEFINE     0x07   // Macros definitions
 84 #define  OVM_IMPORT     0x08   // Import functions from external files
 85 #define  OVM_RESOURCE   0x09   // Resources !!! must be realized in GE!
 86 #define  OVM_ALIAS      0x0A   // Alias (link) object
 87 
 88 /*-----------------------------------------------------------------------------
 89 *
 90 * ID: vmflags 19.10.06 0.0.A.
 91 * 
 92 * Summary: The flags of objects of the VM.
 93 *  
 94 -----------------------------------------------------------------------------*/
 95 
 96 // Common flags
 97 #define GHCOM_NAME      0x0001    // Имеется имя - объект импортируем
 98 //#define GHCOM_ALLOC     0x0002    // Указано количество отводимой памяти
 99 #define GHCOM_PACK      0x0002     // Данные упакованы bwd
100 
101 // OVM_BYTECODE
102 #define GHBC_ENTRY      0x000100    // Выполнить после загрузки всего байт-кода
103 #define GHBC_MAIN       0x000200    // Выполнить если он загрузился последним с таким флагом
104 #define GHBC_RESULT     0x000400    // Требуется дополнительный параметр тип - возвращаемое значение при вызове
105 #define GHBC_TEXT       0x000800    // Байт-код является text функцией
106 #define GHBC_METHOD     0x001000    // Байт-код является method
107 #define GHBC_OPERATOR   0x002000    // Байт-код является operator
108 #define GHBC_PROPERTY   0x004000    // Байт-код является property
109 
110 // OVM_EXFUNC
111 #define GHEX_CDECL      0x010000    // Тип функции __cdecl
112 #define GHEX_FLOAT      0x020000    // Возвращаемое значение double или float
113 #define GHEX_SYSCALL    0x040000    // Вызов системной функции по номеру
114 #define GHEX_IMPORT     0x080000    // Импортируемая функция - 
115                                     // есть оригинальное имя и id parent файла
116 
117 // OVM_DEFINE
118 #define GHDF_EXPORT     0x000100    // Экспортировать макросы
119 #define GHDF_NAMEDEF    0x000200    // Макросы без $
120 
121 // OVM_IMPORT 
122 #define GHIMP_LINK      0x000100    // Прилинкованная dll библиотека
123 #define GHIMP_CDECL     0x000200    // Импорт __cdecl функций 
124 #define GHIMP_EXE       0x000400    // Указан относительный путь по отношению к exe файлу
125 
126 // OVM_GLOBAL
127 //#define GHGL_DATA       0x000100    // Есть данные инициализации
128 
129 // OVM_TYPE
130 #define GHTY_INHERIT    0x000100    // Имеется наследование ( объект-родитель )
131 #define GHTY_INDEX      0x000200    // Имеется index 
132 #define GHTY_INITDEL    0x000400    // Имеется метод  init и deinit 
133 #define GHTY_EXTFUNC    0x000800    // Имеется метод  oftype =%
134 #define GHTY_ARRAY      0x001000    // Имеются методы array
135 #define GHTY_PROTECTED  0x002000    // Protected type
136 #define GHTY_STACK      0x010000    // Тип целиком размещается в стэке
137 
138 // RUNTIME flags
139 #define GHRT_MAYCALL    0x01000000  // for OVM_STACKCMD OVM_BYTECODE OVM_EXFUNC
140 #define GHRT_INIT       0x02000000  // Тип требует инициализации (возможно в подтипе)
141 #define GHRT_DELETE     0x04000000  // Тип требует деинициализации ( возможно в подтипе)
142 #define GHRT_LOADED     0x08000000  // The object was initialized in vm_execute
143 #define GHRT_INCLUDED   0x10000000  // The object was proceed at the end of module compile
144 #define GHRT_PRIVATE    0x20000000  // The private object 
145 #define GHRT_ALIAS      0x40000000  // There is alias
146 #define GHRT_SKIP       0x80000000  // Skip object for GE 
147 
148 /*-----------------------------------------------------------------------------
149 *
150 * ID: vmaddflags 19.10.06 0.0.A.
151 * 
152 * Summary: The flags for vm_addobj.
153 *  
154 -----------------------------------------------------------------------------*/
155 
156 //#define VMADD_CRC       0x0001  // CRC control
157 
158 /*-----------------------------------------------------------------------------
159 *
160 * ID: vmobj 19.10.06 0.0.A.
161 * 
162 * Summary: The structure type of the object of the virtual machine. Each item
163   of the virtual machine must begin with this structure.
164 *  
165 -----------------------------------------------------------------------------*/
166 #pragma pack(push, 1)
167 
168 typedef struct
169 {
170    uint      size;       // The full size of this object
171    ubyte     type;       // The type. [- vmtype -]
172    uint      flag;       // The flags.
173    pubyte    name;       // The object name.
174    uint      id;         // Object Identifier in the VM. It equals the array 
175                          // index.
176    uint      nextname;   // The ID of the next object with the same name.
177 } vmobj, * pvmobj;
178 
179 #pragma pack(pop)
180 
181 /*-----------------------------------------------------------------------------
182 *
183 * ID: exttype 19.10.06 0.0.A.
184 * 
185 * Summary: The structure of subtypes.
186 *  
187 -----------------------------------------------------------------------------*/
188 
189 /*-----------------------------------------------------------------------------
190 *
191 * ID: subtype 19.10.06 0.0.A.
192 * 
193 * Summary: The structure of subtypes or variables.
194 *  
195 -----------------------------------------------------------------------------*/
196 #pragma pack(push, 1)
197 
198 typedef struct 
199 {
200    uint       type;     // идентификатор типа
201    uint       off;      // смещение данного поля или переменной
202                         // для переменной смещение в uint с alignment sizeof( uint )
203    pubyte     name;     // указатель на имя поля или переменной
204    uint       oftype;   // OF type.
205    ubyte      flag;     // VAR flags
206    ubyte      dim;      // Dimension.
207    ushort     data;     // Имееются данные инициализации
208    puint      ptr;      // Dimensions + Initializing Data 
209 } vartype, * pvartype;
210 
211 #pragma pack(pop)
212 
213 #define  FTYPE_INIT    0   // @init()
214 #define  FTYPE_DELETE  1   // @delete()
215 #define  FTYPE_OFTYPE  2   // @oftype()
216 #define  FTYPE_COLLECTION  3   // = %{}
217 #define  FTYPE_ARRAY       4   // @array(), @array(,), @array(,,) и т.д.
218 
219 
220 /*-----------------------------------------------------------------------------
221 *
222 * ID: ovmtype 19.10.06 0.0.A.
223 * 
224 * Summary: The structure type of the OVM_TYPE object of the VM.
225 *  
226 -----------------------------------------------------------------------------*/
227 
228 typedef struct 
229 {
230    vmobj     vmo;      // vmobject
231    uint      size;     // the size of the type
232    uint      stsize;   // The count of uints in the stack.
233                        // double, long, ulong - 2
234    uint      inherit;  // Тип-родитель
235    vartype   index;    // Тип по умолчанию для элементов возвращаемых 
236                        // по методу index. По умолчанию это uint.
237    
238    uint      ftype[ MAX_MSR + 4 ];  // Type functions
239    uint      count;    // количество подтипов// - для STRUCT.
240    pvartype  children;   // Subtypes
241 } ovmtype, * povmtype;
242 
243 /*-----------------------------------------------------------------------------
244 *
245 * ID: var 19.10.06 0.0.A.
246 * 
247 * Summary: The type for parameters and local variables
248 *  
249 -----------------------------------------------------------------------------*/
250 
251 /*
252    Parameters and variables
253 
254    При вызове функции
255      Идут передаваемые параметры.
256    
257    puint  // The pointer to local variables. Локальные переменные могут 
258           // располагаться в стэке, а могут в отдельном memory block.
259           // if varsize > 1024 -> отдельный memory
260    uint   [setcount]  // признаки инициализировано ли каждое из множеств 
261           // локальных переменных
262 */
263 
264 /*-----------------------------------------------------------------------------
265 *
266 * ID: vmfunc 19.10.06 0.0.A.
267 * 
268 * Summary: The structure type of the OVM_STACKCMD and OVM_BYTECODE object of the VM. It is used 
269   for embedded stack commands.
270 *  
271 -----------------------------------------------------------------------------*/
272 #pragma pack(push, 1)
273 
274 typedef struct 
275 {
276    vmobj     vmo;      // Object of VM
277    pvartype  ret;
278    ubyte     dwret;      // The count of return uints.
279    ubyte     parcount;   // The count of parameters
280    pvartype  params;     // The parameters
281    ubyte     parsize;    // The summary size of parameters in uints.
282    pvoid     func;       // Proceeding function or the pointer to the byte-code
283 } vmfunc, * pvmfunc;
284 
285 #pragma pack(pop)
286 
287 /*-----------------------------------------------------------------------------
288 *
289 * ID: ovmstack 19.10.06 0.0.A.
290 * 
291 * Summary: The structure type of the OVM_STACKCMD object of the VM. It is used 
292   for embedded stack commands.
293 *  
294 -----------------------------------------------------------------------------*/
295 
296 typedef struct 
297 {
298    vmfunc    vmf;        // Parameters description 
299    int       topshift;   // The shift (in uints) of the top of the stack
300    int       cmdshift;   // The shift (in uints) of the byte-code pointer.
301 } ovmstack, * povmstack;
302 
303 /*-----------------------------------------------------------------------------
304 *
305 * ID: varb 19.10.06 0.0.A.
306 * 
307 * Summary: The structure type of the block of variables. 
308 *  
309 -----------------------------------------------------------------------------*/
310 
311 typedef struct 
312 {
313    ushort    count;      // The number of variables of the block
314    ushort    first;      // The number of the first variable
315    uint      size;       // The summary size of varaiables in uints
316    uint      off;        // The offset of the block
317 } varset, * pvarset;
318 
319 /*-----------------------------------------------------------------------------
320 *
321 * ID: ovmbcode 19.10.06 0.0.A.
322 * 
323 * Summary: The structure type of the OVM_BYTECODE object of the VM. 
324 *  
325 -----------------------------------------------------------------------------*/
326 
327 typedef struct 
328 {
329    vmfunc    vmf;        // Parameters description 
330 //   ushort    varcount;   // The number of local variables
331    pvartype  vars;       //
332    uint      varsize;    // The summary size of all variables in uints
333    ushort    setcount;   // Количество блоков локальных переменных
334    pvarset   sets;       // Указатель на структуры varset
335    uint      bcsize;     // Size of the byte-code
336 } ovmbcode, * povmbcode;
337 
338 /*-----------------------------------------------------------------------------
339 *
340 * ID: ovmfunc 19.10.06 0.0.A.
341 * 
342 * Summary: The structure type of the OVM_EXFUNC object of the VM. 
343 *  
344 -----------------------------------------------------------------------------*/
345 
346 typedef struct 
347 {
348    vmfunc    vmf;        // Parameters description 
349    pubyte    original;   // Original name of the function ( if GHEX_IMPORT )
350    uint      import;     // import parent id ( if GHEX_IMPORT )
351 } ovmfunc, * povmfunc;
352 
353 /*-----------------------------------------------------------------------------
354 *
355 * ID: ovmglobal 19.10.06 0.0.A.
356 * 
357 * Summary: The structure type of the OVM_GLOBAL object of the VM. 
358 *  
359 -----------------------------------------------------------------------------*/
360 typedef struct 
361 {
362    vmobj      vmo;         // The object of VM
363    pvartype   type;        // Type of global
364    pubyte     pval;        // Pointer to the value
365 } ovmglobal, * povmglobal;
366 
367 /*-----------------------------------------------------------------------------
368 *
369 * ID: ovmdefine 19.10.06 0.0.A.
370 * 
371 * Summary: The structure type of the OVM_DEFINE object of the VM. 
372 *  
373 -----------------------------------------------------------------------------*/
374 typedef struct 
375 {
376    vmobj      vmo;      // The object of VM
377    uint       count;    // Count of defines
378    pvartype   macros;   // Macros
379 } ovmdefine, * povmdefine;
380 
381 /*-----------------------------------------------------------------------------
382 *
383 * ID: ovmimport 19.10.06 0.0.A.
384 * 
385 * Summary: The structure type of the OVM_IMPORT object of the VM. 
386 *  
387 -----------------------------------------------------------------------------*/
388 typedef struct 
389 {
390    vmobj      vmo;      // The object of VM
391    pubyte     filename; // The name of the file
392    uint       size;  // The size of DLL if GHIMP_LINK
393    pubyte     data;  // The body of DLL if GHIMP_LINK
394    pvoid      handle;   // The handle of the library
395 } ovmimport, * povmimport;
396 
397 /*-----------------------------------------------------------------------------
398 *
399 * ID: ovmalias 06.07.07 0.0.A.
400 * 
401 * Summary: The structure type of the OVM_ALIAS object of the VM. 
402 *  
403 -----------------------------------------------------------------------------*/
404 typedef struct 
405 {
406    vmobj      vmo;      // The object of VM
407    uint       idlink;   // The id of linked object
408 } ovmalias, * povmalias;
409 
410 // Flags for vm_getid
411 #define GETID_METHOD   0x01  // search method
412 #define GETID_OPERATOR 0x02  // search operator
413 #define GETID_OFTYPE   0x04  // params + oftype in collection
414 
415 //--------------------------------------------------------------------------
416 
417 extern vm    _vm;
418 extern pvm   _pvm;
419 
420 #define  PCMD( y )  *(( puint )_vm.objtbl.data.data + (y))
421 
422 void       STDCALL vm_deinit( void );
423 void       STDCALL vm_init( void );
424 pvmfunc    STDCALL vm_find( pubyte name, uint count, puint pars );
425 uint       STDCALL vm_execute( uint main );
426 void       STDCALL vm_clearname( uint id );
427 uint       STDCALL vm_getid( pstr name, uint flags, pcollect colpars );
428 
429    #ifdef __cplusplus              
430       }                            
431    #endif // __cplusplus
432 
433 #endif // _VM_
434 
435 
Редактировать