]> granicus.if.org Git - clang/commitdiff
More super dot-syntax property implementation
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 20 Mar 2009 19:18:21 +0000 (19:18 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 20 Mar 2009 19:18:21 +0000 (19:18 +0000)
when there is actually a property declaration
used in the dot-syntax.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67391 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjC.cpp
lib/CodeGen/CodeGenFunction.h
test/CodeGenObjC/super-dotsyntax-property.m
test/Coverage/objc-language-features.inc

index 84d60ea7df92cf263115c67887a823760e5b1a1d..7f5262df1d4dde8642cf3199057d054186ce9213 100644 (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
index 8b578a6f3945b994f305ccd51b58eec68ea9265e..a54e187658b34b203d1258f2f8fdff2ad81f7f90 100644 (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);
 
 
   //===--------------------------------------------------------------------===//
index 8c51cfc5336f565b67ae250f487834b5adddaae5..cd0d5652d43a1bb0bceae5b6f78d365dfa593131 100644 (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;
 
   super.getter = 200;
   int x = super.getter;
 }
+-(void) setParent : (int) arg {
+  super.parent = arg + super.parent;
+  
+}
 @end
 
 void f0() {
index 3b092ffbf4cf611db6bb2a097d488dcfbc3ffc5e..477cbe3746909b358cc23577738100852e5332a1 100644 (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, ... {
 }