From 71ccd1fc5539b5120914e4a3c8a9f5eb1547739e Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Sun, 2 Feb 1997 08:24:57 -0500 Subject: [PATCH] (encode_aggregate_within): New function. (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 | 228 +++++++++++++++++++++----------------------- 1 file 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; } -- 2.30.2