(build_encode_expr): Terminate the encode string with a null.

(encode_aggregate): Distinguish pointer to record from a
record.  Output fields for record.  Fix unions.

From-SVN: r2896
This commit is contained in:
Richard Stallman 1992-12-19 09:04:47 +00:00
parent 0e9934c8fc
commit b53241dce5
1 changed files with 47 additions and 23 deletions

View File

@ -2951,6 +2951,7 @@ build_encode_expr (type)
fatal ("Objective-C text in C source file"); fatal ("Objective-C text in C source file");
encode_type (type, OBJC_ENCODE_INLINE_DEFS); encode_type (type, OBJC_ENCODE_INLINE_DEFS);
obstack_1grow (&util_obstack, 0); /* null terminate string */
string = obstack_finish (&util_obstack); string = obstack_finish (&util_obstack);
/* synthesize a string that represents the encoded struct/union */ /* synthesize a string that represents the encoded struct/union */
@ -3749,63 +3750,86 @@ encode_aggregate (type, format)
{ {
case RECORD_TYPE: case RECORD_TYPE:
{ {
if (*obstack_next_free (&util_obstack) == '^' int have_pointer = 0;
|| format != OBJC_ENCODE_INLINE_DEFS)
if (obstack_object_size (&util_obstack) > 0
&& *(obstack_next_free (&util_obstack)-1) == '^')
have_pointer = 1;
obstack_1grow (&util_obstack, '{');
if (TYPE_NAME (type))
{ {
/* we have a reference - this is a NeXT extension-- if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
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,
obstack_grow (&util_obstack,
IDENTIFIER_POINTER (TYPE_NAME (type)), IDENTIFIER_POINTER (TYPE_NAME (type)),
strlen (IDENTIFIER_POINTER (TYPE_NAME (type)))); strlen (IDENTIFIER_POINTER (TYPE_NAME (type))));
obstack_1grow (&util_obstack, '}');
} }
else /* we have an untagged structure or a typedef */ else /* we have an untagged structure or a typedef */
obstack_grow (&util_obstack, "{?}", 3); {
obstack_1grow (&util_obstack, '?');
}
}
if (have_pointer
|| format == OBJC_ENCODE_DONT_INLINE_DEFS)
{
/* we have a pointer
or we don't want the details. */
obstack_1grow (&util_obstack, '}');
} }
else else
{ {
tree fields = TYPE_FIELDS (type); tree fields = TYPE_FIELDS (type);
obstack_1grow (&util_obstack, '{'); obstack_1grow (&util_obstack, '=');
for ( ; fields; fields = TREE_CHAIN (fields)) for ( ; fields; fields = TREE_CHAIN (fields))
encode_field_decl (fields, format); encode_field_decl (fields, format);
obstack_1grow (&util_obstack, '}'); obstack_1grow (&util_obstack, '}');
} }
break; break;
} }
case UNION_TYPE: case UNION_TYPE:
{ {
if (*obstack_next_free (&util_obstack) == '^' int have_pointer = 0;
|| format != OBJC_ENCODE_INLINE_DEFS)
if (obstack_object_size (&util_obstack) > 0
&& *(obstack_next_free (&util_obstack)-1) == '^')
have_pointer = 1;
obstack_1grow (&util_obstack, '(');
if (have_pointer && TYPE_NAME (type))
{ {
/* we have a reference - this is a NeXT extension-- if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
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,
obstack_grow (&util_obstack,
IDENTIFIER_POINTER (TYPE_NAME (type)), IDENTIFIER_POINTER (TYPE_NAME (type)),
strlen (IDENTIFIER_POINTER (TYPE_NAME (type)))); strlen (IDENTIFIER_POINTER (TYPE_NAME (type))));
obstack_1grow (&util_obstack, '>');
} }
else /* we have an untagged structure or a typedef */ else /* we have an untagged structure or a typedef */
obstack_grow (&util_obstack, "<?>", 3); {
obstack_1grow (&util_obstack, '?');
}
}
if (have_pointer
|| format == OBJC_ENCODE_DONT_INLINE_DEFS)
{
/* we have a pointer
or we don't want the details. */
obstack_1grow (&util_obstack, ')');
} }
else else
{ {
tree fields = TYPE_FIELDS (type); tree fields = TYPE_FIELDS (type);
obstack_1grow (&util_obstack, '<');
for ( ; fields; fields = TREE_CHAIN (fields)) for ( ; fields; fields = TREE_CHAIN (fields))
encode_field_decl (fields, format); encode_field_decl (fields, format);
obstack_1grow (&util_obstack, '>'); obstack_1grow (&util_obstack, ')');
} }
break; break;
} }
case ENUMERAL_TYPE: case ENUMERAL_TYPE:
obstack_1grow (&util_obstack, 'i'); obstack_1grow (&util_obstack, 'i');
break; break;