ir-gen support for class getter/setter call

using property dot-syntax.

llvm-svn: 66556
This commit is contained in:
Fariborz Jahanian 2009-03-10 18:03:11 +00:00
parent 4095d89532
commit 156506e749
3 changed files with 44 additions and 5 deletions

View File

@ -275,7 +275,11 @@ public:
ObjCMethodDecl *getSetterMethod() const {
return Setter;
}
ObjCInterfaceDecl *getClassProp() const {
return ClassProp;
}
virtual SourceRange getSourceRange() const {
if (Base)
return SourceRange(getBase()->getLocStart(), Loc);

View File

@ -327,10 +327,17 @@ RValue CodeGenFunction::EmitObjCPropertyGet(const Expr *Exp) {
else {
const ObjCKVCRefExpr *KE = cast<ObjCKVCRefExpr>(Exp);
Selector S = KE->getGetterMethod()->getSelector();
llvm::Value *Receiver;
if (KE->getClassProp()) {
const ObjCInterfaceDecl *OID = KE->getClassProp();
Receiver = CGM.getObjCRuntime().GetClass(Builder, OID);
}
else
Receiver = EmitScalarExpr(KE->getBase());
return CGM.getObjCRuntime().
GenerateMessageSend(*this, Exp->getType(), S,
EmitScalarExpr(KE->getBase()),
false, CallArgList());
Receiver,
KE->getClassProp() != 0, CallArgList());
}
}
@ -348,10 +355,17 @@ void CodeGenFunction::EmitObjCPropertySet(const Expr *Exp,
else if (const ObjCKVCRefExpr *E = dyn_cast<ObjCKVCRefExpr>(Exp)) {
Selector S = E->getSetterMethod()->getSelector();
CallArgList Args;
llvm::Value *Receiver;
if (E->getClassProp()) {
const ObjCInterfaceDecl *OID = E->getClassProp();
Receiver = CGM.getObjCRuntime().GetClass(Builder, OID);
}
else
Receiver = EmitScalarExpr(E->getBase());
Args.push_back(std::make_pair(Src, E->getType()));
CGM.getObjCRuntime().GenerateMessageSend(*this, getContext().VoidTy, S,
EmitScalarExpr(E->getBase()),
false, Args);
Receiver,
E->getClassProp() != 0, Args);
}
else
assert (0 && "bad expression node in EmitObjCPropertySet");

View File

@ -0,0 +1,21 @@
// RUN: clang -fnext-runtime -emit-llvm -o %t %s
@interface Test { }
+ (Test *)crash;
+ (void)setCrash: (int)value;
@end
@implementation Test
static int _value;
- (void)cachesPath
{
static Test *cachesPath;
if (!cachesPath) {
Test *crash = Test.crash;
}
}
+ (Test *)crash{ return 0; }
+ (void)setCrash: (int)value{ _value = value; }
@end