]> granicus.if.org Git - clang/commitdiff
Devirtualize Decl::getBody() and Decl::hasBody().
authorDouglas Gregor <dgregor@apple.com>
Thu, 17 Feb 2011 07:13:24 +0000 (07:13 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 17 Feb 2011 07:13:24 +0000 (07:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125731 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Decl.h
include/clang/AST/DeclBase.h
include/clang/AST/DeclObjC.h
lib/AST/DeclBase.cpp

index 7140e808efa89472e8196914482eaf91fa8e85bc..cba71ae8cd69cb1a2ef338020d24fcd862e4484e 100644 (file)
@@ -1332,7 +1332,7 @@ public:
   /// containing the body (if there is one).
   bool hasBody(const FunctionDecl *&Definition) const;
 
-  virtual bool hasBody() const {
+  bool hasBody() const {
     const FunctionDecl* Definition;
     return hasBody(Definition);
   }
@@ -1346,7 +1346,7 @@ public:
   /// unnecessary AST de-serialization of the body.
   Stmt *getBody(const FunctionDecl *&Definition) const;
 
-  virtual Stmt *getBody() const {
+  Stmt *getBody() const {
     const FunctionDecl* Definition;
     return getBody(Definition);
   }
index 472cb3bb747c4353e9f7849fb099b2bf37a11a6e..3e92c4e65115d6dc2999edec3bc4391a26ea42f0 100644 (file)
@@ -545,11 +545,11 @@ public:
   /// getBody - If this Decl represents a declaration for a body of code,
   ///  such as a function or method definition, this method returns the
   ///  top-level Stmt* of that body.  Otherwise this method returns null.
-  virtual Stmt* getBody() const { return 0; }
+  Stmt* getBody() const;
 
   /// \brief Returns true if this Decl represents a declaration for a body of
   /// code, such as a function or method definition.
-  virtual bool hasBody() const { return getBody() != 0; }
+  bool hasBody() const;
 
   /// getBodyRBrace - Gets the right brace of the body, if a body exists.
   /// This works whether the body is a CompoundStmt or a CXXTryStmt.
index 2c784f255461b8810e85e2a657de750245b198d6..81f5d39bf24cd232ec703336f987d3d7e8b9ad56 100644 (file)
@@ -300,7 +300,7 @@ public:
     return ImplementationControl(DeclImplementation);
   }
 
-  virtual Stmt *getBody() const {
+  Stmt *getBody() const {
     return (Stmt*) Body;
   }
   CompoundStmt *getCompoundBody() { return (CompoundStmt*)Body; }
index a95ea3f6463676947ce318d07c8ecab785d2aad7..110de64d8cdb047ad5daba2bb45294b033394c6c 100644 (file)
@@ -429,6 +429,24 @@ DeclContext *Decl::castToDeclContext(const Decl *D) {
   }
 }
 
+Stmt *Decl::getBody() const {
+  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this))
+    return FD->getBody();
+  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(this))
+    return MD->getBody();
+  if (const BlockDecl *BD = dyn_cast<BlockDecl>(this))
+    return BD->getBody();
+  
+  return 0;
+}
+
+bool Decl::hasBody() const {
+  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this))
+    return FD->hasBody();
+  
+  return getBody() != 0;
+}
+
 SourceLocation Decl::getBodyRBrace() const {
   // Special handling of FunctionDecl to avoid de-serializing the body from PCH.
   // FunctionDecl stores EndRangeLoc for this purpose.