1 /* Copyright (c) 2013-2019 Mahmoud Fayed <msfclipper@yahoo.com> */
3 /* For Better Performance */
5 void ring_vm_pushp ( VM *pVM )
8 RING_VM_STACK_OBJTYPE = RING_OBJTYPE_VARIABLE ;
9 /* Update Scope List */
10 ring_list_addint_gc(pVM->pRingState,pVM->aLoadAddressScope,RING_VARSCOPE_GLOBAL);
11 pVM->nVarScope = RING_VARSCOPE_GLOBAL ;
14 void ring_vm_pushplocal ( VM *pVM )
16 /* Check Scope Life Time */
17 if ( RING_VM_IR_READIVALUE(4) != pVM->nActiveScopeID ) {
18 RING_VM_IR_OPCODE = ICO_LOADADDRESS ;
19 ring_list_deliteminsidelist_gc(pVM->pRingState,pVM->aNewByteCodeItems,RING_VM_IR_ITEM(3));
20 ring_list_deliteminsidelist_gc(pVM->pRingState,pVM->aNewByteCodeItems,RING_VM_IR_ITEM(4));
22 RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT - 2 ;
23 ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST));
24 ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST));
29 RING_VM_STACK_PUSHPVALUE(RING_VM_IR_READPVALUE(3)) ;
30 RING_VM_STACK_OBJTYPE = RING_OBJTYPE_VARIABLE ;
31 /* Update Scope List */
32 ring_list_addint_gc(pVM->pRingState,pVM->aLoadAddressScope,RING_VARSCOPE_LOCAL);
35 void ring_vm_incp ( VM *pVM )
38 pVar = (List *) RING_VM_IR_READP ;
39 ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,ring_list_getdouble(pVar,RING_VAR_VALUE) + 1);
42 void ring_vm_pushpv ( VM *pVM )
45 pVar = (List *) RING_VM_IR_READP ;
47 if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) {
48 RING_VM_STACK_PUSHCVAR ;
50 else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) {
51 RING_VM_STACK_PUSHNVAR ;
55 void ring_vm_incjump ( VM *pVM )
59 if ( ring_vm_findvar(pVM, RING_VM_IR_READC ) == 0 ) {
60 ring_vm_newvar(pVM, RING_VM_IR_READC);
62 nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep));
63 /* Change Instruction for Performance */
64 if ( pVM->nVarScope == RING_VARSCOPE_GLOBAL ) {
65 /* Replace ICO_INCJUMP with IncPJUMP for better performance */
67 RING_VM_IR_OPCODE = ICO_INCPJUMPSTEP1 ;
69 RING_VM_IR_OPCODE = ICO_INCPJUMP ;
71 ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(1),RING_VM_STACK_READP);
73 else if ( pVM->nVarScope == RING_VARSCOPE_LOCAL ) {
74 /* Replace ICO_INCJUMP with IncLPJUMP for better performance */
75 RING_VM_IR_OPCODE = ICO_INCLPJUMP ;
76 ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(3),RING_VM_STACK_READP);
77 ring_item_setint_gc(pVM->pRingState,RING_VM_IR_ITEM(4),ring_list_getint(pVM->aScopeID,ring_list_getsize(pVM->aScopeID)));
79 pVar = (List *) RING_VM_STACK_READP ;
82 if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) {
83 nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE));
84 ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2);
86 else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) {
87 nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
89 ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE);
92 ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2 +nNum1);
94 pVM->nPC = RING_VM_IR_READIVALUE(2) ;
97 void ring_vm_incpjump ( VM *pVM )
101 pVar = (List *) RING_VM_IR_READP ;
102 nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep));
104 if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) {
105 nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE));
107 else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) {
108 nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
110 ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE);
113 ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2 + nNum1);
115 pVM->nPC = RING_VM_IR_READIVALUE(2) ;
118 void ring_vm_inclpjump ( VM *pVM )
122 /* Check Scope Life Time */
123 if ( RING_VM_IR_READIVALUE(4) != pVM->nActiveScopeID ) {
124 RING_VM_IR_OPCODE = ICO_INCJUMP ;
125 ring_list_deliteminsidelist_gc(pVM->pRingState,pVM->aNewByteCodeItems,RING_VM_IR_ITEM(3));
126 ring_list_deliteminsidelist_gc(pVM->pRingState,pVM->aNewByteCodeItems,RING_VM_IR_ITEM(4));
128 RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT - 2 ;
129 ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST));
130 ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST));
135 pVar = (List *) RING_VM_IR_READPVALUE(3) ;
136 nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep));
138 if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) {
139 nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE));
141 else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) {
142 nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
144 ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE);
147 ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2 + nNum1);
149 pVM->nPC = RING_VM_IR_READIVALUE(2) ;
152 void ring_vm_jumpvarlenum ( VM *pVM )
156 if ( ring_vm_findvar(pVM, RING_VM_IR_READC ) == 0 ) {
157 ring_vm_newvar(pVM, RING_VM_IR_READC);
159 nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep));
160 /* Change Instruction for Performance */
161 if ( pVM->nVarScope == RING_VARSCOPE_GLOBAL ) {
162 /* Replace JumpVarLENum with JumpVarPLENum for better performance */
163 if ( nNum1 == 1.0 ) {
164 RING_VM_IR_OPCODE = ICO_JUMPVARPLENUMSTEP1 ;
166 RING_VM_IR_OPCODE = ICO_JUMPVARPLENUM ;
168 ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(1),RING_VM_STACK_READP);
170 else if ( pVM->nVarScope == RING_VARSCOPE_LOCAL ) {
171 /* Replace JumpVarLENum with JumpVarLPLENum for better performance */
172 RING_VM_IR_OPCODE = ICO_JUMPVARLPLENUM ;
173 ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(4),RING_VM_STACK_READP);
174 ring_item_setint_gc(pVM->pRingState,RING_VM_IR_ITEM(5),ring_list_getint(pVM->aScopeID,ring_list_getsize(pVM->aScopeID)));
176 RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT + 2 ;
177 ring_list_addpointer_gc(pVM->pRingState,RING_VM_IR_LIST,RING_VM_STACK_READP);
178 ring_list_addint_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getint(pVM->aScopeID,ring_list_getsize(pVM->aScopeID)));
181 pVar = (List *) RING_VM_STACK_READP ;
184 if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) {
185 nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE));
186 ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2);
188 else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) {
189 nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
191 ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE);
195 if ( ! (nNum2 >= RING_VM_IR_READDVALUE(2)) ) {
197 pVM->nPC = RING_VM_IR_READIVALUE(3) ;
200 if ( ! (nNum2 <= RING_VM_IR_READDVALUE(2)) ) {
202 pVM->nPC = RING_VM_IR_READIVALUE(3) ;
207 void ring_vm_jumpvarplenum ( VM *pVM )
211 pVar = (List *) RING_VM_IR_READP ;
212 nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep));
214 if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) {
215 nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE));
217 else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) {
218 nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
220 ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE);
224 if ( ! (nNum2 >= RING_VM_IR_READDVALUE(2)) ) {
226 pVM->nPC = RING_VM_IR_READIVALUE(3) ;
229 if ( ! (nNum2 <= RING_VM_IR_READDVALUE(2)) ) {
231 pVM->nPC = RING_VM_IR_READIVALUE(3) ;
236 void ring_vm_jumpvarlplenum ( VM *pVM )
240 /* Check Scope Life Time */
241 if ( RING_VM_IR_READIVALUE(5) != pVM->nActiveScopeID ) {
242 RING_VM_IR_OPCODE = ICO_JUMPVARLENUM ;
244 RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT - 2 ;
245 ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST));
246 ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST));
251 pVar = (List *) RING_VM_IR_READPVALUE(4) ;
252 nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep));
254 if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) {
255 nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE));
257 else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) {
258 nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
260 ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE);
264 if ( ! (nNum2 >= RING_VM_IR_READDVALUE(2)) ) {
266 pVM->nPC = RING_VM_IR_READIVALUE(3) ;
269 if ( ! (nNum2 <= RING_VM_IR_READDVALUE(2)) ) {
271 pVM->nPC = RING_VM_IR_READIVALUE(3) ;
276 void ring_vm_loadfuncp ( VM *pVM )
279 pVM->nFuncExecute++ ;
280 pVM->nFuncExecute2++ ;
281 pList = ring_list_newlist_gc(pVM->pRingState,pVM->pFuncCallList);
282 ring_list_addint_gc(pVM->pRingState,pList,RING_VM_IR_READIVALUE(3));
283 ring_list_addstring_gc(pVM->pRingState,pList,RING_VM_IR_READC);
284 ring_list_addint_gc(pVM->pRingState,pList,RING_VM_IR_READIVALUE(2));
285 ring_list_addint_gc(pVM->pRingState,pList,pVM->nSP);
286 ring_list_newlist_gc(pVM->pRingState,pList);
287 ring_list_addpointer_gc(pVM->pRingState,pList,pVM->cFileName);
288 pVM->cPrevFileName = pVM->cFileName ;
289 pVM->cFileName = (char *) RING_VM_IR_READPVALUE(4) ;
290 ring_list_addpointer_gc(pVM->pRingState,pList,pVM->cFileName);
291 ring_list_addint_gc(pVM->pRingState,pList,RING_VM_IR_READIVALUE(5));
292 ring_list_addint_gc(pVM->pRingState,pList,RING_VM_IR_READIVALUE(6));
293 ring_vm_saveloadaddressscope(pVM);
295 /* For Loop Optimization When Step = 1 */
297 void ring_vm_incpjumpstep1 ( VM *pVM )
301 pVar = (List *) RING_VM_IR_READP ;
302 /* We Don't Check Data Type */
303 nNum1 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
304 ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum1 + 1);
306 pVM->nPC = RING_VM_IR_READIVALUE(2) ;
309 void ring_vm_jumpvarplenumstep1 ( VM *pVM )
313 pVar = (List *) RING_VM_IR_READP ;
314 /* We don't Check Data type */
315 nNum1 = ring_list_getdouble(pVar,RING_VAR_VALUE) ;
316 if ( nNum1 > RING_VM_IR_READDVALUE(2) ) {
318 pVM->nPC = RING_VM_IR_READIVALUE(3) ;