SpiderScript - Restructured to be able to keep bytecode and AST in memory at one...
[tpg/acess2.git] / Usermode / Libraries / libspiderscript.so_src / main.c
index 919a6f2..d6cd722 100644 (file)
@@ -6,10 +6,12 @@
 #include <stdio.h>
 #include <string.h>
 #include <spiderscript.h>
+#include "common.h"
 #include "ast.h"
+#include "bytecode_gen.h"
 
 // === IMPORTS ===
-extern tAST_Script     *Parse_Buffer(tSpiderVariant *Variant, char *Buffer);
+extern  int    Parse_Buffer(tSpiderScript *Script, const char *Buffer, const char *Filename);
 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);
@@ -50,21 +52,22 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen
        data = malloc(fLen + 1);
        if(!data)       return NULL;
        fLen = fread(data, 1, fLen, fp);
+       fclose(fp);
        if( fLen < 0 ) {
                free(data);
                return NULL;
        }
        data[fLen] = '\0';
        
-       fclose(fp);
        
        // Create the script
        ret = malloc(sizeof(tSpiderScript));
        ret->Variant = Variant;
+       ret->Functions = NULL;
+       ret->LastFunction = NULL;
        
        ret->CurNamespace = NULL;
-       ret->Script = Parse_Buffer(Variant, data);
-       if( ret->Script == NULL ) {
+       if( Parse_Buffer(ret, data, Filename) ) {
                free(data);
                free(ret);
                return NULL;
@@ -78,14 +81,14 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen
                size_t  size;
                
                printf("Total Size: "); fflush(stdout);
-               size = AST_WriteScript(NULL, ret->Script);
+               size = AST_WriteScript(NULL, ret);
                printf("0x%x bytes\n", (unsigned)size);
                
                fp = fopen(cacheFilename, "wb");
                if(!fp) return ret;
                
                data = malloc(size);
-               size = AST_WriteScript(data, ret->Script);
+               size = AST_WriteScript(data, ret);
                fwrite(data, size, 1, fp);
                free(data);
                fclose(fp);
@@ -94,36 +97,29 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen
        return ret;
 }
 
+int SpiderScript_SaveBytecode(tSpiderScript *Script, const char *DestFile)
+{
+       return Bytecode_ConvertScript(Script, DestFile);
+}
+
 /**
  * \brief Free a script
  */
 void SpiderScript_Free(tSpiderScript *Script)
 {
-       tAST_Function   *fcn = Script->Script->Functions;
-       tAST_Function   *nextFcn;
-       tAST_Node       *var, *nextVar;
+       tScript_Function        *fcn = Script->Functions;
+       tScript_Function        *nextFcn;
        
        // Free functions
        while(fcn)
        {
-               
-               AST_FreeNode( fcn->Code );
-               
-               var = fcn->Arguments;
-               while(var)
-               {
-                       nextVar = var->NextSibling;
-                       AST_FreeNode( var );
-                       var = nextVar;
-               }
-               
+               if(fcn->ASTFcn) AST_FreeNode( fcn->ASTFcn );
+               if(fcn->BCFcn)  Bytecode_DeleteFunction( fcn->BCFcn );
+
                nextFcn = fcn->Next;
                free( fcn );
                fcn = nextFcn;
        }
        
-       // TODO: Pass this off to AST for a proper cleanup
-       free(Script->Script);
-       
        free(Script);
 }

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