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 20554f5..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);
@@ -42,10 +44,6 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen
                return NULL;
        }
        
-       // Create the script
-       ret = malloc(sizeof(tSpiderScript));
-       ret->Variant = Variant;
-       
        fseek(fp, 0, SEEK_END);
        fLen = ftell(fp);
        fseek(fp, 0, SEEK_SET);
@@ -53,14 +51,23 @@ tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filen
        // Allocate and read data
        data = malloc(fLen + 1);
        if(!data)       return NULL;
-       fread(data, fLen, 1, fp);
+       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;
@@ -74,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);
@@ -90,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