---
lib/CodeGen/CGObjCGNU.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 96 insertions(+), 6 deletions(-)
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index d0c6aee..235b084 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -1812,7 +1812,11 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
std::string GetterStr;
Context.getObjCEncodingForMethodDecl(getter,GetterStr);
InstanceMethodTypes.push_back(MakeConstantString(GetterStr));
- Fields.push_back(MakeConstantString(getter->getSelector().getAsString()));
+ if (property->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
+ Fields.push_back(MakeConstantString(getter->getSelector().getAsString()));
+ } else {
+ Fields.push_back(NULLPtr);
+ }
} else {
Fields.push_back(NULLPtr);
}
@@ -1821,7 +1825,11 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
std::string SetterStr;
Context.getObjCEncodingForMethodDecl(setter,SetterStr);
InstanceMethodTypes.push_back(MakeConstantString(SetterStr));
- Fields.push_back(MakeConstantString(setter->getSelector().getAsString()));
+ if (property->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
+ Fields.push_back(MakeConstantString(setter->getSelector().getAsString()));
+ } else {
+ Fields.push_back(NULLPtr);
+ }
} else {
Fields.push_back(NULLPtr);
}
@@ -1829,8 +1837,45 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
std::string AttrsStr;
Context.getObjCEncodingForPropertyDecl(property, NULL, AttrsStr);
Fields.push_back(MakeConstantString(AttrsStr));
- Fields.push_back(llvm::ConstantInt::get(IntTy,
- property->getPropertyAttributes()));
+ unsigned int Attrs = property->getPropertyAttributes();
+ if (property->isReadOnly()) {
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_weak |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ } else {
+ switch (property->getSetterKind()) {
+ case ObjCPropertyDecl::Assign:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_weak |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ break;
+ case ObjCPropertyDecl::Copy:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_weak |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ break;
+ case ObjCPropertyDecl::Retain:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_weak);
+ break;
+ case ObjCPropertyDecl::Weak:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ break;
+ }
+ }
+ Fields.push_back(llvm::ConstantInt::get(IntTy, Attrs));
if (property->getPropertyImplementation() == ObjCPropertyDecl::Optional) {
OptionalProperties.push_back(llvm::ConstantStruct::get(PropertyMetadataTy, Fields));
} else {
@@ -2132,7 +2177,11 @@ llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OI
InstanceMethodTypes.push_back(MakeConstantString(GetterStr));
InstanceMethodSels.push_back(getter->getSelector());
}
- Fields.push_back(MakeConstantString(getter->getSelector().getAsString()));
+ if (property->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
+ Fields.push_back(MakeConstantString(getter->getSelector().getAsString()));
+ } else {
+ Fields.push_back(NULLPtr);
+ }
} else {
Fields.push_back(NULLPtr);
}
@@ -2143,7 +2192,11 @@ llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OI
InstanceMethodTypes.push_back(MakeConstantString(SetterStr));
InstanceMethodSels.push_back(setter->getSelector());
}
- Fields.push_back(MakeConstantString(setter->getSelector().getAsString()));
+ if (property->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
+ Fields.push_back(MakeConstantString(setter->getSelector().getAsString()));
+ } else {
+ Fields.push_back(NULLPtr);
+ }
} else {
Fields.push_back(NULLPtr);
}
@@ -2157,6 +2210,43 @@ llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OI
Context.getObjCEncodingForPropertyDecl(property, OID, AttrsStr);
Fields.push_back(MakeConstantString(AttrsStr));
unsigned int Attrs = property->getPropertyAttributes();
+ if (property->isReadOnly()) {
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_weak |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ } else {
+ switch (property->getSetterKind()) {
+ case ObjCPropertyDecl::Assign:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_weak |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ break;
+ case ObjCPropertyDecl::Copy:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_weak |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ break;
+ case ObjCPropertyDecl::Retain:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_weak);
+ break;
+ case ObjCPropertyDecl::Weak:
+ Attrs &= ~(ObjCPropertyDecl::OBJC_PR_assign |
+ ObjCPropertyDecl::OBJC_PR_retain |
+ ObjCPropertyDecl::OBJC_PR_copy |
+ ObjCPropertyDecl::OBJC_PR_readonly |
+ ObjCPropertyDecl::OBJC_PR_strong);
+ break;
+ }
+ }
if (propertyImpl->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
Attrs |= ObjCPropertyDecl::OBJC_PR_dynamic;
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits