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.
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;
}
......
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