move two more lists of protocols over to use ObjCList<ObjCProtocolDecl>,
simplifying code along the way and fixing a problem and memory leak or two.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53876 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp
index 347874e..a95abbe 100644
--- a/Driver/RewriteObjC.cpp
+++ b/Driver/RewriteObjC.cpp
@@ -217,8 +217,8 @@
const char *ClassName,
std::string &Result);
- void RewriteObjCProtocolsMetaData(ObjCProtocolDecl *const*Protocols,
- int NumProtocols,
+ void RewriteObjCProtocolsMetaData(const ObjCList<ObjCProtocolDecl>
+ &Protocols,
const char *prefix,
const char *ClassName,
std::string &Result);
@@ -2524,14 +2524,14 @@
}
/// RewriteObjCProtocolsMetaData - Rewrite protocols meta-data.
-void RewriteObjC::RewriteObjCProtocolsMetaData(ObjCProtocolDecl*const*Protocols,
- int NumProtocols,
- const char *prefix,
- const char *ClassName,
- std::string &Result) {
+void RewriteObjC::
+RewriteObjCProtocolsMetaData(const ObjCList<ObjCProtocolDecl> &Protocols,
+ const char *prefix,
+ const char *ClassName,
+ std::string &Result) {
static bool objc_protocol_methods = false;
- if (NumProtocols > 0) {
- for (int i = 0; i < NumProtocols; i++) {
+ if (!Protocols.empty()) {
+ for (unsigned i = 0; i != Protocols.size(); i++) {
ObjCProtocolDecl *PDecl = Protocols[i];
// Output struct protocol_methods holder of method selector and type.
if (!objc_protocol_methods && !PDecl->isForwardDecl()) {
@@ -2680,24 +2680,23 @@
Result += "\tstruct _objc_protocol_list *next;\n";
Result += "\tint protocol_count;\n";
Result += "\tstruct _objc_protocol *class_protocols[";
- Result += utostr(NumProtocols);
+ Result += utostr(Protocols.size());
Result += "];\n} _OBJC_";
Result += prefix;
Result += "_PROTOCOLS_";
Result += ClassName;
Result += " __attribute__ ((used, section (\"__OBJC, __cat_cls_meth\")))= "
"{\n\t0, ";
- Result += utostr(NumProtocols);
+ Result += utostr(Protocols.size());
Result += "\n";
Result += "\t,{&_OBJC_PROTOCOL_";
Result += Protocols[0]->getName();
Result += " \n";
- for (int i = 1; i < NumProtocols; i++) {
- ObjCProtocolDecl *PDecl = Protocols[i];
+ for (unsigned i = 1; i != Protocols.size(); i++) {
Result += "\t ,&_OBJC_PROTOCOL_";
- Result += PDecl->getName();
+ Result += Protocols[i]->getName();
Result += "\n";
}
Result += "\t }\n};\n";
@@ -2733,9 +2732,7 @@
// Protocols referenced in class declaration?
// Null CDecl is case of a category implementation with no category interface
if (CDecl)
- RewriteObjCProtocolsMetaData(CDecl->getReferencedProtocols(),
- CDecl->getNumReferencedProtocols(),
- "CATEGORY",
+ RewriteObjCProtocolsMetaData(CDecl->getReferencedProtocols(), "CATEGORY",
FullCategoryName.c_str(), Result);
/* struct _objc_category {
@@ -2789,7 +2786,7 @@
else
Result += "\t, 0\n";
- if (CDecl && CDecl->getNumReferencedProtocols() > 0) {
+ if (CDecl && !CDecl->getReferencedProtocols().empty()) {
Result += "\t, (struct _objc_protocol_list *)&_OBJC_CATEGORY_PROTOCOLS_";
Result += FullCategoryName;
Result += "\n";
@@ -2915,8 +2912,7 @@
false, "", IDecl->getName(), Result);
// Protocols referenced in class declaration?
- RewriteObjCProtocolsMetaData(CDecl->getReferencedProtocols().begin(),
- CDecl->getReferencedProtocols().size(),
+ RewriteObjCProtocolsMetaData(CDecl->getReferencedProtocols(),
"CLASS", CDecl->getName(), Result);