(encode_aggregate_within): New function.
authorRichard Kenner <kenner@gcc.gnu.org>
Sun, 2 Feb 1997 13:24:57 +0000 (08:24 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Sun, 2 Feb 1997 13:24:57 +0000 (08:24 -0500)
(encode_aggregate): Generates encodings for unions similar to those for
structs except surrounded by parenthesis instead of braces.

From-SVN: r13583

gcc/objc/objc-act.c

index bb9329d08a03756200365e47dc8c127e178ea58a..7eefa02afcaaabdb164fd2b6590938f1ece94e3b 100644 (file)
@@ -1,5 +1,5 @@
 /* Implement classes and message passing for Objective C.
-   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
    Contributed by Steve Naroff.
 
 This file is part of GNU CC.
@@ -6453,151 +6453,139 @@ encode_array (type, curtype, format)
 }
 \f
 static void
-encode_aggregate (type, curtype, format)
+encode_aggregate_within (type, curtype, format, left, right)
      tree type;
      int curtype;
      int format;
+     char left;
+     char right;
 {
-  enum tree_code code = TREE_CODE (type);
-
-  switch (code)
+  if (obstack_object_size (&util_obstack) > 0
+      && *(obstack_next_free (&util_obstack) - 1) == '^')
     {
-    case RECORD_TYPE:
-      {
-       if (obstack_object_size (&util_obstack) > 0
-           && *(obstack_next_free (&util_obstack) - 1) == '^')
-         {
-           tree name = TYPE_NAME (type);
+      tree name = TYPE_NAME (type);
 
-           /* We have a reference; this is a NeXT extension.  */
+      /* we have a reference; this is a NeXT extension. */
 
-           if (obstack_object_size (&util_obstack) - curtype == 1
-               && format == OBJC_ENCODE_INLINE_DEFS)
-             {
-               /* Output format of struct for first level only.  */
-               tree fields = TYPE_FIELDS (type);
+      if (obstack_object_size (&util_obstack) - curtype == 1
+         && format == OBJC_ENCODE_INLINE_DEFS)
+       {
+         /* Output format of struct for first level only. */
+         tree fields = TYPE_FIELDS (type);
 
-               if (name && TREE_CODE (name) == IDENTIFIER_NODE)
-                 {
-                   obstack_1grow (&util_obstack, '{');
-                   obstack_grow (&util_obstack,
-                                 IDENTIFIER_POINTER (name),
-                                 strlen (IDENTIFIER_POINTER (name)));
-                   obstack_1grow (&util_obstack, '=');
-                 }
+         if (name && TREE_CODE (name) == IDENTIFIER_NODE)
+           {
+             obstack_1grow (&util_obstack, left);
+             obstack_grow (&util_obstack,
+                           IDENTIFIER_POINTER (name),
+                           strlen (IDENTIFIER_POINTER (name)));
+             obstack_1grow (&util_obstack, '=');
+           }
+         else
+           {
+             obstack_1grow (&util_obstack, left);
+             obstack_grow (&util_obstack, "?=", 2);
+           }
 
-               else
-                 obstack_grow (&util_obstack, "{?=", 3);
+         for ( ; fields; fields = TREE_CHAIN (fields))
+             encode_field_decl (fields, curtype, format);
 
-               for ( ; fields; fields = TREE_CHAIN (fields))
-                 encode_field_decl (fields, curtype, format);
+         obstack_1grow (&util_obstack, right);
+       }
 
-               obstack_1grow (&util_obstack, '}');
-             }
+      else if (name && TREE_CODE (name) == IDENTIFIER_NODE)
+       {
+         obstack_1grow (&util_obstack, left);
+         obstack_grow (&util_obstack,
+                       IDENTIFIER_POINTER (name),
+                       strlen (IDENTIFIER_POINTER (name)));
+         obstack_1grow (&util_obstack, right);
+       }
 
-            else if (name && TREE_CODE (name) == IDENTIFIER_NODE)
-             {
-               obstack_1grow (&util_obstack, '{');
-               obstack_grow (&util_obstack,
-                             IDENTIFIER_POINTER (name),
-                             strlen (IDENTIFIER_POINTER (name)));
-               obstack_1grow (&util_obstack, '}');
-             }
+      else
+       {
+         /* We have an untagged structure or a typedef. */
+         obstack_1grow (&util_obstack, left);
+         obstack_1grow (&util_obstack, '?');
+         obstack_1grow (&util_obstack, right);
+       }
+    }
 
