void ring_vm_jumpvarplenum ( VM *pVM ) { List *pVar ; double nNum1,nNum2 ; pVar = (List *) RING_VM_IR_READP ; nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep)); /* Check Data */ if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) { nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE)); } else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) { nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; } else { ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE); return ; } if ( nNum1 < 0 ) { if ( ! (nNum2 >= RING_VM_IR_READDVALUE(2)) ) { /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(3) ; } } else { if ( ! (nNum2 <= RING_VM_IR_READDVALUE(2)) ) { /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(3) ; } } }
void ring_vm_inclpjump ( VM *pVM ) { List *pVar ; double nNum1,nNum2 ; /* Check Scope Life Time */ if ( RING_VM_IR_READIVALUE(4) != pVM->nActiveScopeID ) { RING_VM_IR_OPCODE = ICO_INCJUMP ; ring_list_deliteminsidelist_gc(pVM->pRingState,pVM->aNewByteCodeItems,RING_VM_IR_ITEM(3)); ring_list_deliteminsidelist_gc(pVM->pRingState,pVM->aNewByteCodeItems,RING_VM_IR_ITEM(4)); #if RING_SHOWICFINAL RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT - 2 ; ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST)); ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST)); #endif pVM->nPC-- ; return ; } pVar = (List *) RING_VM_IR_READPVALUE(3) ; nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep)); /* Check Data */ if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) { nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE)); } else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) { nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; } else { ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE); return ; } ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2 + nNum1); /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(2) ; }
void ring_vm_jumpvarlenum ( VM *pVM ) { List *pVar ; double nNum1,nNum2 ; if ( ring_vm_findvar(pVM, RING_VM_IR_READC ) == 0 ) { ring_vm_newvar(pVM, RING_VM_IR_READC); } nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep)); /* Change Instruction for Performance */ if ( pVM->nVarScope == RING_VARSCOPE_GLOBAL ) { /* Replace JumpVarLENum with JumpVarPLENum for better performance */ if ( nNum1 == 1.0 ) { RING_VM_IR_OPCODE = ICO_JUMPVARPLENUMSTEP1 ; } else { RING_VM_IR_OPCODE = ICO_JUMPVARPLENUM ; } ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(1),RING_VM_STACK_READP); } else if ( pVM->nVarScope == RING_VARSCOPE_LOCAL ) { /* Replace JumpVarLENum with JumpVarLPLENum for better performance */ RING_VM_IR_OPCODE = ICO_JUMPVARLPLENUM ; ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(4),RING_VM_STACK_READP); ring_item_setint_gc(pVM->pRingState,RING_VM_IR_ITEM(5),ring_list_getint(pVM->aScopeID,ring_list_getsize(pVM->aScopeID))); #if RING_SHOWICFINAL RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT + 2 ; ring_list_addpointer_gc(pVM->pRingState,RING_VM_IR_LIST,RING_VM_STACK_READP); ring_list_addint_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getint(pVM->aScopeID,ring_list_getsize(pVM->aScopeID))); #endif } pVar = (List *) RING_VM_STACK_READP ; RING_VM_STACK_POP ; /* Check Data */ if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) { nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE)); ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2); } else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) { nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; } else { ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE); return ; } if ( nNum1 < 0 ) { if ( ! (nNum2 >= RING_VM_IR_READDVALUE(2)) ) { /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(3) ; } } else { if ( ! (nNum2 <= RING_VM_IR_READDVALUE(2)) ) { /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(3) ; } } }
void ring_vm_loadfuncp ( VM *pVM ) { List *pList ; pVM->nFuncExecute++ ; pVM->nFuncExecute2++ ; pList = ring_list_newlist(pVM->pFuncCallList); ring_list_addint(pList,RING_VM_IR_READIVALUE(3)); ring_list_addstring(pList,RING_VM_IR_READC); ring_list_addint(pList,RING_VM_IR_READIVALUE(2)); ring_list_addint(pList,pVM->nSP); ring_list_newlist(pList); ring_list_addpointer(pList,pVM->cFileName); pVM->cFileName = (char *) RING_VM_IR_READPVALUE(4) ; ring_list_addint(pList,RING_VM_IR_READIVALUE(5)); ring_vm_saveloadaddressscope(pVM); }
void ring_vm_incpjumpstep1 ( VM *pVM ) { List *pVar ; double nNum1 ; pVar = (List *) RING_VM_IR_READP ; /* We Don't Check Data Type */ nNum1 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum1 + 1); /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(2) ; }
void ring_vm_jumpvarplenumstep1 ( VM *pVM ) { List *pVar ; double nNum1 ; pVar = (List *) RING_VM_IR_READP ; /* We don't Check Data type */ nNum1 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; if ( nNum1 > RING_VM_IR_READDVALUE(2) ) { /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(3) ; } }
void ring_vm_jumpvarlplenum ( VM *pVM ) { List *pVar ; double nNum1,nNum2 ; /* Check Scope Life Time */ if ( RING_VM_IR_READIVALUE(5) != pVM->nActiveScopeID ) { RING_VM_IR_OPCODE = ICO_JUMPVARLENUM ; #if RING_SHOWICFINAL RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT - 2 ; ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST)); ring_list_deleteitem_gc(pVM->pRingState,RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST)); #endif pVM->nPC-- ; return ; } pVar = (List *) RING_VM_IR_READPVALUE(4) ; nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep)); /* Check Data */ if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) { nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE)); } else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) { nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; } else { ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE); return ; } if ( nNum1 < 0 ) { if ( ! (nNum2 >= RING_VM_IR_READDVALUE(2)) ) { /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(3) ; } } else { if ( ! (nNum2 <= RING_VM_IR_READDVALUE(2)) ) { /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(3) ; } } }
void ring_vm_pushplocal ( VM *pVM ) { /* Check Scope Life Time */ if ( RING_VM_IR_READIVALUE(4) != pVM->nActiveScopeID ) { RING_VM_IR_OPCODE = ICO_LOADADDRESS ; ring_list_deliteminsidelist(pVM->aNewByteCodeItems,RING_VM_IR_ITEM(3)); ring_list_deliteminsidelist(pVM->aNewByteCodeItems,RING_VM_IR_ITEM(4)); #if RING_SHOWICFINAL RING_VM_IR_PARACOUNT = RING_VM_IR_PARACOUNT - 2 ; ring_list_deleteitem(RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST)); ring_list_deleteitem(RING_VM_IR_LIST,ring_list_getsize(RING_VM_IR_LIST)); #endif pVM->nPC-- ; return ; } RING_VM_STACK_PUSHPVALUE(RING_VM_IR_READPVALUE(3)) ; RING_VM_STACK_OBJTYPE = RING_OBJTYPE_VARIABLE ; }
void ring_vm_incpjump ( VM *pVM ) { List *pVar ; double nNum1,nNum2 ; pVar = (List *) RING_VM_IR_READP ; nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep)); /* Check Data */ if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) { nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE)); } else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) { nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; } else { ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE); return ; } ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2 + nNum1); /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(2) ; }
void ring_vm_incjump ( VM *pVM ) { List *pVar ; double nNum1,nNum2 ; if ( ring_vm_findvar(pVM, RING_VM_IR_READC ) == 0 ) { ring_vm_newvar(pVM, RING_VM_IR_READC); } nNum1 = ring_list_getdouble(pVM->aForStep,ring_list_getsize(pVM->aForStep)); /* Change Instruction for Performance */ if ( pVM->nVarScope == RING_VARSCOPE_GLOBAL ) { /* Replace ICO_INCJUMP with IncPJUMP for better performance */ if ( nNum1 == 1.0 ) { RING_VM_IR_OPCODE = ICO_INCPJUMPSTEP1 ; } else { RING_VM_IR_OPCODE = ICO_INCPJUMP ; } ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(1),RING_VM_STACK_READP); } else if ( pVM->nVarScope == RING_VARSCOPE_LOCAL ) { /* Replace ICO_INCJUMP with IncLPJUMP for better performance */ RING_VM_IR_OPCODE = ICO_INCLPJUMP ; ring_item_setpointer_gc(pVM->pRingState,RING_VM_IR_ITEM(3),RING_VM_STACK_READP); ring_item_setint_gc(pVM->pRingState,RING_VM_IR_ITEM(4),ring_list_getint(pVM->aScopeID,ring_list_getsize(pVM->aScopeID))); } pVar = (List *) RING_VM_STACK_READP ; RING_VM_STACK_POP ; /* Check Data */ if ( ring_list_isstring(pVar,RING_VAR_VALUE) ) { nNum2 = ring_vm_stringtonum(pVM,ring_list_getstring(pVar,RING_VAR_VALUE)); ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2); } else if ( ring_list_isnumber(pVar,RING_VAR_VALUE) ) { nNum2 = ring_list_getdouble(pVar,RING_VAR_VALUE) ; } else { ring_vm_error(pVM,RING_VM_ERROR_FORLOOPDATATYPE); return ; } ring_list_setdouble_gc(pVM->pRingState,pVar,RING_VAR_VALUE,nNum2 +nNum1); /* Jump */ pVM->nPC = RING_VM_IR_READIVALUE(2) ; }
int ring_vm_findvar2 ( VM *pVM,int x,List *pList2,const char *cStr ) { int nPC,nType ; Item *pItem ; List *pList ; /* ** Now We have the variable List ** The Scope of the search result */ if ( ( x == 1 ) && (pVM->pActiveMem == ring_list_getlist(pVM->pMem,RING_MEMORY_GLOBALSCOPE)) ) { x = RING_VARSCOPE_GLOBAL ; } else if ( (x == 1) && (pVM->pActiveMem != ring_list_getlist(pVM->pMem,ring_list_getsize(pVM->pMem))) ) { x = RING_VARSCOPE_NEWOBJSTATE ; } pVM->nVarScope = x ; pVM->nSP++ ; if ( ring_list_getint(pList2,RING_VAR_TYPE) == RING_VM_POINTER ) { if ( pVM->nFirstAddress == 1 ) { RING_VM_STACK_SETPVALUE(pList2); RING_VM_STACK_OBJTYPE = RING_OBJTYPE_VARIABLE ; return 1 ; } RING_VM_STACK_SETPVALUE(ring_list_getpointer(pList2,RING_VAR_VALUE )); RING_VM_STACK_OBJTYPE = ring_list_getint(pList2,RING_VAR_PVALUETYPE) ; /* ** Here we don't know the correct scope of the result ** becauase a global variable may be a reference to local variable ** And this case happens with setter/getter of the attributes using eval() */ pVM->nVarScope = RING_VARSCOPE_NOTHING ; } else { /* Check Private Attributes */ if ( ring_list_getint(pList2,RING_VAR_PRIVATEFLAG) == 1 ) { if ( pVM->nVarScope != RING_VARSCOPE_OBJSTATE ) { if ( ring_vm_oop_callmethodinsideclass(pVM) == 0 ) { ring_vm_error2(pVM,RING_VM_ERROR_USINGPRIVATEATTRIBUTE,cStr); return 0 ; } } } RING_VM_STACK_SETPVALUE(pList2); RING_VM_STACK_OBJTYPE = RING_OBJTYPE_VARIABLE ; /* Check Setter/Getter for Public Attributes */ if ( pVM->nGetSetProperty == 1 ) { ring_vm_oop_setget(pVM,pList2); } else if ( ( x == RING_VARSCOPE_OBJSTATE ) && ( ring_vm_oop_callmethodinsideclass(pVM) == 0 ) ) { /* Accessing Object Attribute Using { } */ if ( ring_list_getsize(pVM->aBraceObjects) > 0 ) { pList = ring_list_getlist(pVM->aBraceObjects,ring_list_getsize(pVM->aBraceObjects)); /* Get Object List */ pList = (List *) ring_list_getpointer(pList,RING_ABRACEOBJECTS_BRACEOBJECT); nType = ring_vm_oop_objtypefromobjlist(pList); /* Set Object Pointer & Type */ if ( nType == RING_OBJTYPE_VARIABLE ) { pList = ring_vm_oop_objvarfromobjlist(pList); pVM->pGetSetObject = pList ; } else if ( nType == RING_OBJTYPE_LISTITEM ) { pItem = ring_vm_oop_objitemfromobjlist(pList); pVM->pGetSetObject = pItem ; } pVM->nGetSetObjType = nType ; /* Change Assignment Instruction to SetProperty */ if ( RING_VM_IR_PARACOUNT >= 4 ) { if ( RING_VM_IR_READIVALUE(3) != 0 ) { nPC = pVM->nPC ; pVM->nPC = RING_VM_IR_READIVALUE(3) ; RING_VM_IR_LOAD ; RING_VM_IR_OPCODE = ICO_SETPROPERTY ; pVM->nPC = nPC ; RING_VM_IR_UNLOAD ; /* Avoid AssignmentPointer , we don't have assignment */ pVM->nNOAssignment = 1 ; } } ring_vm_oop_setget(pVM,pList2); } } } return 1 ; }