Revert r336591 "[libclang] NFC, simplify clang_Cursor_Evaluate"
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Tue, 10 Jul 2018 19:48:53 +0000 (19:48 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Tue, 10 Jul 2018 19:48:53 +0000 (19:48 +0000)
This change is blocking r336590 which is being reverted due to memory leaks.

llvm-svn: 336715

clang/tools/libclang/CIndex.cpp

index ab606ec..a469883 100644 (file)
@@ -3889,32 +3889,33 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
   return nullptr;
 }
 
-static const Expr *evaluateDeclExpr(const Decl *D) {
-  if (!D)
-    return nullptr;
-  if (auto *Var = dyn_cast<VarDecl>(D))
-    return Var->getInit();
-  else if (auto *Field = dyn_cast<FieldDecl>(D))
-    return Field->getInClassInitializer();
-  return nullptr;
-}
-
-static const Expr *evaluateCompoundStmtExpr(const CompoundStmt *CS) {
-  assert(CS && "invalid compound statement");
-  for (auto *bodyIterator : CS->body()) {
-    if (const auto *E = dyn_cast<Expr>(bodyIterator))
-      return E;
+CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
+  if (clang_getCursorKind(C) == CXCursor_CompoundStmt) {
+    const CompoundStmt *compoundStmt = cast<CompoundStmt>(getCursorStmt(C));
+    Expr *expr = nullptr;
+    for (auto *bodyIterator : compoundStmt->body()) {
+      if ((expr = dyn_cast<Expr>(bodyIterator))) {
+        break;
+      }
+    }
+    if (expr)
+      return const_cast<CXEvalResult>(
+          reinterpret_cast<const void *>(evaluateExpr(expr, C)));
   }
-  return nullptr;
-}
 
-CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
-  if (const Expr *E =
-          clang_getCursorKind(C) == CXCursor_CompoundStmt
-              ? evaluateCompoundStmtExpr(cast<CompoundStmt>(getCursorStmt(C)))
-              : evaluateDeclExpr(getCursorDecl(C)))
-    return const_cast<CXEvalResult>(
-        reinterpret_cast<const void *>(evaluateExpr(const_cast<Expr *>(E), C)));
+  const Decl *D = getCursorDecl(C);
+  if (D) {
+    const Expr *expr = nullptr;
+    if (auto *Var = dyn_cast<VarDecl>(D)) {
+      expr = Var->getInit();
+    } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
+      expr = Field->getInClassInitializer();
+    }
+    if (expr)
+      return const_cast<CXEvalResult>(reinterpret_cast<const void *>(
+          evaluateExpr(const_cast<Expr *>(expr), C)));
+    return nullptr;
+  }
   return nullptr;
 }