/*! * Emit an assignment statement. */ void LLVMGenerator::emitStatement(const parser::statements::AssignmentStatement* statement) { Value* rhsVal = getExpressionValue(statement->getRHS()); // A regular variable expression. if(statement->getLHS()->getExpressionType() == Expression::Type::Variable) { VariableExpression* varExpr = (VariableExpression*)statement->getLHS(); Value* lhsVal = getOrCreateVariablePointer(varExpr->getVariableName()); m_primitiveHelper->emitCopy(lhsVal, rhsVal, getCurrentBBlock()); } else if(statement->getLHS()->getExpressionType() == Expression::Type::ArrayIndex) { ArrayIndexExpression* arrayExpr = (ArrayIndexExpression*)statement->getLHS(); // Expression is trying to index an item in a function return type or something. if(arrayExpr->getArray()->getExpressionType() != Expression::Type::Variable) { throw std::runtime_error("you can only assign values to arrays which are stored in user variables"); } Value* arrayVal = getOrCreateVariablePointer(((VariableExpression*)arrayExpr->getArray())->getVariableName()); Value* keyVal = getExpressionValue(arrayExpr->getIndex()); m_primitiveHelper->emitSetElement(arrayVal, keyVal, rhsVal, getCurrentBBlock()); } else { throw std::runtime_error("only variables (or variable array index expressions) may be the target of an assignment"); } }