Patchwork [ObjC*] add parse-side support for @package.

login
register
mail settings
Submitter IainS
Date Oct. 15, 2010, 10:37 a.m.
Message ID <FDAB98A3-F43B-4EBD-915A-3D03AC818B38@sandoe-acoustics.co.uk>
Download mbox | patch
Permalink /patch/67924/
State New
Headers show

Comments

IainS - Oct. 15, 2010, 10:37 a.m.
Hi,

This is (other than declarations) all ObjC local  - but it is new  
code, not a merge.
I also replaced the magic numbers with an enum for objc ivar visibility.

OK for trunk?
Iain

gcc/c-family:
	
	* c-common.c (c_common_reswords): Add package, RID_AT_PACKAGE.
	* c-common.h (enum rid): Add RID_AT_PACKAGE.
	(objc_ivar_visibility_kind): New enum.
	(objc_set_visibility): Adjust prototype to use visibility enum.
	* stub-objc.c (objc_set_visibility): Adjust stub to use
	visibility enum.

gcc/objc:

	* objc-act.c: Rename 'objc_public_flag' to  objc_ivar_visibility and
	make its type 'objc_ivar_visibility_kind'.
	(objc_start_class_interface): Update to use visibility enum.
	(objc_start_class_implementation): Likewise.
	(objc_set_visibility): Update to use visibility enum, warn that
	@package is handle as per @public.
	(add_instance_variable): Handle OBJC_IVAR_VIS_PACKAGE.
	* objc-act.h: Rename 'objc_public_flag' to  objc_ivar_visibility and
	make its type 'objc_ivar_visibility_kind'.

gcc/cp:

	* parser.c (cp_parser_objc_visibility_spec): Update to use visibility
	enum, and handle @package.

gcc:

	* c-parser.c (c_parser_objc_class_instance_variables): Update to use
	visibility enum, and handle @package.

gcc/testsuite:

	* objc.dg/fsf-package-0.m: New.
	* obj-c++.dg/fsf-package-0.m: New.
Index: gcc/testsuite/objc.dg/fsf-package-0.m
===================================================================
--- gcc/testsuite/objc.dg/fsf-package-0.m	(revision 0)
+++ gcc/testsuite/objc.dg/fsf-package-0.m	(revision 0)
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+
+#import "../objc-obj-c++-shared/Object1.h"
+#include <objc/objc-api.h>
+
+@interface obj : Object
+{
+@public
+  int v1;
+@package	/* { dg-warning ".@package. presently has the same effect as .@public." } */
+  int v2;
+@protected
+  int v3;
+@private
+  int v4;
+}
+- (int) value;
+- (void) setValue: (int)number;
+@end
+
+@implementation obj : Object
+
+- (int) value { return v1; }
+- (void) setValue: (int)number { v1 = number; }
+
+@end
+
+void foo (void)
+{
+  obj *a;
+
+  [a setValue:2];
+  a->v2 = 1;
+  a->v3 = [a value] - a->v2;	/* { dg-warning ".v3. is @protected" } */
+  a->v4 = a->v3 - 1;		/* { dg-warning ".v4. is @private" } */
+  				/* { dg-warning ".v3. is @protected" "" { target *-*-* } 35 } */
+}
Index: gcc/testsuite/obj-c++.dg/fsf-package-0.m
===================================================================
--- gcc/testsuite/obj-c++.dg/fsf-package-0.m	(revision 0)
+++ gcc/testsuite/obj-c++.dg/fsf-package-0.m	(revision 0)
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+
+#import "../objc-obj-c++-shared/Object1.h"
+#include <objc/objc-api.h>
+
+@interface obj : Object
+{
+@public
+  int v1;
+@package	/* { dg-warning ".@package. presently has the same effect as .@public." } */
+  int v2;
+@protected
+  int v3;
+@private
+  int v4;
+}
+- (int) value;
+- (void) setValue: (int)number;
+@end
+
+@implementation obj : Object
+
+- (int) value { return v1; }
+- (void) setValue: (int)number { v1 = number; }
+
+@end
+
+void foo (void)
+{
+  obj *a;
+
+  [a setValue:2];
+  a->v2 = 1;
+  a->v3 = [a value] - a->v2;	/* { dg-warning ".v3. is @protected" } */
+  a->v4 = a->v3 - 1;		/* { dg-warning ".v4. is @private" } */
+  				/* { dg-warning ".v3. is @protected" "" { target *-*-* } 35 } */
+}
Mike Stump - Oct. 15, 2010, 3:34 p.m.
On Oct 15, 2010, at 3:37 AM, IainS wrote:
> I also replaced the magic numbers with an enum for objc ivar visibility.

Excellent, much more readable...  Thanks.

> OK for trunk?

Ok.
IainS - Oct. 17, 2010, 1:02 p.m.
On 15 Oct 2010, at 16:34, Mike Stump wrote:

