X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibspiderscript.so_src%2Fmain.c;h=106ce232039eb55f95cb6df4048ee7192c580d95;hb=46f48de954dc7e7a5b30c50ecb851cc26d5c1ce0;hp=e5c225ce425640e2798f2bcba574d755a126c0e4;hpb=1529dadb6c2170bf9899fbde46d06a3d9a392b52;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libspiderscript.so_src/main.c b/Usermode/Libraries/libspiderscript.so_src/main.c index e5c225ce..106ce232 100644 --- a/Usermode/Libraries/libspiderscript.so_src/main.c +++ b/Usermode/Libraries/libspiderscript.so_src/main.c @@ -10,10 +10,9 @@ // === 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, tSpiderObject *Value); +extern void Variable_SetValue(tAST_BlockState *Block, const char *Name, tSpiderValue *Value); // === CODE === /** @@ -39,6 +38,7 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen return NULL; } + // Create the script ret = malloc(sizeof(tSpiderScript)); ret->Variant = Variant; @@ -74,13 +74,12 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen * \param NArguments Number of arguments to pass * \param Arguments Arguments passed */ -tSpiderObject *SpiderScript_ExecuteMethod(tSpiderScript *Script, - const char *Function, int NArguments, tSpiderObject **Arguments) +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 - tSpiderObject *ret = ERRPTR; + tSpiderValue *ret = ERRPTR; // Handle namespaces if( Function[0] == '.' ) { @@ -107,7 +106,8 @@ tSpiderObject *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 +122,26 @@ tSpiderObject *SpiderScript_ExecuteMethod(tSpiderScript *Script, } } ret = AST_ExecuteNode(&bs, fcn->Code); + Object_Dereference(ret); + ret = bs.RetVal; bFound = 1; } } - + // 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 +149,16 @@ tSpiderObject *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; } }