X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibspiderscript.so_src%2Fmain.c;h=6ebd277973ad75e8618e004d9f3287b8ae8c6974;hb=ec4d050568da0f3f18a20969bd118b5c67f03ee2;hp=a6b1bde53cd0f255b6f9de90ac9fa41541f1b91c;hpb=6a945643557084578509e149c84cf5dde3c59c3c;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libspiderscript.so_src/main.c b/Usermode/Libraries/libspiderscript.so_src/main.c index a6b1bde5..6ebd2779 100644 --- a/Usermode/Libraries/libspiderscript.so_src/main.c +++ b/Usermode/Libraries/libspiderscript.so_src/main.c @@ -10,10 +10,10 @@ // === IMPORTS === extern tAST_Script *Parse_Buffer(tSpiderVariant *Variant, char *Buffer); -extern const int giSpiderScript_NumExports; -extern tSpiderFunction gaSpiderScript_Exports[]; +extern tSpiderFunction *gpExports_First; extern tAST_Variable *Variable_Define(tAST_BlockState *Block, int Type, const char *Name); extern void Variable_SetValue(tAST_BlockState *Block, const char *Name, tSpiderValue *Value); +extern void Variable_Destroy(tAST_Variable *Variable); // === CODE === /** @@ -29,16 +29,21 @@ int SoMain() */ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filename) { + char cacheFilename[strlen(Filename)+6+1]; char *data; int fLen; FILE *fp; tSpiderScript *ret; + strcpy(cacheFilename, Filename); + strcat(cacheFilename, ".cache"); + fp = fopen(Filename, "r"); if( !fp ) { return NULL; } + // Create the script ret = malloc(sizeof(tSpiderScript)); ret->Variant = Variant; @@ -64,6 +69,25 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen free(data); + + // HACK!! + { + size_t size; + + printf("Total Size: "); fflush(stdout); + size = AST_WriteScript(NULL, ret->Script); + printf("0x%x bytes\n", (unsigned)size); + + fp = fopen(cacheFilename, "wb"); + if(!fp) return ret; + + data = malloc(size); + AST_WriteScript(data, ret->Script); + fwrite(data, size, 1, fp); + free(data); + fclose(fp); + } + return ret; } @@ -78,7 +102,6 @@ tSpiderValue *SpiderScript_ExecuteMethod(tSpiderScript *Script, const char *Function, int NArguments, tSpiderValue **Arguments) { char *trueName = NULL; - int i; int bFound = 0; // Used to keep nesting levels down tSpiderValue *ret = ERRPTR; @@ -107,7 +130,8 @@ tSpiderValue *SpiderScript_ExecuteMethod(tSpiderScript *Script, // Execute! if(fcn) { tAST_BlockState bs; - bs.FirstVar = NULL; //< TODO: Parameters + bs.FirstVar = NULL; + bs.RetVal = NULL; bs.Parent = NULL; bs.Script = Script; { @@ -122,22 +146,33 @@ tSpiderValue *SpiderScript_ExecuteMethod(tSpiderScript *Script, } } ret = AST_ExecuteNode(&bs, fcn->Code); + Object_Dereference(ret); + ret = bs.RetVal; bFound = 1; + + while(bs.FirstVar) + { + tAST_Variable *nextVar = bs.FirstVar->Next; + Variable_Destroy( bs.FirstVar ); + bs.FirstVar = nextVar; + } } } - + // Didn't find it in script? if(!bFound) - { + { + tSpiderFunction *fcn; // Second: Search the variant's exports - for( i = 0; i < Script->Variant->NFunctions; i ++ ) + for( fcn = Script->Variant->Functions; fcn; fcn = fcn->Next ) { - if( strcmp( Script->Variant->Functions[i].Name, trueName) == 0 ) + if( strcmp( fcn->Name, trueName ) == 0 ) break; } // Execute! - if(i < Script->Variant->NFunctions) { - ret = Script->Variant->Functions[i].Handler( Script, NArguments, Arguments ); + if(fcn) { + // TODO: Type Checking + ret = fcn->Handler( Script, NArguments, Arguments ); bFound = 1; } } @@ -145,14 +180,16 @@ tSpiderValue *SpiderScript_ExecuteMethod(tSpiderScript *Script, // Not in variant exports? Search the language internal ones if(!bFound) { - for( i = 0; i < giSpiderScript_NumExports; i ++ ) + tSpiderFunction *fcn; + // Third: Search language exports + for( fcn = gpExports_First; fcn; fcn = fcn->Next ) { - if( strcmp( gaSpiderScript_Exports[i].Name, trueName ) == 0 ) + if( strcmp( fcn->Name, trueName ) == 0 ) break; } // Execute! - if(i < giSpiderScript_NumExports) { - ret = gaSpiderScript_Exports[i].Handler( Script, NArguments, Arguments ); + if(fcn) { + ret = fcn->Handler( Script, NArguments, Arguments ); bFound = 1; } } @@ -180,7 +217,9 @@ void SpiderScript_Free(tSpiderScript *Script) tAST_Node *var, *nextVar; // Free functions - while(fcn) { + while(fcn) + { + AST_FreeNode( fcn->Code ); var = fcn->Arguments;