X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Usermode%2FLibraries%2Flibspiderscript.so_src%2Fmain.c;h=d6cd722e2ea0773e7ac894d816db9095e2789a9a;hb=239f2374299c1471a40b1087725b32f3f163d9b3;hp=20554f55fb362578023680976e5a3a23bb5527f2;hpb=5e007006d5b007c29268e4c949a8c9d472233257;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libspiderscript.so_src/main.c b/Usermode/Libraries/libspiderscript.so_src/main.c index 20554f55..d6cd722e 100644 --- a/Usermode/Libraries/libspiderscript.so_src/main.c +++ b/Usermode/Libraries/libspiderscript.so_src/main.c @@ -6,10 +6,12 @@ #include #include #include +#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); }