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:
parent
266a665f9f
commit
5927257206
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue