SpiderScript - A day of debugging and improvements
[tpg/acess2.git] / Usermode / Libraries / libspiderscript.so_src / main.c
index a6b1bde..6ebd277 100644 (file)
 
 // === 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;

UCC git Repository :: git.ucc.asn.au