From: Douglas Gregor Date: Thu, 17 Feb 2011 07:13:24 +0000 (+0000) Subject: Devirtualize Decl::getBody() and Decl::hasBody(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1aa3d81c6e63959ef149489eca42b1520c521af4;p=clang Devirtualize Decl::getBody() and Decl::hasBody(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125731 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 7140e808ef..cba71ae8cd 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -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); } diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 472cb3bb74..3e92c4e651 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -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. diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 2c784f2554..81f5d39bf2 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -300,7 +300,7 @@ public: return ImplementationControl(DeclImplementation); } - virtual Stmt *getBody() const { + Stmt *getBody() const { return (Stmt*) Body; } CompoundStmt *getCompoundBody() { return (CompoundStmt*)Body; } diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index a95ea3f646..110de64d8c 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -429,6 +429,24 @@ DeclContext *Decl::castToDeclContext(const Decl *D) { } } +Stmt *Decl::getBody() const { + if (const FunctionDecl *FD = dyn_cast(this)) + return FD->getBody(); + if (const ObjCMethodDecl *MD = dyn_cast(this)) + return MD->getBody(); + if (const BlockDecl *BD = dyn_cast(this)) + return BD->getBody(); + + return 0; +} + +bool Decl::hasBody() const { + if (const FunctionDecl *FD = dyn_cast(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.