+ if(ret == ERRPTR) return ERRPTR;
+
+ // Perform assignment operation
+ if( Node->Assign.Operation != NODETYPE_NOP )
+ {
+ tSpiderValue *varVal, *value;
+
+ varVal = Variable_GetValue(Block, Node->Assign.Dest);
+ if(varVal == ERRPTR) return ERRPTR;
+ #if 0
+ #else
+ if(varVal && varVal->ReferenceCount == 2) {
+ SpiderScript_DereferenceValue(varVal);
+// printf("pre: (%s) varVal->ReferenceCount = %i\n",
+// Node->Assign.Dest->Variable.Name,
+// varVal->ReferenceCount);
+ }
+ #endif
+ value = AST_ExecuteNode_BinOp(Block->Script, Node, Node->Assign.Operation, varVal, ret);
+ if(value == ERRPTR) return ERRPTR;
+
+ if(ret) SpiderScript_DereferenceValue(ret);
+ #if 0
+ if(varVal) SpiderScript_DereferenceValue(varVal);
+ #else
+ if(varVal && varVal->ReferenceCount == 1) {
+ SpiderScript_ReferenceValue(varVal);
+// printf("post: varVal->ReferenceCount = %i\n", varVal->ReferenceCount);
+ break; // If varVal was non-null, it has been updated by _BinOp
+ }
+ #endif
+ // Else, it was NULL, so has to be assigned
+ ret = value;
+ }
+
+ // Set the variable value
+ if( Variable_SetValue( Block, Node->Assign.Dest, ret ) ) {
+ SpiderScript_DereferenceValue( ret );
+ return ERRPTR;
+ }
+ break;
+
+ // Post increment/decrement
+ case NODETYPE_POSTINC:
+ case NODETYPE_POSTDEC:
+ {
+ tSpiderValue *varVal, *value;
+ static tSpiderValue one = {
+ .Type = SS_DATATYPE_INTEGER,
+ .ReferenceCount = 1,
+ {.Integer = 1}
+ };
+
+ // TODO: Support assigning to object attributes
+ if( Node->UniOp.Value->Type != NODETYPE_VARIABLE ) {
+ AST_RuntimeError(Node, "LVALUE of assignment is not a variable");
+ return ERRPTR;
+ }
+
+ // Get values (current variable contents and a static one)
+ varVal = Variable_GetValue(Block, Node->UniOp.Value);
+
+ if( Node->Type == NODETYPE_POSTDEC )
+ value = AST_ExecuteNode_BinOp(Block->Script, Node, NODETYPE_SUBTRACT, varVal, &one);
+ else
+ value = AST_ExecuteNode_BinOp(Block->Script, Node, NODETYPE_ADD, varVal, &one);
+ if( value == ERRPTR )
+ return ERRPTR;
+
+ ret = varVal;
+
+ if( Variable_SetValue( Block, Node->UniOp.Value, value ) ) {
+ SpiderScript_DereferenceValue( ret );
+ return ERRPTR;
+ }
+ SpiderScript_DereferenceValue( value );
+ }