From: Chris Lattner Date: Sun, 16 Mar 2008 00:49:28 +0000 (+0000) Subject: Give ObjCMethodDecl a Create method. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c4ae5de0c356777446f823b573821fb95560d91;p=clang Give ObjCMethodDecl a Create method. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48405 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 5ba0744b75..b377bb8e13 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -88,7 +88,7 @@ private: // FIXME: space savings opportunity, consider a sub-class. Stmt *Body; ParmVarDecl *SelfDecl; -public: + ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, Decl *contextDecl, @@ -104,6 +104,17 @@ public: SelName(SelInfo), MethodDeclType(T), ParamInfo(paramInfo), NumMethodParams(numParams), MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {} +public: + + static ObjCMethodDecl *Create(ASTContext &C, SourceLocation beginLoc, + SourceLocation endLoc, Selector SelInfo, + QualType T, Decl *contextDecl, + ParmVarDecl **paramInfo = 0, int numParams=-1, + AttributeList *M = 0, bool isInstance = true, + bool isVariadic = false, + ImplementationControl impControl = None, + Decl *PrevDecl = 0); + virtual ~ObjCMethodDecl(); ObjCDeclQualifier getObjCDeclQualifier() const { diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index f7f3ada907..ccdc4999bb 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -15,6 +15,26 @@ #include "clang/AST/ASTContext.h" using namespace clang; +//===----------------------------------------------------------------------===// +// ObjC Decl Allocation/Deallocation Method Implementations +//===----------------------------------------------------------------------===// + +ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, SourceLocation beginLoc, + SourceLocation endLoc, + Selector SelInfo, QualType T, + Decl *contextDecl, + ParmVarDecl **paramInfo, int numParams, + AttributeList *M, bool isInstance, + bool isVariadic, + ImplementationControl impControl, + Decl *PrevDecl) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCMethodDecl(beginLoc, endLoc, SelInfo, T, contextDecl, + paramInfo, numParams, M, isInstance, + isVariadic, impControl, PrevDecl); + +} + //===----------------------------------------------------------------------===// // Objective-C Decl Implementation diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 20d127b31e..7fc26986c8 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -799,7 +799,7 @@ CvtQTToAstBitMask(ObjCDeclSpec::ObjCDeclQualifier PQTVal) { Sema::DeclTy *Sema::ActOnMethodDeclaration( SourceLocation MethodLoc, SourceLocation EndLoc, - tok::TokenKind MethodType, DeclTy *ClassDecl, + tok::TokenKind MethodType, DeclTy *classDecl, ObjCDeclSpec &ReturnQT, TypeTy *ReturnType, Selector Sel, // optional arguments. The number of types/arguments is obtained @@ -807,6 +807,7 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( ObjCDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames, AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind, bool isVariadic) { + Decl *ClassDecl = static_cast(classDecl); // Make sure we can establish a context for the method. if (!ClassDecl) { @@ -837,15 +838,14 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( else // get the type for "id". resultDeclType = Context.getObjCIdType(); - Decl *CDecl = static_cast(ClassDecl); - ObjCMethodDecl* ObjCMethod = new ObjCMethodDecl(MethodLoc, EndLoc, Sel, - resultDeclType, - CDecl, - 0, -1, AttrList, - MethodType == tok::minus, isVariadic, - MethodDeclKind == tok::objc_optional ? - ObjCMethodDecl::Optional : - ObjCMethodDecl::Required); + ObjCMethodDecl* ObjCMethod = + ObjCMethodDecl::Create(Context, MethodLoc, EndLoc, Sel, resultDeclType, + ClassDecl, 0, -1, AttrList, + MethodType == tok::minus, isVariadic, + MethodDeclKind == tok::objc_optional ? + ObjCMethodDecl::Optional : + ObjCMethodDecl::Required); + ObjCMethod->setMethodParams(&Params[0], Sel.getNumArgs()); ObjCMethod->setObjCDeclQualifier( CvtQTToAstBitMask(ReturnQT.getObjCDeclQualifier())); @@ -856,7 +856,7 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( // incrementally (without waiting until we parse the @end). It also allows // us to flag multiple declaration errors as they occur. if (ObjCImplementationDecl *ImpDecl = - dyn_cast(CDecl)) { + dyn_cast(ClassDecl)) { if (MethodType == tok::minus) { PrevMethod = ImpDecl->getInstanceMethod(Sel); ImpDecl->addInstanceMethod(ObjCMethod); @@ -866,7 +866,7 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( } } else if (ObjCCategoryImplDecl *CatImpDecl = - dyn_cast(CDecl)) { + dyn_cast(ClassDecl)) { if (MethodType == tok::minus) { PrevMethod = CatImpDecl->getInstanceMethod(Sel); CatImpDecl->addInstanceMethod(ObjCMethod);