In gcc/objc/: 2011-04-15 Nicola Pero <nicola.pero@meta-innovation.com>
authorNicola Pero <nicola.pero@meta-innovation.com>
Fri, 15 Apr 2011 21:46:00 +0000 (21:46 +0000)
committerNicola Pero <nicola@gcc.gnu.org>
Fri, 15 Apr 2011 21:46:00 +0000 (21:46 +0000)
In gcc/objc/:
2011-04-15  Nicola Pero  <nicola.pero@meta-innovation.com>

* objc-act.c (ivar_of_class): New.
(objc_is_public): Use ivar_of_class.

From-SVN: r172523

gcc/objc/ChangeLog
gcc/objc/objc-act.c

index 9698eee1248497c20b4526966ede1ca9a0c55ed3..f21a2137292f28b0a6d16df04e3605b58b279b8b 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-15  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc-act.c (ivar_of_class): New.
+       (objc_is_public): Use ivar_of_class.
+
 2011-04-15  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc-act.c (objc_get_interface_ivars): Removed.
index ff4045379ddbc97b82476483c2d83b43d426cda9..b48f1795046caf36c9149c17e4508bfe79035bc0 100644 (file)
@@ -6367,6 +6367,35 @@ is_private (tree decl)
                        DECL_NAME (decl)));
 }
 
+/* Searches all the instance variables of 'klass' and of its
+   superclasses for an instance variable whose name (identifier) is
+   'ivar_name_ident'.  Return the declaration (DECL) of the instance
+   variable, if found, or NULL_TREE, if not found.  */
+static inline tree
+ivar_of_class (tree klass, tree ivar_name_ident)
+{
+  /* First, look up the ivar in CLASS_RAW_IVARS.  */
+  tree decl_chain = CLASS_RAW_IVARS (klass);
+
+  for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain))
+    if (DECL_NAME (decl_chain) == ivar_name_ident)
+      return decl_chain;
+
+  /* If not found, search up the class hierarchy.  */
+  while (CLASS_SUPER_NAME (klass))
+    {
+      klass = lookup_interface (CLASS_SUPER_NAME (klass));
+      
+      decl_chain = CLASS_RAW_IVARS (klass);
+  
+      for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain))
+       if (DECL_NAME (decl_chain) == ivar_name_ident)
+         return decl_chain;
+    }
+
+  return NULL_TREE;
+}
+
 /* We have an instance variable reference;, check to see if it is public.  */
 
 int
@@ -6397,7 +6426,7 @@ objc_is_public (tree expr, tree identifier)
              return 0;
            }
 
-         if ((decl = is_ivar (get_class_ivars (klass, true), identifier)))
+         if ((decl = ivar_of_class (klass, identifier)))
            {
              if (TREE_PUBLIC (decl))
                return 1;