forked from OSchip/llvm-project
ir-gen support for class getter/setter call
using property dot-syntax. llvm-svn: 66556
This commit is contained in:
parent
4095d89532
commit
156506e749
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue