/*! * 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"); } }
void visit(Expression * node) { VariableExpression *expr = freecad_dynamic_cast<VariableExpression>(node); if (expr) { const App::ObjectIdentifier & oldPath = expr->getPath().canonicalPath(); const std::map<ObjectIdentifier, ObjectIdentifier>::const_iterator it = paths.find(oldPath); if (it != paths.end()) expr->setPath(it->second.relativeTo(owner)); } }
void visit(Expression * node) { VariableExpression *expr = freecad_dynamic_cast<VariableExpression>(node); if (expr) { if (expr->renameDocumentObject(oldName, newName)) { if (!changed) { aboutToSetValue(); ++changed; } } } }
/// Replace variables as needed void visit(VariableExpression& e) { VariablePtr vold(e.var()); OptimizerImplementation::VarMap::const_iterator v = p_vmap.find(vold->name()); BOOST_ASSERT(v != p_vmap.end()); VariablePtr vnew(v->second); BOOST_ASSERT(vold); BOOST_ASSERT(vnew); if (vold != vnew) { e.var(vnew); } }
void icinga::BindToScope(Expression *& expr, ScopeSpecifier scopeSpec) { DictExpression *dexpr = dynamic_cast<DictExpression *>(expr); if (dexpr) { for (Expression *& expr : dexpr->m_Expressions) BindToScope(expr, scopeSpec); return; } SetExpression *aexpr = dynamic_cast<SetExpression *>(expr); if (aexpr) { BindToScope(aexpr->m_Operand1, scopeSpec); return; } IndexerExpression *iexpr = dynamic_cast<IndexerExpression *>(expr); if (iexpr) { BindToScope(iexpr->m_Operand1, scopeSpec); return; } LiteralExpression *lexpr = dynamic_cast<LiteralExpression *>(expr); if (lexpr && lexpr->GetValue().IsString()) { Expression *scope = new GetScopeExpression(scopeSpec); expr = new IndexerExpression(scope, lexpr, lexpr->GetDebugInfo()); } VariableExpression *vexpr = dynamic_cast<VariableExpression *>(expr); if (vexpr) { Expression *scope = new GetScopeExpression(scopeSpec); Expression *new_expr = new IndexerExpression(scope, MakeLiteral(vexpr->GetVariable()), vexpr->GetDebugInfo()); delete expr; expr = new_expr; } }
void visit(Expression * node) { VariableExpression *expr = freecad_dynamic_cast<VariableExpression>(node); if (expr && expr->getPath().getDocumentObject() == obj) found = true; }
void visit(Expression * node) { VariableExpression *expr = freecad_dynamic_cast<VariableExpression>(node); if (expr) expr->renameDocumentObject(oldName, newName); }