* symtab.h: target_type is not used in record types.
Eliminate TYPE_MAIN_VARIANT and TYPE_NEXT_VARIANT. Eliminate
- lookup_method_type.
+ lookup_method_type. Add TYPE_TYPE_SPECIFIC macro.
* symtab.c (lookup_member_type): Don't chain them up, just
allocate one in symbol_obstack when we need one.
* mipsread.c: Eliminate "template" types. Build new, real
types whenever we need them. Allocate cplus structures as needed.
Bulletproof the type parsing a bit more. Mark storage leaks.
+ (parse_type): Copy TYPE_TYPE_SPECIFIC when copying a real type
+ on top of a partial type.
Fri Nov 22 16:39:57 1991 John Gilmore (gnu at cygnus.com)
TIR *t;
struct type *tp = 0, *tp1;
char *fmt;
+ int i;
/* Procedures start off by one */
if (sh->st == stProc || sh->st == stStaticProc)
*/
TYPE_CODE(tp1) = TYPE_CODE(tp);
TYPE_NAME(tp1) = obsavestring(name, strlen(name));
- if (TYPE_CODE(tp1) == TYPE_CODE_ENUM) {
- int i;
+ TYPE_TYPE_SPECIFIC(tp1) = TYPE_TYPE_SPECIFIC(tp);
+ /* Now do cleanup based on the final type. */
+ switch (TYPE_CODE (tp1)) {
+ case TYPE_CODE_ENUM:
for (i = 0; i < TYPE_NFIELDS(tp1); i++)
- make_enum_constant(&TYPE_FIELD(tp1,i), tp1);
+ make_enum_constant(&TYPE_FIELD(tp1,i),
+ tp1);
+ break;
}
}
if (tp1 != tp) {
int vptr_fieldno;
/* Slot to point to additional language-specific fields of this type. */
- union
+ union type_specific
{
struct type **arg_types;
struct cplus_struct_type *cplus_stuff;
#define TYPE_FN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->fn_fields
#define TYPE_NFN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields
#define TYPE_NFN_FIELDS_TOTAL(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields_total
+#define TYPE_TYPE_SPECIFIC(thistype) (thistype)->type_specific
#define TYPE_ARG_TYPES(thistype) (thistype)->type_specific.arg_types
#define TYPE_CPLUS_SPECIFIC(thistype) (thistype)->type_specific.cplus_stuff
#define TYPE_BASECLASS(thistype,index) (thistype)->fields[index].type