void ring_vm_refmeta_isglobal ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; const char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; pList = ring_list_getlist(pVM->pMem,1) ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_VAR_NAME),cStr) == 0 ) { RING_API_RETNUMBER(1); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_packageclasses ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2, *pList3 ; char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; ring_string_lower(cStr); pList = pVM->pPackagesMap ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_PACKAGENAME),cStr) == 0 ) { pList3 = RING_API_NEWLIST ; pList2 = ring_list_getlist(pList2,RING_CLASSESLIST) ; /* We can use the variable x for the loop again because we have return */ for ( x = 1 ; x <= ring_list_getsize(pList2) ; x++ ) { ring_list_addstring(pList3,ring_list_getstring(ring_list_getlist(pList2,x),RING_CLASSMAP_CLASSNAME)); } RING_API_RETLIST(pList3); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_isprivateattribute ( void *pPointer ) { List *pList ; int x ; char *cStr ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) && RING_API_ISSTRING(2) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { cStr = RING_API_GETSTRING(2) ; ring_string_lower(cStr); pList = ring_list_getlist(pList,RING_OBJECT_OBJECTDATA); for ( x = 3 ; x <= ring_list_getsize(pList) ; x++ ) { if ( strcmp(cStr,ring_list_getstring(ring_list_getlist(pList,x),RING_VAR_NAME))==0 ) { if ( ring_list_getint(ring_list_getlist(pList,x),RING_VAR_PRIVATEFLAG) == 1 ) { RING_API_RETNUMBER(1); } else { RING_API_RETNUMBER(0); } return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_methods ( void *pPointer ) { List *pList, *pList2 ; int x ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = (List *) ring_list_getpointer(pList,RING_OBJECT_CLASSPOINTER); pList = ring_list_getlist(pList,RING_CLASSMAP_METHODSLIST); pList2 = RING_API_NEWLIST ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { ring_list_addstring(pList2,ring_list_getstring(ring_list_getlist(pList,x),RING_FUNCMAP_NAME)); } RING_API_RETLIST(pList2); } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_islocal ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; const char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; /* We use -1 to skip the current scope of the locals() function */ pList = ring_list_getlist(pVM->pMem,ring_list_getsize(pVM->pMem)-1) ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_VAR_NAME),cStr) == 0 ) { RING_API_RETNUMBER(1); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
int ring_vm_findvar ( VM *pVM,const char *cStr ) { int x,nPos,nMax1 ; List *pList,*pList2 ; assert(pVM->pMem); nMax1 = ring_list_getsize(pVM->pMem); /* The scope of the search result */ pVM->nVarScope = RING_VARSCOPE_NOTHING ; if ( nMax1 > 0 ) { /* Loop to search in each Scope */ for ( x = 1 ; x <= 3 ; x++ ) { /* 1 = last scope (function) , 2 = Object State , 3 = global scope */ if ( x == 1 ) { pList = pVM->pActiveMem ; } else if ( x == 2 ) { if ( ring_list_getsize(pVM->pObjState) == 0 ) { continue ; } /* Search in Object State */ pList = ring_list_getlist(pVM->pObjState,ring_list_getsize(pVM->pObjState)) ; pList = (List *) ring_list_getpointer(pList,RING_OBJSTATE_SCOPE) ; if ( pList == NULL ) { continue ; } /* Pass Braces for Class Init() method */ if ( (ring_list_getsize(pVM->pObjState) > 1) && (pVM->nCallClassInit) ) { pList = ring_list_getlist(pVM->pObjState,ring_list_getsize(pVM->pObjState)-1) ; pList = (List *) ring_list_getpointer(pList,RING_OBJSTATE_SCOPE) ; if ( pList == NULL ) { continue ; } } } else { pList = ring_list_getlist(pVM->pMem,RING_MEMORY_GLOBALSCOPE); } if ( ring_list_getsize(pList) < 10 ) { /* Search Using Linear Search */ nPos = ring_list_findstring(pList,cStr,1); if ( nPos != 0 ) { pList2 = ring_list_getlist(pList,nPos); return ring_vm_findvar2(pVM,x,pList2,cStr) ; } } else { /* Search Using the HashTable */ if ( pList->pHashTable == NULL ) { ring_list_genhashtable2(pList); } pList2 = (List *) ring_hashtable_findpointer(pList->pHashTable,cStr); if ( pList2 != NULL ) { return ring_vm_findvar2(pVM,x,pList2,cStr) ; } } } } return 0 ; }
void ring_vm_catch ( VM *pVM,const char *cError ) { List *pList ; pList = ring_list_getlist(pVM->pTry,ring_list_getsize(pVM->pTry)); pVM->nPC = ring_list_getint(pList,1) ; ring_vm_restorestate(pVM,pList,2,RING_STATE_TRYCATCH); /* Define variable cCatchError to contain the error message */ ring_list_setstring(ring_list_getlist(ring_list_getlist(pVM->pMem,1),6),3,cError); /* Tell C-API caller (CALL command) that catch happens! */ pVM->nActiveCatch = 1 ; /* Catch Statements must be executed without try effects */ ring_vm_done(pVM); }
void ring_vm_refmeta_locals ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2, *pList3 ; pVM = (VM *) pPointer ; /* We use -1 to skip the current scope of the locals() function */ pList = ring_list_getlist(pVM->pMem,ring_list_getsize(pVM->pMem)-1) ; pList2 = RING_API_NEWLIST ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList3 = ring_list_getlist(pList,x); ring_list_addstring(pList2,ring_list_getstring(pList3,RING_VAR_NAME)); } RING_API_RETLIST(pList2); }
void ring_vm_refmeta_globals ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2, *pList3 ; pVM = (VM *) pPointer ; pList = ring_list_getlist(pVM->pMem,1) ; pList2 = RING_API_NEWLIST ; /* We avoid internal global variables like true, false */ for ( x = RING_VM_INTERNALGLOBALSCOUNT + 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList3 = ring_list_getlist(pList,x); ring_list_addstring(pList2,ring_list_getstring(pList3,RING_VAR_NAME)); } RING_API_RETLIST(pList2); }
void ring_vm_refmeta_isclass ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; ring_string_lower(cStr); pList = pVM->pClassesMap ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_CLASSMAP_CLASSNAME),cStr) == 0 ) { RING_API_RETNUMBER(1); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_parser_icg_deletelastoperation ( Parser *pParser ) { if ( ring_list_getsize(pParser->GenCode) > 0 ) { ring_list_deleteitem(pParser->GenCode,ring_list_getsize(pParser->GenCode)); pParser->ActiveGenCodeList = ring_list_getlist(pParser->GenCode,ring_list_getsize(pParser->GenCode)); } }
void ring_parser_loadtoken ( Parser *pParser ) { List *pList ; assert(pParser != NULL); pList = ring_list_getlist(pParser->Tokens,pParser->ActiveToken); pParser->TokenType = ring_list_getint(pList,1) ; pParser->TokenText = ring_list_getstring(pList,2) ; }
void ring_vm_refmeta_addmethod ( void *pPointer ) { List *pList, *pList2, *pList3 ; char *cStr ; int x ; VM *pVM ; /* Parameters : Object, MethodName, Anonymous Function */ pVM = (VM *) pPointer ; if ( RING_API_PARACOUNT != 3 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) && RING_API_ISSTRING(2) && RING_API_ISSTRING(3) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = (List *) ring_list_getlist(pList,RING_OBJECT_CLASSPOINTER); pList = (List *) ring_list_getlist(pList,RING_CLASSMAP_METHODSLIST); cStr = RING_API_GETSTRING(3); ring_string_lower(cStr); for ( x = 1 ; x <= ring_list_getsize(pVM->pFunctionsMap) ; x++ ) { pList2 = ring_list_getlist(pVM->pFunctionsMap,x); if ( strcmp(ring_list_getstring(pList2,RING_FUNCMAP_NAME),cStr) == 0 ) { /* Add new list to the class methods list */ pList3 = ring_list_newlist(pList); /* Copy function to class methods */ ring_list_copy(pList3,pList2); /* Set the Function Name */ ring_list_setstring(pList3,RING_FUNCMAP_NAME,ring_string_lower(RING_API_GETSTRING(2))); /* Refresh the HashTable */ ring_list_genhashtable2(pList); RING_API_RETNUMBER(1); return ; } } } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } RING_API_RETNUMBER(0); }
void ring_vm_newvar ( VM *pVM,const char *cStr ) { List *pList ; assert(pVM->pActiveMem); pList = ring_vm_newvar2(cStr,pVM->pActiveMem); pVM->nSP++ ; RING_VM_STACK_SETPVALUE(pList); RING_VM_STACK_OBJTYPE = RING_OBJTYPE_VARIABLE ; /* Set the scope of the new variable */ if ( (ring_list_getsize(pVM->pMem) == 1) && (pVM->pActiveMem == ring_list_getlist(pVM->pMem,RING_MEMORY_GLOBALSCOPE)) ) { pVM->nVarScope = RING_VARSCOPE_GLOBAL ; } else if ( pVM->pActiveMem == ring_list_getlist(pVM->pMem,ring_list_getsize(pVM->pMem)) ) { pVM->nVarScope = RING_VARSCOPE_LOCAL ; } else { pVM->nVarScope = RING_VARSCOPE_NOTHING ; } /* Add Scope to aLoadAddressScope */ ring_list_addint(pVM->aLoadAddressScope,pVM->nVarScope); }
List * ring_vm_newtempvar2 ( VM *pVM,const char *cStr,List *pList3 ) { List *pList,*pList2 ; pList = ring_vm_newvar2(cStr,pVM->pTempMem); ring_list_setint(pList,RING_VAR_TYPE,RING_VM_LIST); ring_list_setlist(pList,RING_VAR_VALUE); pList2 = ring_list_getlist(pList,RING_VAR_VALUE); ring_list_deleteallitems(pList2); ring_list_copy(pList2,pList3); return pList ; }
void ring_vm_refmeta_setattribute ( void *pPointer ) { List *pList ; char *cStr ; int x ; if ( RING_API_PARACOUNT != 3 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) && RING_API_ISSTRING(2) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = ring_list_getlist(pList,RING_OBJECT_OBJECTDATA); cStr = RING_API_GETSTRING(2) ; ring_string_lower(cStr); for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { if ( strcmp(ring_list_getstring(ring_list_getlist(pList,x),RING_VAR_NAME),cStr) == 0 ) { pList = ring_list_getlist(pList,x) ; if ( RING_API_ISNUMBER(3) ) { ring_list_setdouble(pList,RING_VAR_VALUE,RING_API_GETNUMBER(3)); } else if ( RING_API_ISSTRING(3) ) { ring_list_setstring2(pList,RING_VAR_VALUE,RING_API_GETSTRING(3),RING_API_GETSTRINGSIZE(3)); } else if ( RING_API_ISLIST(3) ) { ring_list_setlist(pList,RING_VAR_VALUE); pList = ring_list_getlist(pList,RING_VAR_VALUE); ring_list_deleteallitems(pList); ring_list_copy(pList,RING_API_GETLIST(3)); } return ; } } RING_API_ERROR("Error : Property is not found!"); } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_objfile_writelist ( List *pList,FILE *fObj ) { List *pList2 ; int x,x2 ; char *cString ; char cKey[11] ; strcpy(cKey,"ringstring"); fprintf( fObj , "{\n" ) ; /* Write List Items */ for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); fprintf( fObj , "[T]\n" ) ; for ( x2 = 1 ; x2 <= ring_list_getsize(pList2) ; x2++ ) { if ( ring_list_isstring(pList2,x2) ) { fprintf( fObj , "[S][%d]" , ring_list_getstringsize(pList2,x2) ) ; /* Encrypt String */ cString = ring_list_getstring(pList2,x2) ; ring_objfile_xorstring(cString,ring_list_getstringsize(pList2,x2),cKey,10); fwrite( ring_list_getstring(pList2,x2) , 1 , ring_list_getstringsize(pList2,x2) , fObj ); /* Decrypt String */ ring_objfile_xorstring(cString,ring_list_getstringsize(pList2,x2),cKey,10); fprintf( fObj , "\n" ) ; } else if ( ring_list_isint(pList2,x2) ) { fprintf( fObj , "[I]%d\n" , ring_list_getint(pList2,x2) ) ; } else if ( ring_list_isdouble(pList2,x2) ) { fprintf( fObj , "[D]%f\n" , ring_list_getdouble(pList2,x2) ) ; } else if ( ring_list_ispointer(pList2,x2) ) { fprintf( fObj , "[P]%p\n" , (void *) ring_list_getpointer(pList2,x2) ) ; } else if ( ring_list_islist(pList2,x2) ) { fprintf( fObj , "[L]\n" ) ; ring_objfile_writelist(ring_list_getlist(pList2,x2) ,fObj); } } fprintf( fObj , "[E]\n" ) ; } fprintf( fObj , "}\n" ) ; }
void ring_vm_refmeta_cfunctions ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; pVM = (VM *) pPointer ; pList = RING_API_NEWLIST ; for ( x = 1 ; x <= ring_list_getsize(pVM->pCFunctionsList) ; x++ ) { pList2 = ring_list_getlist(pVM->pCFunctionsList,x); ring_list_addstring(pList,ring_list_getstring(pList2,RING_FUNCMAP_NAME)); } RING_API_RETLIST(pList); }
void ring_vm_refmeta_classes ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; pVM = (VM *) pPointer ; pList = RING_API_NEWLIST ; for ( x = 1 ; x <= ring_list_getsize(pVM->pClassesMap) ; x++ ) { pList2 = ring_list_getlist(pVM->pClassesMap,x); ring_list_addstring(pList,ring_list_getstring(pList2,RING_CLASSMAP_CLASSNAME)); } RING_API_RETLIST(pList); }
void ring_vm_gc_checkreferences ( VM *pVM ) { int x ; List *pList, *pList2 ; Item *pItem ; /* Check References (Called when we delete a scope) */ pList = ring_list_getlist(pVM->pMem,ring_list_getsize(pVM->pMem)); for ( x = ring_list_getsize(pList) ; x >= 1 ; x-- ) { pList2 = ring_list_getlist(pList,x); if ( ring_list_getsize(pList2) == RING_VAR_LISTSIZE ) { if ( ring_list_getint(pList2,RING_VAR_TYPE) == RING_VM_POINTER ) { if ( ring_list_getint(pList2,RING_VAR_PVALUETYPE) == RING_OBJTYPE_LISTITEM ) { pItem = (Item *) ring_list_getpointer(pList2,RING_VAR_VALUE) ; #if GCLog printf( "GC CheckReferences - Free Memory %p \n",pItem ) ; #endif ring_item_delete_gc(pVM->pRingState,pItem); } } } } }
void ring_vm_deletescope ( VM *pVM ) { if ( ring_list_getsize(pVM->pMem) < 2 ) { puts("Internal Error - Deleting scope while no scope! "); exit(0); } /* Check References */ ring_vm_gc_checkreferences(pVM); ring_list_deleteitem(pVM->pMem,ring_list_getsize(pVM->pMem)); pVM->pActiveMem = ring_list_getlist(pVM->pMem,ring_list_getsize(pVM->pMem)); /* Delete Local Scope information */ ring_list_deleteitem(pVM->aScopeID,ring_list_getsize(pVM->aScopeID)); pVM->nActiveScopeID = ring_list_getint(pVM->aScopeID,ring_list_getsize(pVM->aScopeID)) ; }
void ring_vm_addnewcpointervar ( VM *pVM,const char *cStr,void *pPointer,const char *cStr2 ) { List *pList, *pList2 ; pList = ring_vm_newvar2(cStr,pVM->pActiveMem); ring_list_setint(pList,RING_VAR_TYPE,RING_VM_LIST); ring_list_setlist(pList,RING_VAR_VALUE); pList2 = ring_list_getlist(pList,RING_VAR_VALUE); /* Add Pointer */ ring_list_addpointer(pList2,pPointer); /* Add Type */ ring_list_addstring(pList2,cStr2); /* Add Status Number */ ring_list_addint(pList2,RING_CPOINTERSTATUS_NOTCOPIED); }
void ring_vm_savestate2 ( VM *pVM,List *pList ) { List *pThis ; /* Save State */ ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pExitMark)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pLoopMark)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pTry)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aBraceObjects)); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pBraceObject); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pObjState)); ring_list_addint_gc(pVM->pRingState,pList,pVM->nInsideBraceFlag); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aForStep)); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pActiveMem); ring_list_addint_gc(pVM->pRingState,pList,pVM->nFuncExecute2); pVM->nInsideBraceFlag = 0 ; /* Save BlockFlag */ ring_list_addint_gc(pVM->pRingState,pList,pVM->nBlockFlag); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->aPCBlockFlag); pVM->nBlockFlag = 0 ; pVM->aPCBlockFlag = ring_list_new_gc(pVM->pRingState,0); /* Save nPrivateFlag, set it to 0 (public not private) */ ring_list_addint_gc(pVM->pRingState,pList,pVM->nPrivateFlag); pVM->nPrivateFlag = 0 ; /* Save nCallClassInit */ ring_list_addint_gc(pVM->pRingState,pList,pVM->nCallClassInit); pVM->nCallClassInit = 0 ; ring_list_addint_gc(pVM->pRingState,pList,pVM->nFuncExecute); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pAssignment); ring_list_addint_gc(pVM->pRingState,pList,pVM->nInClassRegion); ring_list_addint_gc(pVM->pRingState,pList,pVM->nActiveScopeID); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aScopeNewObj)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aScopeID)); ring_list_addint_gc(pVM->pRingState,pList,pVM->nLineNumber); ring_list_addint_gc(pVM->pRingState,pList,pVM->nBeforeEqual); ring_list_addint_gc(pVM->pRingState,pList,pVM->nNOAssignment); ring_list_addint_gc(pVM->pRingState,pList,pVM->nGetSetProperty); ring_list_addint_gc(pVM->pRingState,pList,pVM->nGetSetObjType); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pGetSetObject); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->aLoadAddressScope); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pLoadAddressScope)); /* Save This variable */ pThis = ring_list_getlist(ring_vm_getglobalscope(pVM),RING_VM_STATICVAR_THIS) ; ring_list_addpointer_gc(pVM->pRingState,pList,ring_list_getpointer(pThis,RING_VAR_VALUE)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getint(pThis,RING_VAR_PVALUETYPE)); ring_list_addint_gc(pVM->pRingState,pList,pVM->nCurrentGlobalScope); pVM->nInClassRegion = 0 ; pVM->pAssignment = NULL ; pVM->nNOAssignment = 0 ; }
void ring_vm_refmeta_attributes ( void *pPointer ) { List *pList, *pList2 ; int x ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = ring_list_getlist(pList,RING_OBJECT_OBJECTDATA); pList2 = RING_API_NEWLIST ; for ( x = 3 ; x <= ring_list_getsize(pList) ; x++ ) { ring_list_addstring(pList2,ring_list_getstring(ring_list_getlist(pList,x),RING_VAR_NAME)); } RING_API_RETLIST(pList2); } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_savestate ( VM *pVM,List *pList ) { List *pThis ; pList = ring_list_newlist_gc(pVM->pRingState,pList); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pMem)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pFuncCallList)); ring_list_addint_gc(pVM->pRingState,pList,pVM->nFuncExecute); ring_list_addint_gc(pVM->pRingState,pList,pVM->nSP); ring_list_addint_gc(pVM->pRingState,pList,pVM->nFuncSP); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pObjState)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aBraceObjects)); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pBraceObject); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->cFileName); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aPCBlockFlag)); ring_list_addint_gc(pVM->pRingState,pList,pVM->nBlockFlag); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aScopeNewObj)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aActivePackage)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aScopeID)); ring_list_addint_gc(pVM->pRingState,pList,pVM->nActiveScopeID); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pExitMark)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pLoopMark)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pTry)); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pActiveMem); ring_list_addint_gc(pVM->pRingState,pList,pVM->nListStart); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pNestedLists); ring_list_addint_gc(pVM->pRingState,pList,pVM->nInsideBraceFlag); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aForStep)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->aBeforeObjState)); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->aPCBlockFlag); ring_list_addint_gc(pVM->pRingState,pList,pVM->nLineNumber); ring_list_addint_gc(pVM->pRingState,pList,pVM->nInClassRegion); ring_list_addint_gc(pVM->pRingState,pList,pVM->nPrivateFlag); ring_list_addint_gc(pVM->pRingState,pList,pVM->nGetSetProperty); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pGetSetObject); ring_list_addint_gc(pVM->pRingState,pList,pVM->nGetSetObjType); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->pAssignment); ring_list_addint_gc(pVM->pRingState,pList,pVM->nBeforeEqual); ring_list_addint_gc(pVM->pRingState,pList,pVM->nNOAssignment); ring_list_addint_gc(pVM->pRingState,pList,pVM->nFuncExecute2); ring_list_addint_gc(pVM->pRingState,pList,pVM->nCallClassInit); ring_list_addpointer_gc(pVM->pRingState,pList,pVM->aLoadAddressScope); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getsize(pVM->pLoadAddressScope)); /* Save This variable */ pThis = ring_list_getlist(ring_vm_getglobalscope(pVM),RING_VM_STATICVAR_THIS) ; ring_list_addpointer_gc(pVM->pRingState,pList,ring_list_getpointer(pThis,RING_VAR_VALUE)); ring_list_addint_gc(pVM->pRingState,pList,ring_list_getint(pThis,RING_VAR_PVALUETYPE)); ring_list_addint_gc(pVM->pRingState,pList,pVM->nCurrentGlobalScope); }
void ring_parser_icg_showoutput ( List *pListGenCode,int nStatus ) { int x,y,nCount,nCount2 ; List *pList ; assert(pListGenCode != NULL); /* Header */ printf( "\n\n" ) ; ring_print_line(); if ( nStatus == 1 ) { puts("Byte Code - Before Execution by the VM"); } else { puts("Byte Code - After Execution by the VM"); } ring_print_line(); nCount = ring_list_getsize(pListGenCode); if ( nCount > 0 ) { printf( "\n %6s %10s %10s\n", "PC","OPCode","Data" ) ; for ( x = 1 ; x <= nCount ; x++ ) { pList = ring_list_getlist(pListGenCode,x); nCount2 = ring_list_getsize(pList); printf( "\n %6d %10s ", x , RING_IC_OP[ring_list_getint(pList,1)] ) ; if ( nCount2 > 1 ) { for ( y = 2 ; y <= nCount2 ; y++ ) { if ( ring_list_isstring(pList,y) ) { printf( " %5s ",ring_list_getstring(pList,y) ) ; } else if ( ring_list_isnumber(pList,y) ) { if ( ring_list_isdouble(pList,y) ) { printf( " %f",ring_list_getdouble(pList,y) ) ; } else { printf( " %5d ",ring_list_getint(pList,y) ) ; } } else { printf( " %5p ",ring_list_getpointer(pList,y) ) ; } } } } printf( "\n" ) ; } /* End */ puts(""); ring_print_line(); puts(""); }
void ring_vm_restorestate2 ( VM *pVM,List *pList,int x ) { List *pThis ; /* Restore State */ ring_vm_backstate(pVM,ring_list_getint(pList,x),pVM->pExitMark); ring_vm_backstate(pVM,ring_list_getint(pList,x+1),pVM->pLoopMark); ring_vm_backstate(pVM,ring_list_getint(pList,x+2),pVM->pTry); ring_vm_backstate(pVM,ring_list_getint(pList,x+3),pVM->aBraceObjects); pVM->pBraceObject = (List *) ring_list_getpointer(pList,x+4) ; ring_vm_backstate(pVM,ring_list_getint(pList,x+5),pVM->pObjState); pVM->nInsideBraceFlag = ring_list_getint(pList,x+6) ; ring_vm_backstate(pVM,ring_list_getint(pList,x+7),pVM->aForStep); pVM->pActiveMem = (List *) ring_list_getpointer(pList,x+8) ; pVM->nFuncExecute2 = ring_list_getint(pList,x+9) ; /* Restore BlockFLag */ pVM->aPCBlockFlag = ring_list_delete_gc(pVM->pRingState,pVM->aPCBlockFlag); pVM->nBlockFlag = ring_list_getint(pList,x+10) ; pVM->aPCBlockFlag = (List *) ring_list_getpointer(pList,x+11) ; /* Restore nPrivateFlag */ pVM->nPrivateFlag = ring_list_getint(pList,x+12) ; /* Restore nCallClassInit */ pVM->nCallClassInit = ring_list_getint(pList,x+13) ; pVM->nFuncExecute = ring_list_getint(pList,x+14) ; pVM->pAssignment = (void *) ring_list_getpointer(pList,x+15) ; pVM->nInClassRegion = ring_list_getint(pList,x+16) ; pVM->nActiveScopeID = ring_list_getint(pList,x+17) ; ring_vm_backstate(pVM,ring_list_getint(pList,x+18),pVM->aScopeNewObj); ring_vm_backstate(pVM,ring_list_getint(pList,x+19),pVM->aScopeID); pVM->nLineNumber = ring_list_getint(pList,x+20) ; pVM->nBeforeEqual = ring_list_getint(pList,x+21) ; pVM->nNOAssignment = ring_list_getint(pList,x+22) ; pVM->nGetSetProperty = ring_list_getint(pList,x+23) ; pVM->nGetSetObjType = ring_list_getint(pList,x+24) ; pVM->pGetSetObject = (void *) ring_list_getpointer(pList,x+25) ; pVM->aLoadAddressScope = (List *) ring_list_getpointer(pList,x+26) ; ring_vm_backstate(pVM,ring_list_getint(pList,x+27),pVM->pLoadAddressScope); /* Restore global scope, Must be before this because this depend on it */ pVM->nCurrentGlobalScope = ring_list_getint(pList,x+30) ; /* Restore This variable */ pThis = ring_list_getlist(ring_vm_getglobalscope(pVM),RING_VM_STATICVAR_THIS) ; ring_list_setpointer_gc(pVM->pRingState,pThis,RING_VAR_VALUE,ring_list_getpointer(pList,x+28)); ring_list_setint_gc(pVM->pRingState,pThis,RING_VAR_PVALUETYPE,ring_list_getint(pList,x+29)); }
void ring_vm_restorestack ( VM *pVM,List *pList ) { int x ; List *pList2 ; pVM->nSP = 0 ; if ( ring_list_getsize(pList) == 0 ) { return ; } for ( x = ring_list_getsize(pList) ; x >= 1 ; x-- ) { if ( ring_list_isstring(pList,x) ) { RING_VM_STACK_PUSHCVALUE(ring_list_getstring(pList,x)); } else if ( ring_list_isnumber(pList,x) ) { RING_VM_STACK_PUSHNVALUE(ring_list_getdouble(pList,x)); } else if ( ring_list_islist(pList,x) ) { pList2 = ring_list_getlist(pList,x); RING_VM_STACK_PUSHPVALUE(ring_list_getpointer(pList2,1)); RING_VM_STACK_OBJTYPE = ring_list_getint(pList2,2) ; } } }
void ring_vm_refmeta_addattribute ( void *pPointer ) { List *pList, *pList2 ; char *cStr ; int x ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = ring_list_getlist(pList,RING_OBJECT_OBJECTDATA); if ( RING_API_ISSTRING(2) ) { cStr = RING_API_GETSTRING(2) ; ring_string_lower(cStr); /* Create Variable List */ ring_vm_newvar2(cStr,pList); } else if ( RING_API_ISLIST(2) ) { pList2 = RING_API_GETLIST(2) ; for ( x = 1 ; x <= ring_list_getsize(pList2) ; x++ ) { if ( ring_list_isstring(pList2,x) ) { cStr = ring_list_getstring(pList2,x); ring_string_lower(cStr); /* Create Variable List */ ring_vm_newvar2(cStr,pList); } } } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_parser_icg_duplicate ( Parser *pParser,int nStart,int nEnd ) { List *pList,*pList2 ; int x ; #if RING_SHOWIC int y,nCount2 ; #endif assert(pParser != NULL); if ( (nStart <= nEnd) && ( nEnd <= ring_parser_icg_instructionscount(pParser) ) ) { for ( x = nStart ; x <= nEnd ; x++ ) { pList = ring_list_newlist(pParser->GenCode); pList2 = ring_list_getlist(pParser->GenCode,x); ring_list_copy(pList,pList2); #if RING_SHOWIC nCount2 = ring_list_getsize(pList); printf( "\n %6d [ %s ] ", ring_list_getsize(pParser->GenCode) , RING_IC_OP[ring_list_getint(pList,1)] ) ; if ( nCount2 > 1 ) { for ( y = 2 ; y <= nCount2 ; y++ ) { if ( ring_list_isstring(pList,y) ) { printf( " Operand : %s ",ring_list_getstring(pList,y) ) ; } else if ( ring_list_isnumber(pList,y) ) { if ( ring_list_isdouble(pList,y) ) { printf( " Operand : %f ",ring_list_getdouble(pList,y) ) ; } else { printf( " Operand : %5d ",ring_list_getint(pList,y) ) ; } } else { printf( " Operand : %5p ",ring_list_getpointer(pList,y) ) ; } } } #endif } } }