/*!
 * 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;
                }
            }
        }
    }
Exemple #4
0
  /// 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);
    }
  }
Exemple #5
0
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);
    }