From 0e77ba0bf769e2e5a4a93c079f241b02aeb3ef93 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 16 Mar 2008 01:15:50 +0000 Subject: [PATCH] Add create methods for ObjCIvarDecl and ObjCInterfaceDecl git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48408 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclObjC.h | 20 ++++++++++++++------ lib/AST/DeclObjC.cpp | 14 ++++++++++++++ lib/Sema/Sema.cpp | 5 +++-- lib/Sema/SemaDecl.cpp | 2 +- lib/Sema/SemaDeclObjC.cpp | 10 ++++++---- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 290d99efac..74f0a25c31 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -224,7 +224,7 @@ class ObjCInterfaceDecl : public TypeDecl { SourceLocation EndLoc; // marks the '>', '}', or identifier. SourceLocation AtEndLoc; // marks the end of the entire interface. -public: + ObjCInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos, IdentifierInfo *Id, bool FD = false, bool isInternal = false) @@ -237,6 +237,12 @@ public: ForwardDecl(FD), InternalInterface(isInternal) { AllocIntfRefProtocols(numRefProtos); } +public: + + static ObjCInterfaceDecl *Create(ASTContext &C, SourceLocation atLoc, + unsigned numRefProtos, IdentifierInfo *Id, + bool ForwardDecl = false, + bool isInternal = false); // This is necessary when converting a forward declaration to a definition. void AllocIntfRefProtocols(unsigned numRefProtos) { @@ -303,20 +309,20 @@ public: // Get the local instance method declared in this interface. ObjCMethodDecl *getInstanceMethod(Selector &Sel) { for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); - I != E; ++I) { + I != E; ++I) { if ((*I)->getSelector() == Sel) return *I; } - return 0; + return 0; } // Get the local class method declared in this interface. ObjCMethodDecl *getClassMethod(Selector &Sel) { for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); - I != E; ++I) { + I != E; ++I) { if ((*I)->getSelector() == Sel) return *I; } - return 0; + return 0; } // Lookup a method. First, we search locally. If a method isn't // found, we search referenced protocols and class categories. @@ -365,9 +371,11 @@ public: /// } /// class ObjCIvarDecl : public FieldDecl { -public: ObjCIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T) : FieldDecl(ObjCIvar, L, Id, T) {} +public: + static ObjCIvarDecl *Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, QualType T); enum AccessControl { None, Private, Protected, Public, Package diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 9580e0cbf8..53ba8c1219 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -30,7 +30,21 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, SourceLocation beginLoc, return new (Mem) ObjCMethodDecl(beginLoc, endLoc, SelInfo, T, contextDecl, M, isInstance, isVariadic, impControl); +} + +ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,SourceLocation atLoc, + unsigned numRefProtos, + IdentifierInfo *Id, + bool ForwardDecl, bool isInternal){ + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCInterfaceDecl(atLoc, numRefProtos, Id, ForwardDecl, + isInternal); +} +ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, QualType T) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCIvarDecl(L, Id, T); } diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index f4c271cdcb..da78ec0678 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -108,8 +108,9 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer) Context.setObjCClassType(ClassTypedef); // Synthesize "@class Protocol; - ObjCInterfaceDecl *ProtocolDecl = new ObjCInterfaceDecl(SourceLocation(), 0, - &Context.Idents.get("Protocol"), true); + ObjCInterfaceDecl *ProtocolDecl = + ObjCInterfaceDecl::Create(Context, SourceLocation(), 0, + &Context.Idents.get("Protocol"), true); Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl)); // Synthesize "typedef struct objc_object { Class isa; } *id;" diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 28b396a8f0..5ac51b29bf 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1340,7 +1340,7 @@ Sema::DeclTy *Sema::ActOnField(Scope *S, DeclTy *TagDecl, // properties can appear within a protocol. // See corresponding FIXME in DeclObjC.h:ObjCPropertyDecl. isa(static_cast(TagDecl))) - NewFD = new ObjCIvarDecl(Loc, II, T); + NewFD = ObjCIvarDecl::Create(Context, Loc, II, T); else assert(0 && "Sema::ActOnField(): Unknown TagDecl"); diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 4dd84d8555..d5d658d4ff 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -98,7 +98,8 @@ Sema::DeclTy *Sema::ActOnStartClassInterface( } } else { - IDecl = new ObjCInterfaceDecl(AtInterfaceLoc, NumProtocols, ClassName); + IDecl = ObjCInterfaceDecl::Create(Context, AtInterfaceLoc, NumProtocols, + ClassName); // Chain & install the interface decl into the identifier. IDecl->setNext(ClassName->getFETokenInfo()); @@ -382,8 +383,8 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation( if (!IDecl) { // Legacy case of @implementation with no corresponding @interface. // Build, chain & install the interface decl into the identifier. - IDecl = new ObjCInterfaceDecl(AtClassImplLoc, 0, ClassName, - false, true); + IDecl = ObjCInterfaceDecl::Create(Context, AtClassImplLoc, 0, ClassName, + false, true); IDecl->setNext(ClassName->getFETokenInfo()); ClassName->setFETokenInfo(IDecl); IDecl->setSuperClass(SDecl); @@ -589,7 +590,8 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, } ObjCInterfaceDecl *IDecl = dyn_cast_or_null(PrevDecl); if (!IDecl) { // Not already seen? Make a forward decl. - IDecl = new ObjCInterfaceDecl(AtClassLoc, 0, IdentList[i], true); + IDecl = ObjCInterfaceDecl::Create(Context, AtClassLoc, 0, IdentList[i], + true); // Chain & install the interface decl into the identifier. IDecl->setNext(IdentList[i]->getFETokenInfo()); IdentList[i]->setFETokenInfo(IDecl); -- 2.40.0