+int BC_SaveValue(tAST_BlockInfo *Block, tAST_Node *DestNode)
+{
+ int ret, type;
+ switch(DestNode->Type)
+ {
+ // Variable, simple
+ case NODETYPE_VARIABLE:
+ ret = BC_Variable_SetValue( Block, DestNode );
+ if(ret) return ret;
+ break;
+ // Array index
+ case NODETYPE_INDEX:
+ ret = AST_ConvertNode(Block, DestNode->BinOp.Left, 1); // Array
+ if(ret) return ret;
+ ret = _StackPop(Block, DestNode->BinOp.Left, SS_DATATYPE_UNDEF);
+ if(ret < 0) return -1;
+ if(ret != SS_DATATYPE_ARRAY && SS_GETARRAYDEPTH(ret) == 0) {
+ AST_RuntimeError(DestNode, "Type mismatch, Expected an array, got %i",
+ ret);
+ return -2;
+ }
+ type = SS_DOWNARRAY(ret);
+
+ ret = AST_ConvertNode(Block, DestNode->BinOp.Right, 1); // Offset
+ if(ret) return ret;
+ ret = _StackPop(Block, DestNode->BinOp.Right, SS_DATATYPE_INTEGER);
+ if(ret < 0) return -1;
+
+ Bytecode_AppendSetIndex( Block->Handle );
+ _StackPop(Block, DestNode, type);
+ break;
+ // Object element
+ case NODETYPE_ELEMENT:
+ ret = AST_ConvertNode(Block, DestNode->Scope.Element, 1);
+ if(ret) return ret;
+ ret = _StackPop(Block, DestNode->Scope.Element, SS_DATATYPE_OBJECT);
+ if(ret < 0) return -1;
+
+ Bytecode_AppendSetElement( Block->Handle, DestNode->Scope.Name );
+ break;
+ // Anything else
+ default:
+ // TODO: Support assigning to object attributes
+ AST_RuntimeError(DestNode, "Assignment target is not a LValue");
+ return -1;
+ }
+ return 0;