+ ret = AST_ExecuteNode_BinOp(Block->Script, Node, Node->Type, op1, op2);
+
+ // Free intermediate objects
+ SpiderScript_DereferenceValue(op1);
+ SpiderScript_DereferenceValue(op2);
+ break;
+
+ //default:
+ // ret = NULL;
+ // AST_RuntimeError(Node, "BUG - SpiderScript AST_ExecuteNode Unimplemented %i", Node->Type);
+ // break;
+ }
+_return:
+ // Reset namespace when no longer needed
+ if( Node->Type != NODETYPE_SCOPE )
+ Block->CurNamespace = NULL;
+
+ #if TRACE_NODE_RETURNS
+ if(ret && ret != ERRPTR) {
+ AST_RuntimeError(Node, "Ret type of %p %i is %i", Node, Node->Type, ret->Type);
+ }
+ else {
+ AST_RuntimeError(Node, "Ret type of %p %i is %p", Node, Node->Type, ret);
+ }
+ #endif
+
+ return ret;
+}
+
+tSpiderValue *AST_ExecuteNode_UniOp(tSpiderScript *Script, tAST_Node *Node, int Operation, tSpiderValue *Value)
+{
+ tSpiderValue *ret;
+ #if 0
+ if( Value->Type == SS_DATATYPE_OBJECT )
+ {
+ const char *fcnname;
+ switch(Operation)
+ {
+ case NODETYPE_NEGATE: fcnname = "-ve"; break;
+ case NODETYPE_BWNOT: fcnname = "~"; break;
+ default: fcnname = NULL; break;
+ }
+
+ if( fcnname )
+ {
+ ret = Object_ExecuteMethod(Value->Object, fcnname, );
+ if( ret != ERRPTR )
+ return ret;
+ }
+ }
+ #endif
+ switch(Value->Type)
+ {
+ // Integer Operations
+ case SS_DATATYPE_INTEGER:
+ if( Value->ReferenceCount == 1 )
+ SpiderScript_ReferenceValue(ret = Value);
+ else
+ ret = SpiderScript_CreateInteger(0);
+ switch(Operation)
+ {
+ case NODETYPE_NEGATE: ret->Integer = -Value->Integer; break;
+ case NODETYPE_BWNOT: ret->Integer = ~Value->Integer; break;
+ default:
+ AST_RuntimeError(Node, "SpiderScript internal error: Exec,UniOP,Integer unknown op %i", Operation);
+ SpiderScript_DereferenceValue(ret);
+ ret = ERRPTR;
+ break;
+ }
+ break;
+ // Real number Operations
+ case SS_DATATYPE_REAL:
+ switch(Operation)
+ {
+ case NODETYPE_NEGATE: ret = SpiderScript_CreateInteger( -Value->Real ); break;
+ default:
+ AST_RuntimeError(Node, "SpiderScript internal error: Exec,UniOP,Real unknown op %i", Operation);
+ ret = ERRPTR;
+ break;
+ }
+ break;
+
+ default:
+ AST_RuntimeError(NULL, "Invalid operation (%i) on type (%i)", Operation, Value->Type);
+ ret = ERRPTR;
+ break;
+ }
+
+ return ret;
+}
+
+tSpiderValue *AST_ExecuteNode_BinOp(tSpiderScript *Script, tAST_Node *Node, int Operation, tSpiderValue *Left, tSpiderValue *Right)
+{
+ tSpiderValue *preCastValue = Right;
+ tSpiderValue *ret;
+
+ // Convert types
+ if( Left && Right && Left->Type != Right->Type )
+ {
+ #if 0
+ // Object types
+ // - Operator overload functions
+ if( Left->Type == SS_DATATYPE_OBJECT )
+ {
+ const char *fcnname;
+ switch(Operation)