+ ret = SpiderScript_CreateObject(Block->Script,
+ ns,
+ Node->FunctionCall.Name,
+ Node->FunctionCall.NumArgs, params
+ );
+ }
+ else if( Node->Type == NODETYPE_METHODCALL )
+ {
+ tSpiderValue *obj = AST_ExecuteNode(Block, Node->FunctionCall.Object);
+ if( !obj || obj == ERRPTR || obj->Type != SS_DATATYPE_OBJECT ) {
+ AST_RuntimeError(Node->FunctionCall.Object,
+ "Type Mismatch - Required SS_DATATYPE_OBJECT for method call");
+ while(i--) SpiderScript_DereferenceValue(params[i]);
+ ret = ERRPTR;
+ break;
+ }
+ ret = SpiderScript_ExecuteMethod(Block->Script,
+ obj->Object, Node->FunctionCall.Name,
+ Node->FunctionCall.NumArgs, params
+ );
+ SpiderScript_DereferenceValue(obj);
+ }
+ else
+ {
+ ret = SpiderScript_ExecuteFunction(Block->Script,
+ ns, Node->FunctionCall.Name,
+ Node->FunctionCall.NumArgs, params
+ );
+ }
+
+
+ // Dereference parameters
+ while(i--) SpiderScript_DereferenceValue(params[i]);
+
+ // falls out
+ }
+ break;
+
+ // Conditional
+ case NODETYPE_IF:
+ ret = AST_ExecuteNode(Block, Node->If.Condition);
+ if( ret == ERRPTR ) break;
+ if( SpiderScript_IsValueTrue(ret) ) {
+ tmpobj = AST_ExecuteNode(Block, Node->If.True);
+ }
+ else {
+ tmpobj = AST_ExecuteNode(Block, Node->If.False);
+ }
+ SpiderScript_DereferenceValue(ret);
+ if( tmpobj == ERRPTR ) return ERRPTR;
+ SpiderScript_DereferenceValue(tmpobj);
+ ret = NULL;
+ break;
+
+ // Loop
+ case NODETYPE_LOOP:
+ // Initialise
+ ret = AST_ExecuteNode(Block, Node->For.Init);
+ if(ret == ERRPTR) break;
+
+ // Check initial condition
+ if( !Node->For.bCheckAfter )
+ {
+ SpiderScript_DereferenceValue(ret);
+
+ ret = AST_ExecuteNode(Block, Node->For.Condition);
+ if(ret == ERRPTR) return ERRPTR;
+ if(!SpiderScript_IsValueTrue(ret)) {
+ SpiderScript_DereferenceValue(ret);
+ ret = NULL;
+ break;
+ }
+ }
+
+ // Perform loop
+ for( ;; )
+ {
+ SpiderScript_DereferenceValue(ret);
+
+ // Code
+ ret = AST_ExecuteNode(Block, Node->For.Code);
+ if(ret == ERRPTR) return ERRPTR;
+ SpiderScript_DereferenceValue(ret);
+
+ if(Block->BreakTarget)
+ {
+ if( Block->BreakTarget[0] == '\0' || strcmp(Block->BreakTarget, Node->For.Tag) == 0 )
+ {
+ // Ours
+ free((void*)Block->BreakTarget); Block->BreakTarget = NULL;
+ if( Block->BreakType == NODETYPE_CONTINUE ) {
+ // Continue, just keep going