-           else
-             /* We have an untagged structure or a typedef.  */
-             obstack_grow (&util_obstack, "{?}", 3);
-         }
+  else
+    {
+      tree name = TYPE_NAME (type);
+      tree fields = TYPE_FIELDS (type);
 
-       else
-         {
-           tree name = TYPE_NAME (type);
-           tree fields = TYPE_FIELDS (type);
+      if (format == OBJC_ENCODE_INLINE_DEFS
+         || generating_instance_variables)
+       {
+         obstack_1grow (&util_obstack, left);
+         if (name && TREE_CODE (name) == IDENTIFIER_NODE)
+             obstack_grow (&util_obstack,
+                         IDENTIFIER_POINTER (name),
+                         strlen (IDENTIFIER_POINTER (name)));
+         else
+             obstack_1grow (&util_obstack, '?');
 
-           if (format == OBJC_ENCODE_INLINE_DEFS
-               || generating_instance_variables)
-             {
-               obstack_1grow (&util_obstack, '{');
-               if (name && TREE_CODE (name) == IDENTIFIER_NODE)
-                 obstack_grow (&util_obstack,
-                               IDENTIFIER_POINTER (name),
-                               strlen (IDENTIFIER_POINTER (name)));
+         obstack_1grow (&util_obstack, '=');
 
-               else
-                 obstack_1grow (&util_obstack, '?');
+         for (; fields; fields = TREE_CHAIN (fields))
+           {
+             if (generating_instance_variables)
+               {
+                 tree fname = DECL_NAME (fields);
 
-               obstack_1grow (&util_obstack, '=');
+                 obstack_1grow (&util_obstack, '"');
+                 if (fname && TREE_CODE (fname) == IDENTIFIER_NODE)
+                   {
+                     obstack_grow (&util_obstack,
+                                   IDENTIFIER_POINTER (fname),
+                                   strlen (IDENTIFIER_POINTER (fname)));
+                   }
 
-               for (; fields; fields = TREE_CHAIN (fields))
-                 {
-                  if (generating_instance_variables)
-                    {
-                      tree fname = DECL_NAME (fields);
-
-                     obstack_1grow (&util_obstack, '"');
-                     if (fname && TREE_CODE (fname) == IDENTIFIER_NODE)
-                       {
-                         obstack_grow (&util_obstack,
-                                       IDENTIFIER_POINTER (fname),
-                                       strlen (IDENTIFIER_POINTER (fname)));
-                       }
+                 obstack_1grow (&util_obstack, '"');
+               }
 
-                     obstack_1grow (&util_obstack, '"');
-                    }
+             encode_field_decl (fields, curtype, format);
+           }
 
-                 encode_field_decl (fields, curtype, format);
-                 }
+         obstack_1grow (&util_obstack, right);
+       }
 
-               obstack_1grow (&util_obstack, '}');
-             }
+      else
+       {
+         obstack_1grow (&util_obstack, left);
+         if (name && TREE_CODE (name) == IDENTIFIER_NODE)
+             obstack_grow (&util_obstack,
+                           IDENTIFIER_POINTER (name),
+                           strlen (IDENTIFIER_POINTER (name)));
+         else
+             /* We have an untagged structure or a typedef. */
+             obstack_1grow (&util_obstack, '?');
 
-           else
-             {
-               obstack_1grow (&util_obstack, '{');
-               if (name && TREE_CODE (name) == IDENTIFIER_NODE)
-                 obstack_grow (&util_obstack,
-                               IDENTIFIER_POINTER (name),
-                               strlen (IDENTIFIER_POINTER (name)));
-               else
-                 /* We have an untagged structure or a typedef.  */
-                 obstack_1grow (&util_obstack, '?');
-
-               obstack_1grow (&util_obstack, '}');
-             }
-         }
+         obstack_1grow (&util_obstack, right);
+       }
+    }
+}
+
+static void
+encode_aggregate (type, curtype, format)
+     tree type;
+     int curtype;
+     int format;
+{
+  enum tree_code code = TREE_CODE (type);
+
+  switch (code)
+    {
+    case RECORD_TYPE:
+      {
+       encode_aggregate_within(type, curtype, format, '{', '}');
        break;
       }
-
     case UNION_TYPE:
       {
-       if (*obstack_next_free (&util_obstack) == '^'
-           || format != OBJC_ENCODE_INLINE_DEFS)
-         {
-           /* We have a reference (this is a NeXT extension)
-              or we don't want the details.  */
-            if (TYPE_NAME (type)
-               && TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
-             {
-               obstack_1grow (&util_obstack, '(');
-               obstack_grow (&util_obstack,
-                             IDENTIFIER_POINTER (TYPE_NAME (type)),
-                             strlen (IDENTIFIER_POINTER (TYPE_NAME (type))));
-               obstack_1grow (&util_obstack, ')');
-             }
-
-           else
-             /* We have an untagged structure or a typedef.  */
-             obstack_grow (&util_obstack, "(?)", 3);
-         }
-       else
-         {
-           tree fields = TYPE_FIELDS (type);
-           obstack_1grow (&util_obstack, '(');
-           for ( ; fields; fields = TREE_CHAIN (fields))
-             encode_field_decl (fields, curtype, format);
-
-           obstack_1grow (&util_obstack, ')');
-         }
+       encode_aggregate_within(type, curtype, format, '(', ')');
        break;
       }