]> granicus.if.org Git - clang/commitdiff
Give ObjCMethodDecl a Create method.
authorChris Lattner <sabre@nondot.org>
Sun, 16 Mar 2008 00:49:28 +0000 (00:49 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 16 Mar 2008 00:49:28 +0000 (00:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48405 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclObjC.h
lib/AST/DeclObjC.cpp
lib/Sema/SemaDeclObjC.cpp

index 5ba0744b75448d2cfc837da61dbbdfb0c624df40..b377bb8e131ee15da1c3b7bfc8256115087edef3 100644 (file)
@@ -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 {
index f7f3ada90716ae466191868f1bbed52005a25e18..ccdc4999bb4c94d566a475011d9725a940cd1fdb 100644 (file)
 #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<ObjCMethodDecl>();
+  return new (Mem) ObjCMethodDecl(beginLoc, endLoc, SelInfo, T, contextDecl,
+                                  paramInfo, numParams, M, isInstance, 
+                                  isVariadic, impControl, PrevDecl);
+
+}
+
 
 //===----------------------------------------------------------------------===//
 // Objective-C Decl Implementation
index 20d127b31ebc70ba8d7fd65f54e0fe8ac82aca8b..7fc26986c80c7ed771961d485d3f4e71aaf5da43 100644 (file)
@@ -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<Decl*>(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<Decl*>(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<ObjCImplementationDecl>(CDecl)) {
+        dyn_cast<ObjCImplementationDecl>(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<ObjCCategoryImplDecl>(CDecl)) {
+            dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
     if (MethodType == tok::minus) {
       PrevMethod = CatImpDecl->getInstanceMethod(Sel);
       CatImpDecl->addInstanceMethod(ObjCMethod);