Exemplo n.º 1
0
/*
 * 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;
}
Exemplo n.º 2
0
/*
 * 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;
}