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

llvm-svn: 266222
This commit is contained in:
David Blaikie 2016-04-13 18:23:33 +00:00
parent 266a665f9f
commit 5927257206
1 changed files with 28 additions and 39 deletions

View File

@ -3409,26 +3409,23 @@ static StringLiteral* getCFSTR_value(CallExpr *callExpr) {
return S;
}
typedef struct {
struct ExprEvalResult {
CXEvalResultKind EvalType;
union {
int intVal;
double floatVal;
char *stringVal;
} EvalData;
} ExprEvalResult;
~ExprEvalResult() {
if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float &&
EvalType != CXEval_Int) {
delete EvalData.stringVal;
}
}
};
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);
}
free((void *)ER);
}
delete static_cast<ExprEvalResult *>(E);
}
CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) {
@ -3469,10 +3466,7 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
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* evaluateExpr(Expr *expr, CXCursor C) {
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* evaluateExpr(Expr *expr, CXCursor C) {
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* evaluateExpr(Expr *expr, CXCursor C) {
}
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* evaluateExpr(Expr *expr, CXCursor C) {
}
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* evaluateExpr(Expr *expr, CXCursor C) {
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* evaluateExpr(Expr *expr, CXCursor C) {
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* evaluateExpr(Expr *expr, CXCursor C) {
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;
}