r266222 - Simplify memory management of CXEvalResultKind/ExprEvalResult using unique_ptr and a dtor

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 13 11:23:33 PDT 2016


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;
 }
 




More information about the cfe-commits mailing list