Example #1
0
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) ;
		}
	}
}
Example #2
0
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) ;
}
Example #3
0
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) ;
		}
	}
}
Example #4
0
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);
}
Example #5
0
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) ;
}
Example #6
0
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) ;
	}
}
Example #7
0
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) ;
		}
	}
}
Example #8
0
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 ;
}
Example #9
0
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) ;
}
Example #10
0
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) ;
}
Example #11
0
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 ;
}