summaryrefslogtreecommitdiff
path: root/gcc/objc/objc-act.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1997-02-02 13:24:57 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1997-02-02 13:24:57 +0000
commit44db284356824c90a9c092c7e4abfcd0f951f16e (patch)
tree6189e04eacd93c346bf27e6460cd86dc125d1d6b /gcc/objc/objc-act.c
parent459ccba5a6e8409e1a17a392809f0ac3acc587b1 (diff)
downloadgcc-44db284356824c90a9c092c7e4abfcd0f951f16e.tar.gz
(encode_aggregate_within): New function.
(encode_aggregate): Generates encodings for unions similar to those for structs except surrounded by parenthesis instead of braces. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@13583 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/objc/objc-act.c')
-rw-r--r--gcc/objc/objc-act.c228
1 files changed, 108 insertions, 120 deletions
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index bb9329d08a0..7eefa02afca 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -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)
}
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;
}