> On Oct 15, 2010, at 3:37 AM, IainS wrote:
>> I also replaced the magic numbers with an enum for objc ivar  
>> visibility.
>
> Excellent, much more readable...  Thanks.
>
>> OK for trunk?
>
> Ok.
r165585
Iain

Patch

Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c	(revision 165498)
+++ gcc/c-family/c-common.c	(working copy)
@@ -544,6 +544,7 @@  const struct c_common_resword c_common_reswords[]
   { "optional",		RID_AT_OPTIONAL,	D_OBJC },
   { "required",		RID_AT_REQUIRED,	D_OBJC },
   { "property",		RID_AT_PROPERTY,	D_OBJC },
+  { "package",		RID_AT_PACKAGE,		D_OBJC },
   /* These are recognized only in protocol-qualifier context
      (see above) */
   { "bycopy",		RID_BYCOPY,		D_OBJC },
Index: gcc/c-family/c-common.h
===================================================================
--- gcc/c-family/c-common.h	(revision 165498)
+++ gcc/c-family/c-common.h	(working copy)
@@ -143,7 +143,7 @@  enum rid
      they follow '@')  */
   RID_AT_ENCODE,   RID_AT_END,
   RID_AT_CLASS,    RID_AT_ALIAS,     RID_AT_DEFS,
-  RID_AT_PRIVATE,  RID_AT_PROTECTED, RID_AT_PUBLIC,
+  RID_AT_PRIVATE,  RID_AT_PROTECTED, RID_AT_PUBLIC,  RID_AT_PACKAGE,
   RID_AT_PROTOCOL, RID_AT_SELECTOR,
   RID_AT_THROW,	   RID_AT_TRY,       RID_AT_CATCH,
   RID_AT_FINALLY,  RID_AT_SYNCHRONIZED, 
@@ -440,6 +440,14 @@  typedef enum objc_property_attribute_kind {
   OBJC_PATTR_COPIES	= 5
 } objc_property_attribute_kind;
 
+/* ObjC ivar visibility types.  */
+typedef enum objc_ivar_visibility_kind {
+  OBJC_IVAR_VIS_PROTECTED = 0,
+  OBJC_IVAR_VIS_PUBLIC    = 1,
+  OBJC_IVAR_VIS_PRIVATE   = 2,
+  OBJC_IVAR_VIS_PACKAGE   = 3
+} objc_ivar_visibility_kind;
+
 /* The various name of operator that appears in error messages. */
 typedef enum ref_operator {
   /* NULL */
@@ -1009,7 +1017,7 @@  extern void objc_start_class_implementation (tree,
 extern void objc_start_category_implementation (tree, tree);
 extern void objc_continue_implementation (void);
 extern void objc_finish_implementation (void);
-extern void objc_set_visibility (int);
+extern void objc_set_visibility (objc_ivar_visibility_kind);
 extern void objc_set_method_type (enum tree_code);
 extern tree objc_build_method_signature (tree, tree, tree, bool);
 extern void objc_add_method_declaration (tree, tree);
Index: gcc/c-family/stub-objc.c
===================================================================
--- gcc/c-family/stub-objc.c	(revision 165498)
+++ gcc/c-family/stub-objc.c	(working copy)
@@ -163,7 +163,7 @@  objc_add_instance_variable (tree ARG_UNUSED (decl)
 }
 
 void
-objc_set_visibility (int ARG_UNUSED (vis))
+objc_set_visibility (objc_ivar_visibility_kind ARG_UNUSED (vis))
 {
 }
 
Index: gcc/objc/objc-act.c
===================================================================
--- gcc/objc/objc-act.c	(revision 165498)
+++ gcc/objc/objc-act.c	(working copy)
@@ -150,7 +150,7 @@  static void objc_start_function (tree, tree, tree,
 static tree start_protocol (enum tree_code, tree, tree);
 static tree build_method_decl (enum tree_code, tree, tree, tree, bool);
 static tree objc_add_method (tree, tree, int, bool);
-static tree add_instance_variable (tree, int, tree);
+static tree add_instance_variable (tree, objc_ivar_visibility_kind, tree);
 static tree build_ivar_reference (tree);
 static tree is_ivar (tree, tree);
 
@@ -385,7 +385,7 @@  int imp_count = 0;	/* `@implementation' */
 int cat_count = 0;	/* `@category' */
 
 enum tree_code objc_inherit_code;
-int objc_public_flag;
+objc_ivar_visibility_kind objc_ivar_visibility;
 
 /* Use to generate method labels.  */
 static int method_slot = 0;
@@ -734,7 +734,7 @@  objc_start_class_interface (tree klass, tree super
   objc_interface_context
     = objc_ivar_context
     = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos);
-  objc_public_flag = 0;
+  objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
 }
 
 void
@@ -784,7 +784,7 @@  objc_start_class_implementation (tree klass, tree
   objc_implementation_context
     = objc_ivar_context
     = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE);
-  objc_public_flag = 0;
+  objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
 }
 
 void
@@ -822,9 +822,11 @@  objc_finish_implementation (void)
 }
 
 void
