More super dot-syntax property implementation

when there is actually a property declaration
used in the dot-syntax.

llvm-svn: 67391
This commit is contained in:
Fariborz Jahanian 2009-03-20 19:18:21 +00:00
parent 9ffbe41a6c
commit 391d4fc7f7
4 changed files with 56 additions and 28 deletions

View File

@ -315,10 +315,29 @@ QualType CodeGenFunction::TypeOfSelfObject() {
return PTy->getPointeeType();
}
RValue CodeGenFunction::EmitObjCSuperPropertyGet(const Expr *Exp,
const Selector &S) {
llvm::Value *Receiver = LoadObjCSelf();
const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
bool isClassMessage = OMD->isClassMethod();
bool isCategoryImpl = isa<ObjCCategoryImplDecl>(OMD->getDeclContext());
return CGM.getObjCRuntime().GenerateMessageSendSuper(*this,
Exp->getType(),
S,
OMD->getClassInterface(),
isCategoryImpl,
Receiver,
isClassMessage,
CallArgList());
}
RValue CodeGenFunction::EmitObjCPropertyGet(const Expr *Exp) {
// FIXME: Split it into two separate routines.
if (const ObjCPropertyRefExpr *E = dyn_cast<ObjCPropertyRefExpr>(Exp)) {
Selector S = E->getProperty()->getGetterName();
if (isa<ObjCSuperExpr>(E->getBase()))
return EmitObjCSuperPropertyGet(E, S);
return CGM.getObjCRuntime().
GenerateMessageSend(*this, Exp->getType(), S,
EmitScalarExpr(E->getBase()),
@ -332,20 +351,8 @@ RValue CodeGenFunction::EmitObjCPropertyGet(const Expr *Exp) {
const ObjCInterfaceDecl *OID = KE->getClassProp();
Receiver = CGM.getObjCRuntime().GetClass(Builder, OID);
}
else if (isa<ObjCSuperExpr>(KE->getBase())) {
Receiver = LoadObjCSelf();
const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
bool isClassMessage = OMD->isClassMethod();
bool isCategoryImpl = isa<ObjCCategoryImplDecl>(OMD->getDeclContext());
return CGM.getObjCRuntime().GenerateMessageSendSuper(*this,
KE->getType(),
S,
OMD->getClassInterface(),
isCategoryImpl,
Receiver,
isClassMessage,
CallArgList());
}
else if (isa<ObjCSuperExpr>(KE->getBase()))
return EmitObjCSuperPropertyGet(KE, S);
else
Receiver = EmitScalarExpr(KE->getBase());
return CGM.getObjCRuntime().
@ -355,11 +362,35 @@ RValue CodeGenFunction::EmitObjCPropertyGet(const Expr *Exp) {
}
}
void CodeGenFunction::EmitObjCSuperPropertySet(const Expr *Exp,
const Selector &S,
RValue Src) {
CallArgList Args;
llvm::Value *Receiver = LoadObjCSelf();
const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
bool isClassMessage = OMD->isClassMethod();
bool isCategoryImpl = isa<ObjCCategoryImplDecl>(OMD->getDeclContext());
Args.push_back(std::make_pair(Src, Exp->getType()));
CGM.getObjCRuntime().GenerateMessageSendSuper(*this,
Exp->getType(),
S,
OMD->getClassInterface(),
isCategoryImpl,
Receiver,
isClassMessage,
Args);
return;
}
void CodeGenFunction::EmitObjCPropertySet(const Expr *Exp,
RValue Src) {
// FIXME: Split it into two separate routines.
if (const ObjCPropertyRefExpr *E = dyn_cast<ObjCPropertyRefExpr>(Exp)) {
Selector S = E->getProperty()->getSetterName();
if (isa<ObjCSuperExpr>(E->getBase())) {
EmitObjCSuperPropertySet(E, S, Src);
return;
}
CallArgList Args;
Args.push_back(std::make_pair(Src, E->getType()));
CGM.getObjCRuntime().GenerateMessageSend(*this, getContext().VoidTy, S,
@ -375,18 +406,7 @@ void CodeGenFunction::EmitObjCPropertySet(const Expr *Exp,
Receiver = CGM.getObjCRuntime().GetClass(Builder, OID);
}
else if (isa<ObjCSuperExpr>(E->getBase())) {
Receiver = LoadObjCSelf();
const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
bool isClassMessage = OMD->isClassMethod();
bool isCategoryImpl = isa<ObjCCategoryImplDecl>(OMD->getDeclContext());
CGM.getObjCRuntime().GenerateMessageSendSuper(*this,
E->getType(),
S,
OMD->getClassInterface(),
isCategoryImpl,
Receiver,
isClassMessage,
Args);
EmitObjCSuperPropertySet(E, S, Src);
return;
}
else

View File

@ -673,7 +673,9 @@ public:
llvm::Value *EmitObjCSelectorExpr(const ObjCSelectorExpr *E);
RValue EmitObjCMessageExpr(const ObjCMessageExpr *E);
RValue EmitObjCPropertyGet(const Expr *E);
RValue EmitObjCSuperPropertyGet(const Expr *Exp, const Selector &S);
void EmitObjCPropertySet(const Expr *E, RValue Src);
void EmitObjCSuperPropertySet(const Expr *E, const Selector &S, RValue Src);
//===--------------------------------------------------------------------===//

View File

@ -1,6 +1,10 @@
// RUN: clang -emit-llvm -o %t %s
@interface B
{
int _parent;
}
@property int parent;
+(int) classGetter;
+(void) setClassGetter:(int) arg;
@ -25,6 +29,10 @@
super.getter = 200;
int x = super.getter;
}
-(void) setParent : (int) arg {
super.parent = arg + super.parent;
}
@end
void f0() {

View File

@ -34,9 +34,7 @@
const char *s1 = __FUNCTION__;
const char *s2 = __PRETTY_FUNCTION__;
[super im0];
#ifndef IRGENABLE
int x = super.p0;
#endif
}
-(void) im1: (int) x, ... {
}