// === 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);
+extern void Variable_Destroy(tAST_Variable *Variable);
// === CODE ===
/**
*/
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;
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;
}
* \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] == '.' ) {
// Execute!
if(fcn) {
tAST_BlockState bs;
- bs.FirstVar = NULL; //< TODO: Parameters
+ bs.FirstVar = NULL;
+ bs.RetVal = NULL;
bs.Parent = NULL;
bs.Script = 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;
}
}
// 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;
}
}
tAST_Node *var, *nextVar;
// Free functions
- while(fcn) {
+ while(fcn)
+ {
+
AST_FreeNode( fcn->Code );
var = fcn->Arguments;