Nonfragile ivar synthesis with property is in a continuation

class.

llvm-svn: 68234
This commit is contained in:
Fariborz Jahanian 2009-04-01 19:37:34 +00:00
parent d854c8d8a6
commit 78be1651e2
4 changed files with 90 additions and 1 deletions

View File

@ -614,6 +614,17 @@ void ASTContext::CollectObjCIvars(const ObjCInterfaceDecl *OI,
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
Fields.push_back(cast<FieldDecl>(IV));
}
// look into continuation class.
for (ObjCCategoryDecl *Categories = OI->getCategoryList();
Categories; Categories = Categories->getNextClassCategory())
if (!Categories->getIdentifier()) {
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
E = Categories->prop_end(); I != E; ++I) {
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
Fields.push_back(cast<FieldDecl>(IV));
}
break;
}
}
/// addRecordToClass - produces record info. for the class for its
@ -711,7 +722,18 @@ ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) {
if (ObjCIvarDecl *Ivar = (*I)->getPropertyIvarDecl())
NewEntry->LayoutField(Ivar, i++, false, StructPacking, *this);
}
// Also continuation class.
for (ObjCCategoryDecl *Categories = D->getCategoryList();
Categories; Categories = Categories->getNextClassCategory())
if (!Categories->getIdentifier()) {
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
E = Categories->prop_end(); I != E; ++I) {
if (ObjCIvarDecl *Ivar = (*I)->getPropertyIvarDecl())
NewEntry->LayoutField(Ivar, i++, false, StructPacking, *this);
}
break;
}
// Finally, round the size of the total struct up to the alignment of the
// struct itself.
NewEntry->FinalizeLayout();

View File

@ -147,6 +147,22 @@ ObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable(
return IV;
}
}
// look into continuation class.
for (ObjCCategoryDecl *Categories = ClassDecl->getCategoryList();
Categories; Categories = Categories->getNextClassCategory())
if (!Categories->getIdentifier()) {
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
E = Categories->prop_end(); I != E; ++I) {
ObjCPropertyDecl *PDecl = (*I);
if (ObjCIvarDecl *IV = PDecl->getPropertyIvarDecl())
if (IV->getIdentifier() == ID) {
clsDeclared = ClassDecl;
return IV;
}
}
break;
}
ClassDecl = ClassDecl->getSuperClass();
}
return NULL;

View File

@ -1674,6 +1674,18 @@ static int countInheritedIvars(const ObjCInterfaceDecl *OI) {
if ((*I)->getPropertyIvarDecl())
++count;
}
// look into continuation class.
for (ObjCCategoryDecl *Categories = OI->getCategoryList();
Categories; Categories = Categories->getNextClassCategory()) {
if (!Categories->getIdentifier()) {
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
E = Categories->prop_end(); I != E; ++I) {
if ((*I)->getPropertyIvarDecl())
++count;
}
break;
}
}
return count;
}
@ -1702,6 +1714,20 @@ static const ObjCInterfaceDecl *getInterfaceDeclForIvar(
if (IV->getIdentifier() == IVD->getIdentifier())
return OI;
}
// look into continuation class.
for (ObjCCategoryDecl *Categories = OI->getCategoryList();
Categories; Categories = Categories->getNextClassCategory()) {
if (!Categories->getIdentifier()) {
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
E = Categories->prop_end(); I != E; ++I) {
ObjCPropertyDecl *PDecl = (*I);
if (ObjCIvarDecl *IV = PDecl->getPropertyIvarDecl())
if (IV->getIdentifier() == IVD->getIdentifier())
return OI;
}
break;
}
}
return getInterfaceDeclForIvar(OI->getSuperClass(), IVD);
}
@ -4566,6 +4592,18 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
E = OID->prop_end(); I != E; ++I)
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
OIvars.push_back(IV);
// look into continuation class.
for (ObjCCategoryDecl *Categories = OID->getCategoryList();
Categories; Categories = Categories->getNextClassCategory())
if (!Categories->getIdentifier()) {
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
E = Categories->prop_end(); I != E; ++I) {
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
OIvars.push_back(IV);
}
break;
}
unsigned iv = 0;
for (RecordDecl::field_iterator e = RD->field_end(); i != e; ++i) {
FieldDecl *Field = *i;

View File

@ -12,3 +12,16 @@
return IP;
}
@end
// Test for synthesis of ivar for a property
// declared in continuation class.
@interface OrganizerViolatorView
@end
@interface OrganizerViolatorView()
@property (retain) id bindingInfo;
@end
@implementation OrganizerViolatorView
@synthesize bindingInfo;
@end