-objc_set_visibility (int visibility)
+objc_set_visibility (objc_ivar_visibility_kind visibility)
 {
-  objc_public_flag = visibility;
+  if (visibility == OBJC_IVAR_VIS_PACKAGE)
+    warning (0, "%<@package%> presently has the same effect as %<@public%>");
+  objc_ivar_visibility = visibility;
 }
 
 void
@@ -1352,7 +1354,7 @@  void
 objc_add_instance_variable (tree decl)
 {
   (void) add_instance_variable (objc_ivar_context,
-				objc_public_flag,
+				objc_ivar_visibility,
 				decl);
 }
 
@@ -7795,7 +7797,8 @@  add_category (tree klass, tree category)
    VISIBILITY is 1 for public, 0 for protected, and 2 for private.  */
 
 static tree
-add_instance_variable (tree klass, int visibility, tree field_decl)
+add_instance_variable (tree klass, objc_ivar_visibility_kind visibility, 
+		       tree field_decl)
 {
   tree field_type = TREE_TYPE (field_decl);
   const char *ivar_name = DECL_NAME (field_decl)
@@ -7887,19 +7890,21 @@  static tree
   /* Overload the public attribute, it is not used for FIELD_DECLs.  */
   switch (visibility)
     {
-    case 0:
+    case OBJC_IVAR_VIS_PROTECTED:
       TREE_PUBLIC (field_decl) = 0;
       TREE_PRIVATE (field_decl) = 0;
       TREE_PROTECTED (field_decl) = 1;
       break;
 
-    case 1:
+    case OBJC_IVAR_VIS_PACKAGE:
+    /* TODO: Implement the package variant.  */
+    case OBJC_IVAR_VIS_PUBLIC:
       TREE_PUBLIC (field_decl) = 1;
       TREE_PRIVATE (field_decl) = 0;
       TREE_PROTECTED (field_decl) = 0;
       break;
 
-    case 2:
+    case OBJC_IVAR_VIS_PRIVATE:
       TREE_PUBLIC (field_decl) = 0;
       TREE_PRIVATE (field_decl) = 1;
       TREE_PROTECTED (field_decl) = 0;
@@ -8520,7 +8525,7 @@  objc_gen_one_property_datum (tree klass, tree prop
 				      objc_build_property_ivar_name (property));
       DECL_CONTEXT (field_decl) = record;
       (void) add_instance_variable (klass, 
-				    1, field_decl);
+				    OBJC_IVAR_VIS_PUBLIC, field_decl);
       /* Unfortunately, CLASS_IVARS is completed when interface is completed.
 	 Must add the new ivar by hand to its list here. */
       
Index: gcc/objc/objc-act.h
===================================================================
--- gcc/objc/objc-act.h	(revision 165498)
+++ gcc/objc/objc-act.h	(working copy)
@@ -175,7 +175,7 @@  extern GTY(()) int imp_count;	/* `@implementation'
 extern GTY(()) int cat_count;	/* `@category' */
 
 extern GTY(()) enum tree_code objc_inherit_code;
-extern GTY(()) int objc_public_flag;
+extern GTY(()) objc_ivar_visibility_kind objc_ivar_visibility;
 
 /* Objective-C/Objective-C++ global tree enumeration.  */
 
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c	(revision 165498)
+++ gcc/cp/parser.c	(working copy)
@@ -21356,14 +21356,17 @@  cp_parser_objc_visibility_spec (cp_parser* parser)
   switch (vis->keyword)
     {
     case RID_AT_PRIVATE:
-      objc_set_visibility (2);
+      objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
       break;
     case RID_AT_PROTECTED:
-      objc_set_visibility (0);
+      objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
       break;
     case RID_AT_PUBLIC:
-      objc_set_visibility (1);
+      objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
       break;
+    case RID_AT_PACKAGE:
+      objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
+      break;
     default:
       return;
     }
Index: gcc/c-parser.c
===================================================================
--- gcc/c-parser.c	(revision 165498)
+++ gcc/c-parser.c	(working copy)
@@ -6703,21 +6703,27 @@  c_parser_objc_class_instance_variables (c_parser *
       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
 	{
 	  c_parser_consume_token (parser);
-	  objc_set_visibility (2);
+	  objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
 	  continue;
 	}
       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
 	{
 	  c_parser_consume_token (parser);
-	  objc_set_visibility (0);
+	  objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
 	  continue;
 	}
       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
 	{
 	  c_parser_consume_token (parser);
-	  objc_set_visibility (1);
+	  objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
 	  continue;
 	}
+      else if (c_parser_next_token_is_keyword (parser, RID_AT_PACKAGE))
+	{
+	  c_parser_consume_token (parser);
+	  objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
+	  continue;
+	}
       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
 	{
 	  c_parser_pragma (parser, pragma_external);