From 5678a5a3bf407b6aa95e827ac6dd1056cdf6b415 Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Fri, 15 Apr 2011 21:46:00 +0000 Subject: [PATCH] In gcc/objc/: 2011-04-15 Nicola Pero In gcc/objc/: 2011-04-15 Nicola Pero * objc-act.c (ivar_of_class): New. (objc_is_public): Use ivar_of_class. From-SVN: r172523 --- gcc/objc/ChangeLog | 5 +++++ gcc/objc/objc-act.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 9698eee1248..f21a2137292 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,8 @@ +2011-04-15 Nicola Pero + + * objc-act.c (ivar_of_class): New. + (objc_is_public): Use ivar_of_class. + 2011-04-15 Nicola Pero * objc-act.c (objc_get_interface_ivars): Removed. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index ff4045379dd..b48f1795046 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -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; -- 2.30.2