Author: dblaikie Date: Wed Apr 13 13:23:33 2016 New Revision: 266222 URL: http://llvm.org/viewvc/llvm-project?rev=266222&view=rev Log: Simplify memory management of CXEvalResultKind/ExprEvalResult using unique_ptr and a dtor
This doesn't seem to need to be a C type, C only handles a void*, so use new/delete as usual to simplify allocation and cleanup. Follow-up to r265994 Modified: cfe/trunk/tools/libclang/CIndex.cpp Modified: cfe/trunk/tools/libclang/CIndex.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=266222&r1=266221&r2=266222&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CIndex.cpp (original) +++ cfe/trunk/tools/libclang/CIndex.cpp Wed Apr 13 13:23:33 2016 @@ -3409,26 +3409,23 @@ static StringLiteral* getCFSTR_value(Cal return S; } -typedef struct { +struct ExprEvalResult { CXEvalResultKind EvalType; union { int intVal; double floatVal; char *stringVal; } EvalData; -} ExprEvalResult; - -void clang_EvalResult_dispose(CXEvalResult E) { - ExprEvalResult *ER = (ExprEvalResult *)E; - if (ER) { - CXEvalResultKind evalType = ER->EvalType; - - if (evalType != CXEval_UnExposed && evalType != CXEval_Float && - evalType != CXEval_Int && ER->EvalData.stringVal) { - free((void *) ER->EvalData.stringVal); + ~ExprEvalResult() { + if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float && + EvalType != CXEval_Int) { + delete EvalData.stringVal; } - free((void *)ER); } +}; + +void clang_EvalResult_dispose(CXEvalResult E) { + delete static_cast<ExprEvalResult *>(E); } CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) { @@ -3469,10 +3466,7 @@ static const ExprEvalResult* evaluateExp bool res = expr->EvaluateAsRValue(ER, ctx); QualType rettype; CallExpr *callExpr; - ExprEvalResult *result = (ExprEvalResult *) malloc(sizeof(ExprEvalResult)); - if (!result) { - return nullptr; - } + auto result = llvm::make_unique<ExprEvalResult>(); result->EvalType = CXEval_UnExposed; if (res) { @@ -3480,7 +3474,7 @@ static const ExprEvalResult* evaluateExp if (ER.Val.isInt()) { result->EvalType = CXEval_Int; result->EvalData.intVal = ER.Val.getInt().getExtValue(); - return result; + return result.release(); } else if (ER.Val.isFloat()) { llvm::SmallVector<char, 100> Buffer; @@ -3492,7 +3486,7 @@ static const ExprEvalResult* evaluateExp apFloat.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, &ignored); result->EvalData.floatVal = apFloat.convertToDouble(); - return result; + return result.release(); } else if (expr->getStmtClass() == Stmt::ImplicitCastExprClass) { @@ -3514,11 +3508,11 @@ static const ExprEvalResult* evaluateExp } std::string strRef(StrE->getString().str()); - result->EvalData.stringVal = (char *)malloc(strRef.size()+1); + result->EvalData.stringVal = new char[strRef.size() + 1]; strncpy((char*)result->EvalData.stringVal, strRef.c_str(), strRef.size()); result->EvalData.stringVal[strRef.size()] = '\0'; - return result; + return result.release(); } } else if (expr->getStmtClass() == Stmt::ObjCStringLiteralClass || @@ -3537,11 +3531,11 @@ static const ExprEvalResult* evaluateExp } std::string strRef(StrE->getString().str()); - result->EvalData.stringVal = (char *)malloc(strRef.size()+1); + result->EvalData.stringVal = new char[strRef.size() + 1]; strncpy((char*)result->EvalData.stringVal, strRef.c_str(), strRef.size()); result->EvalData.stringVal[strRef.size()] = '\0'; - return result; + return result.release(); } else if (expr->getStmtClass() == Stmt::CStyleCastExprClass) { @@ -3557,11 +3551,11 @@ static const ExprEvalResult* evaluateExp std::string strLiteral(S->getString().str()); result->EvalType = CXEval_CFStr; - result->EvalData.stringVal = (char *)malloc(strLiteral.size()+1); + result->EvalData.stringVal = new char[strLiteral.size() + 1]; strncpy((char*)result->EvalData.stringVal, strLiteral.c_str(), strLiteral.size()); result->EvalData.stringVal[strLiteral.size()] = '\0'; - return result; + return result.release(); } } @@ -3570,27 +3564,24 @@ static const ExprEvalResult* evaluateExp callExpr = static_cast<CallExpr *>(expr); rettype = callExpr->getCallReturnType(ctx); - if (rettype->isVectorType() || callExpr->getNumArgs() > 1) { - clang_EvalResult_dispose((CXEvalResult *)result); + if (rettype->isVectorType() || callExpr->getNumArgs() > 1) return nullptr; - } + if (rettype->isIntegralType(ctx) || rettype->isRealFloatingType()) { - if(callExpr->getNumArgs() == 1 && - !callExpr->getArg(0)->getType()->isIntegralType(ctx)) { - clang_EvalResult_dispose((CXEvalResult *)result); + if (callExpr->getNumArgs() == 1 && + !callExpr->getArg(0)->getType()->isIntegralType(ctx)) return nullptr; - } } else if(rettype.getAsString() == "CFStringRef") { StringLiteral* S = getCFSTR_value(callExpr); if (S) { std::string strLiteral(S->getString().str()); result->EvalType = CXEval_CFStr; - result->EvalData.stringVal = (char *)malloc(strLiteral.size()+1); + result->EvalData.stringVal = new char[strLiteral.size() + 1]; strncpy((char*)result->EvalData.stringVal, strLiteral.c_str(), strLiteral.size()); result->EvalData.stringVal[strLiteral.size()] = '\0'; - return result; + return result.release(); } } @@ -3599,19 +3590,17 @@ static const ExprEvalResult* evaluateExp DeclRefExpr *D = static_cast<DeclRefExpr *>(expr); ValueDecl *V = D->getDecl(); if (V->getKind() == Decl::Function) { - std::string strName(V->getNameAsString()); + std::string strName = V->getNameAsString(); result->EvalType = CXEval_Other; - result->EvalData.stringVal = (char *)malloc(strName.size()+1); - strncpy((char*)result->EvalData.stringVal, strName.c_str(), - strName.size()); + result->EvalData.stringVal = new char[strName.size() + 1]; + strncpy(result->EvalData.stringVal, strName.c_str(), strName.size()); result->EvalData.stringVal[strName.size()] = '\0'; - return result; + return result.release(); } } } - clang_EvalResult_dispose((CXEvalResult *)result); return nullptr; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits