+int BC_SaveValue(tAST_BlockInfo *Block, tAST_Node *DestNode)
+{
+ int ret;
+ switch(DestNode->Type)
+ {
+ // Variable, simple
+ case NODETYPE_VARIABLE:
+ ret = BC_Variable_SetValue( Block, DestNode );
+ break;
+ // Array index
+ case NODETYPE_INDEX:
+ ret = AST_ConvertNode(Block, DestNode->BinOp.Left, 1); // Array
+ if(ret) return ret;
+ ret = AST_ConvertNode(Block, DestNode->BinOp.Right, 1); // Offset
+ if(ret) return ret;
+ Bytecode_AppendSetIndex( Block->Handle );
+ break;
+ // Object element
+ case NODETYPE_ELEMENT:
+ ret = AST_ConvertNode(Block, DestNode->Scope.Element, 1);
+ if(ret) return ret;
+ 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 ret;
+}
+