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) {
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) {
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;
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) {
}
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 ||
}
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) {
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();
}
}
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();
}
}
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;
}