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); } }
int ring_parser_start ( List *pTokens,RingState *pRingState ) { Parser *pParser ; int nResult,RingActiveFile ; pParser = ring_parser_new(pTokens,pRingState); #if RING_PARSERSTART /* Parse Tokens */ ring_parser_nexttoken(pParser); do { nResult = ring_parser_class(pParser); if ( nResult == 0 ) { ring_parser_error(pParser,""); /* Important check to avoid missing the line number counter */ if ( ring_parser_isendline(pParser) == 0 ) { /* Move next trying to avoid the error */ ring_parser_nexttoken(pParser); } } } while (pParser->ActiveToken !=pParser->TokensCount) ; /* Display Errors Count */ RingActiveFile = ring_list_getsize(pParser->pRingState->pRingFilesStack); if ( pParser->nErrorsCount == 0 ) { #if RING_PARSERFINAL printf( "\n%s compiling done, no errors.\n",ring_list_getstring(pParser->pRingState->pRingFilesStack,RingActiveFile) ) ; #endif ring_parser_delete(pParser); return 1 ; } else { printf( "\n%s errors count : %d \n",ring_list_getstring(pParser->pRingState->pRingFilesStack,RingActiveFile),pParser->nErrorsCount ) ; } #endif ring_parser_delete(pParser); return 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) ; } } }
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_objfile_writefile ( RingState *pRingState ) { FILE *fObj; char cFileName[400] ; /* Create File */ sprintf( cFileName , "%so" , ring_list_getstring(pRingState->pRingFilesList,1) ) ; fObj = fopen(cFileName , "w+b" ); fprintf( fObj , "# Ring Object File\n" ) ; fprintf( fObj , "# Version 1.1\n" ) ; /* Write Functions Lists */ fprintf( fObj , "# Functions List\n" ) ; ring_objfile_writelist(pRingState->pRingFunctionsMap,fObj); /* Write Classes List */ fprintf( fObj , "# Classes List\n" ) ; ring_objfile_writelist(pRingState->pRingClassesMap,fObj); /* Write Packages */ fprintf( fObj , "# Packages List\n" ) ; ring_objfile_writelist(pRingState->pRingPackagesMap,fObj); /* Write Code */ fprintf( fObj , "# Program Code\n" ) ; ring_objfile_writelist(pRingState->pRingGenCode,fObj); /* Close File */ fprintf( fObj , "# End of File\n" ) ; fclose( fObj ) ; }
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); } }
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_iscfunction ( 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 = pVM->pCFunctionsList ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_FUNCMAP_NAME),cStr) == 0 ) { RING_API_RETNUMBER(1); 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_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_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_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_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_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_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_getattribute ( void *pPointer ) { List *pList ; char *cStr ; int x ; 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) ) { 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_list_isnumber(pList,RING_VAR_VALUE) ) { RING_API_RETNUMBER(ring_list_getdouble(pList,RING_VAR_VALUE)); } else if ( ring_list_isstring(pList,RING_VAR_VALUE) ) { RING_API_RETSTRING2(ring_list_getstring(pList,RING_VAR_VALUE),ring_list_getstringsize(pList,RING_VAR_VALUE)); } else if ( ring_list_islist(pList,RING_VAR_VALUE) ) { RING_API_RETLIST(ring_list_getlist(pList,RING_VAR_VALUE)); } 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_parser_error ( Parser *pParser,const char *cStr ) { int RingActiveFile ; ring_state_cgiheader(pParser->pRingState); RingActiveFile = ring_list_getsize(pParser->pRingState->pRingFilesStack); if ( pParser->nErrorLine != pParser->nLineNumber ) { pParser->nErrorLine = pParser->nLineNumber ; printf( "\n%s Line (%d) ",ring_list_getstring(pParser->pRingState->pRingFilesStack,RingActiveFile),pParser->nLineNumber ) ; pParser->nErrorsCount++ ; if ( strcmp(cStr,"") != 0 ) { printf( "%s",cStr ) ; } else { printf( "Syntax error" ) ; } return ; } else if ( strcmp(cStr,"") != 0 ) { pParser->nErrorsCount++ ; } if ( strcmp(cStr,"") != 0 ) { printf( "\n%s Line (%d) ",ring_list_getstring(pParser->pRingState->pRingFilesStack,RingActiveFile),pParser->nLineNumber ) ; printf( "%s",cStr ) ; } }
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_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_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_refmeta_classname ( void *pPointer ) { List *pList ; char *cStr ; 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) ) { cStr = ring_list_getstring((List *) ring_list_getpointer(pList,RING_OBJECT_CLASSPOINTER),RING_CLASSMAP_CLASSNAME); RING_API_RETSTRING(cStr); } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
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) ; }
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_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_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 } } }
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_objfile_updateclassespointers ( RingState *pRingState ) { int x,x2,x3,x4,lFound ; List *pList, *pList2, *pList3 ; const char *cString ; char cPackageName[400] ; char cClassName[400] ; /* Update Class Pointer in Code */ lFound = 0 ; for ( x = 1 ; x <= ring_list_getsize(pRingState->pRingGenCode) ; x++ ) { pList = ring_list_getlist(pRingState->pRingGenCode,x); if ( ring_list_getint(pList,1) == ICO_NEWCLASS ) { cString = ring_list_getstring(pList,2); for ( x2 = 1 ; x2 <= ring_list_getsize(pRingState->pRingClassesMap) ; x2++ ) { pList2 = ring_list_getlist(pRingState->pRingClassesMap,x2); if ( strcmp(cString,ring_list_getstring(pList2,1)) == 0 ) { lFound = 0 ; ring_list_setpointer(pList,3,pList2); #ifdef DEBUG_OBJFILE puts("Pointer Updated "); #endif break ; } } /* If we can't find the list (the class is inside a package) */ if ( lFound == 0 ) { ring_list_setpointer(pList,3,NULL); } } } /* ** Update Class Pointers in Classes Map when the class belong to a Package ** This updates works when the class name is : packagename.classname */ for ( x = 1 ; x <= ring_list_getsize(pRingState->pRingClassesMap) ; x++ ) { pList = ring_list_getlist(pRingState->pRingClassesMap,x); cString = ring_list_getstring(pList,1); if ( ring_list_getstringsize(pList,1) > 400 ) { /* Avoid large names - we have limits (400 letters per package name - 400 letters for class name) */ continue ; } for ( x2 = ring_list_getstringsize(pList,1) - 1 ; x2 >= 0 ; x2-- ) { if ( cString[x2] == '.' ) { /* ** Now we have a class name stored as packagename.classname ** Get Package Name */ for ( x3 = 0 ; x3 < x2 ; x3++ ) { cPackageName[x3] = cString[x3] ; } cPackageName[x2] = '\0' ; #ifdef DEBUG_OBJFILE printf( "Package Name %s \n ",cPackageName ) ; #endif /* Get Class Name */ for ( x3 = x2+1 ; x3 <= ring_list_getstringsize(pList,1) - 1 ; x3++ ) { cClassName[x3-x2-1] = cString[x3] ; } cClassName[ring_list_getstringsize(pList,1) - 1 - x2] = '\0' ; #ifdef DEBUG_OBJFILE printf( "Class Name %s \n ",cClassName ) ; #endif /* Get The Package List */ for ( x3 = 1 ; x3 <= ring_list_getsize(pRingState->pRingPackagesMap) ; x3++ ) { pList2 = ring_list_getlist(pRingState->pRingPackagesMap,x3); if ( strcmp(ring_list_getstring(pList2,1),cPackageName) == 0 ) { /* Get The Class List */ pList2 = ring_list_getlist(pList2,2); for ( x4 = 1 ; x4 <= ring_list_getsize(pList2) ; x4++ ) { pList3 = ring_list_getlist(pList2,x4); if ( strcmp(ring_list_getstring(pList3,1),cClassName) == 0 ) { /* Now We have the Class - Update Pointer */ ring_list_setpointer(pList,2,(void *) pList3); break ; } } break ; } } } } } }