/* * Builds a ref.deref call around an expression if the it is of ref-type */ core::ExpressionPtr tryDeref(const core::ExpressionPtr& expr) { NodeManager& mgr = expr.getNodeManager(); IRBuilder builder(mgr); const lang::BasicGenerator& gen = expr->getNodeManager().getLangBasic(); // core::ExpressionPtr retExpr = expr; if (core::RefTypePtr&& refTy = expr->getType().isa<core::RefTypePtr>()) { return builder.callExpr(refTy->getElementType(), gen.getRefDeref(), expr); } return expr; }
/* * Builds a ref.deref call around an expression if the it is of type ref<ref<'a>> */ core::ExpressionPtr removeDoubleRef(const core::ExpressionPtr& expr){ if (core::RefTypePtr&& refTy = expr->getType().isa<core::RefTypePtr>()) { // on non array types remove also a single ref if(refTy->getElementType()->getNodeType() == core::NT_RefType || refTy->toString().find("array") == string::npos) { core::NodeManager& mgr = expr->getNodeManager(); const core::IRBuilder& builder(mgr); const lang::BasicGenerator& gen = builder.getLangBasic(); return builder.callExpr(refTy->getElementType(), gen.getRefDeref(), expr); } } return expr; }