@@ -4589,13 +4589,13 @@ struct ExprEvalResult {
45894589 unsigned long long unsignedVal;
45904590 long long intVal;
45914591 double floatVal;
4592- char * stringVal;
4592+ CXString stringVal;
45934593 } EvalData;
45944594 bool IsUnsignedInt;
45954595 ~ExprEvalResult () {
45964596 if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float &&
45974597 EvalType != CXEval_Int) {
4598- delete[] EvalData.stringVal ;
4598+ clang_disposeString ( EvalData.stringVal ) ;
45994599 }
46004600 }
46014601};
@@ -4651,7 +4651,17 @@ const char *clang_EvalResult_getAsStr(CXEvalResult E) {
46514651 if (!E) {
46524652 return nullptr ;
46534653 }
4654- return ((ExprEvalResult *)E)->EvalData .stringVal ;
4654+ return clang_getCString (((ExprEvalResult *)E)->EvalData .stringVal );
4655+ }
4656+
4657+ CXString clang_EvalResult_getAsCXString (CXEvalResult E) {
4658+ if (!E) {
4659+ return cxstring::createNull ();
4660+ }
4661+ size_t length;
4662+ auto data =
4663+ clang_getCString2 (((ExprEvalResult *)E)->EvalData .stringVal , &length);
4664+ return cxstring::createDup (StringRef (data, length));
46554665}
46564666
46574667static const ExprEvalResult *evaluateExpr (Expr *expr, CXCursor C) {
@@ -4716,11 +4726,7 @@ static const ExprEvalResult *evaluateExpr(Expr *expr, CXCursor C) {
47164726 result->EvalType = CXEval_StrLiteral;
47174727 }
47184728
4719- std::string strRef (StrE->getString ().str ());
4720- result->EvalData .stringVal = new char [strRef.size () + 1 ];
4721- strncpy ((char *)result->EvalData .stringVal , strRef.c_str (),
4722- strRef.size ());
4723- result->EvalData .stringVal [strRef.size ()] = ' \0 ' ;
4729+ result->EvalData .stringVal = cxstring::createDup (StrE->getString ());
47244730 return result.release ();
47254731 }
47264732 } else if (expr->getStmtClass () == Stmt::ObjCStringLiteralClass ||
@@ -4737,10 +4743,7 @@ static const ExprEvalResult *evaluateExpr(Expr *expr, CXCursor C) {
47374743 result->EvalType = CXEval_StrLiteral;
47384744 }
47394745
4740- std::string strRef (StrE->getString ().str ());
4741- result->EvalData .stringVal = new char [strRef.size () + 1 ];
4742- strncpy ((char *)result->EvalData .stringVal , strRef.c_str (), strRef.size ());
4743- result->EvalData .stringVal [strRef.size ()] = ' \0 ' ;
4746+ result->EvalData .stringVal = cxstring::createDup (StrE->getString ());
47444747 return result.release ();
47454748 }
47464749
@@ -4754,13 +4757,8 @@ static const ExprEvalResult *evaluateExpr(Expr *expr, CXCursor C) {
47544757 callExpr = static_cast <CallExpr *>(CC->getSubExpr ());
47554758 StringLiteral *S = getCFSTR_value (callExpr);
47564759 if (S) {
4757- std::string strLiteral (S->getString ().str ());
47584760 result->EvalType = CXEval_CFStr;
4759-
4760- result->EvalData .stringVal = new char [strLiteral.size () + 1 ];
4761- strncpy ((char *)result->EvalData .stringVal , strLiteral.c_str (),
4762- strLiteral.size ());
4763- result->EvalData .stringVal [strLiteral.size ()] = ' \0 ' ;
4761+ result->EvalData .stringVal = cxstring::createDup (S->getString ());
47644762 return result.release ();
47654763 }
47664764 }
@@ -4780,24 +4778,18 @@ static const ExprEvalResult *evaluateExpr(Expr *expr, CXCursor C) {
47804778
47814779 StringLiteral *S = getCFSTR_value (callExpr);
47824780 if (S) {
4783- std::string strLiteral (S->getString ().str ());
47844781 result->EvalType = CXEval_CFStr;
4785- result->EvalData .stringVal = new char [strLiteral.size () + 1 ];
4786- strncpy ((char *)result->EvalData .stringVal , strLiteral.c_str (),
4787- strLiteral.size ());
4788- result->EvalData .stringVal [strLiteral.size ()] = ' \0 ' ;
4782+ result->EvalData .stringVal = cxstring::createDup (S->getString ());
47894783 return result.release ();
47904784 }
47914785 }
47924786 } else if (expr->getStmtClass () == Stmt::DeclRefExprClass) {
47934787 DeclRefExpr *D = static_cast <DeclRefExpr *>(expr);
47944788 ValueDecl *V = D->getDecl ();
47954789 if (V->getKind () == Decl::Function) {
4796- std::string strName = V->getNameAsString ();
47974790 result->EvalType = CXEval_Other;
4798- result->EvalData .stringVal = new char [strName.size () + 1 ];
4799- strncpy (result->EvalData .stringVal , strName.c_str (), strName.size ());
4800- result->EvalData .stringVal [strName.size ()] = ' \0 ' ;
4791+ result->EvalData .stringVal =
4792+ cxstring::createDup (StringRef (V->getNameAsString ()));
48014793 return result.release ();
48024794 }
48034795 }
0 commit comments