Commit 71ccd1fc by Richard Kenner

(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
parent ec0bc8b6
/* Implement classes and message passing for Objective C. /* 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. Contributed by Steve Naroff.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -6453,151 +6453,139 @@ encode_array (type, curtype, format) ...@@ -6453,151 +6453,139 @@ encode_array (type, curtype, format)
} }
static void static void
encode_aggregate (type, curtype, format) encode_aggregate_within (type, curtype, format, left, right)
tree type; tree type;
int curtype; int curtype;
int format; int format;
char left;
char right;
{ {
enum tree_code code = TREE_CODE (type); if (obstack_object_size (&util_obstack) > 0
&& *(obstack_next_free (&util_obstack) - 1) == '^')
switch (code)
{ {
case RECORD_TYPE: tree name = TYPE_NAME (type);
{
if (obstack_object_size (&util_obstack) > 0
&& *(obstack_next_free (&util_obstack) - 1) == '^')
{
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 if (obstack_object_size (&util_obstack) - curtype == 1
&& format == OBJC_ENCODE_INLINE_DEFS) && format == OBJC_ENCODE_INLINE_DEFS)
{ {
/* Output format of struct for first level only. */ /* Output format of struct for first level only. */
tree fields = TYPE_FIELDS (type); tree fields = TYPE_FIELDS (type);
if (name && TREE_CODE (name) == IDENTIFIER_NODE) if (name && TREE_CODE (name) == IDENTIFIER_NODE)
{ {
obstack_1grow (&util_obstack, '{'); obstack_1grow (&util_obstack, left);
obstack_grow (&util_obstack, obstack_grow (&util_obstack,
IDENTIFIER_POINTER (name), IDENTIFIER_POINTER (name),
strlen (IDENTIFIER_POINTER (name))); strlen (IDENTIFIER_POINTER (name)));
obstack_1grow (&util_obstack, '='); obstack_1grow (&util_obstack, '=');
} }
else
{
obstack_1grow (&util_obstack, left);
obstack_grow (&util_obstack, "?=", 2);
}
else for ( ; fields; fields = TREE_CHAIN (fields))
obstack_grow (&util_obstack, "{?=", 3); encode_field_decl (fields, curtype, format);
for ( ; fields; fields = TREE_CHAIN (fields)) obstack_1grow (&util_obstack, right);
encode_field_decl (fields, curtype, format); }
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) else
{ {
obstack_1grow (&util_obstack, '{'); /* We have an untagged structure or a typedef. */
obstack_grow (&util_obstack, obstack_1grow (&util_obstack, left);
IDENTIFIER_POINTER (name), obstack_1grow (&util_obstack, '?');
strlen (IDENTIFIER_POINTER (name))); obstack_1grow (&util_obstack, right);
obstack_1grow (&util_obstack, '}'); }
} }
else else
/* We have an untagged structure or a typedef. */ {
obstack_grow (&util_obstack, "{?}", 3); tree name = TYPE_NAME (type);
} tree fields = TYPE_FIELDS (type);
else if (format == OBJC_ENCODE_INLINE_DEFS
{ || generating_instance_variables)
tree name = TYPE_NAME (type); {
tree fields = TYPE_FIELDS (type); 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 obstack_1grow (&util_obstack, '=');
|| 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)));
else for (; fields; fields = TREE_CHAIN (fields))
obstack_1grow (&util_obstack, '?'); {
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)) obstack_1grow (&util_obstack, '"');
{ }
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, '"'); 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, right);
{ }
obstack_1grow (&util_obstack, '{'); }
if (name && TREE_CODE (name) == IDENTIFIER_NODE) }
obstack_grow (&util_obstack,
IDENTIFIER_POINTER (name), static void
strlen (IDENTIFIER_POINTER (name))); encode_aggregate (type, curtype, format)
else tree type;
/* We have an untagged structure or a typedef. */ int curtype;
obstack_1grow (&util_obstack, '?'); int format;
{
obstack_1grow (&util_obstack, '}'); enum tree_code code = TREE_CODE (type);
}
} switch (code)
{
case RECORD_TYPE:
{
encode_aggregate_within(type, curtype, format, '{', '}');
break; break;
} }
case UNION_TYPE: case UNION_TYPE:
{ {
if (*obstack_next_free (&util_obstack) == '^' encode_aggregate_within(type, curtype, format, '(', ')');
|| 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, ')');
}
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment