forked from OSchip/llvm-project
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:
parent
9ffbe41a6c
commit
391d4fc7f7
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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, ... {
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue