# define _ENTITY_H_
# include "ident.h"
-# include "type.h"
/*******************************************************************/
/** general **/
typedef struct ir_graph ir_graph;
#endif
+#ifndef _TYPE_TYPEDEF_
+#define _TYPE_TYPEDEF_
+/* to resolve recursion between entity.h and irgraph.h */
+typedef union type type;
+#endif
+
typedef struct entity entity;
/* create a new entity */
ident *get_entity_ident (entity *ent);
ident *get_entity_ld_name (entity *ent);
+
/*
char *get_entity_ld_name (entity *ent);
-ident *get_entity_ld_ident (entity *ent);
void set_entity_ld_name (entity *ent, char *ld_name);
+
+ident *get_entity_ld_ident (entity *ent);
void set_entity_ld_ident (entity *ent, ident *ld_ident);
*/
# include "type.h"
# include "irprog.h" /* So that constructors can add the type to global
data structure. */
+# include "array.h"
unsigned long type_visited = 0;
res->kind = k_type_class;
res->name = name;
+ res->members = NEW_ARR_F (entity *, 1);
+ res->subtypes = NEW_ARR_F (type_class *, 1);
+ res->supertypes = NEW_ARR_F (type_class *, 1);
// res->n_members = 0;
// res->max_members = members;
// res->member = (entity **) xmalloc (sizeof (entity*) * members);
}
/* manipulate fields of type_class */
-/*
-char *
+char *
get_class_name (type_class *class) {
assert(class);
return ID_TO_STR(class->name);
}
-*/
+/* field: ident */
ident *
get_class_ident (type_class *class) {
assert(class);
void set_class_ident (type_class *class, ident* ident);
*/
+/* field: member */
+void
+add_class_member (type_class *class, entity *member)
+{
+ ARR_APP1 (entity *, class->members, member);
+}
+
+entity *
+get_class_member (type_class *class, int pos)
+{
+ assert (class);
+ return class->members[pos+1];
+}
+
+void
+set_class_member (type_class *class, entity *member, int pos)
+{
+ class->members[pos+1] = member;
+}
+
+/* field: subtype */
+void
+add_class_subtype (type_class *class, type_class *subtype)
+{
+ ARR_APP1 (type_class *, class->subtypes, subtype);
+}
+
+type_class *
+get_class_subtype (type_class *class, int pos)
+{
+ assert (class);
+ return class->subtypes[pos+1];
+}
+
+void
+set_class_subtype (type_class *class, type_class *subtype, int pos)
+{
+ class->subtypes[pos+1] = subtype;
+}
+
+/* field: supertype */
+void
+add_class_supertype (type_class *class, type_class *supertype)
+{
+ ARR_APP1 (type_class *, class->supertypes, supertype);
+}
+
+type_class *
+get_class_supertype (type_class *class, int pos)
+{
+ assert (class);
+ return class->supertypes[pos+1];
+}
+
+void
+set_class_supertype (type_class *class, type_class *supertype, int pos)
+{
+ class->supertypes[pos+1] = supertype;
+}
/*******************************************************************/
/** TYPE_STRCT **/
# include "common.h"
# include "ident.h"
# include "irmode.h"
+# include "entity.h"
/* for recursive type definiton */
+#ifndef _TYPE_TYPEDEF_
+#define _TYPE_TYPEDEF_
+/* to resolve recursion between entity.h and irgraph.h */
typedef union type type;
+#endif
/* visited flag to traverse the type information */
extern unsigned long type_visited;
/** TYPE_CLASS **/
/*******************************************************************/
-typedef struct {
+typedef struct type_class type_class;
+
+struct type_class {
firm_kind kind;
- ident *name;
- /** needs list with it's entities -- does it really??
- Entities can be added during their creation.
- entities **member; **/
- /** to represent inheritance
- type_class **subtypes; * direct subtypes *
- type_class **supertypes; * direct supertypes *
- **/
- unsigned long visit; /* visited counter for walks of the type information */
-} type_class;
+ ident *name; /* needs list with it's entities
+ does it really??
+ Entities can be added during their creation. */
+ struct entity **members; /* to represent inheritance */
+ type_class **subtypes; /* direct subtypes */
+ type_class **supertypes; /* direct supertypes */
+ unsigned long visit; /* visited counter for walks of
+ the type information */
+};
/* create a new type_class */
type_class *new_type_class (ident *name);
/* manipulate fields of type_class */
-char *get_class_name (type_class *clss);
-ident *get_class_ident (type_class *clss);
-/*
-void set_class_name (type_class *clss, char *name);
-void set_class_ident (type_class *clss, ident* ident);
+
+char *get_class_name (type_class *class);
+ident *get_class_ident (type_class *class);
+
+/* Not necessary now!
+void set_class_name (type_class *class, char *name);
+void set_class_ident (type_class *class, ident* ident);
*/
+void add_class_member (type_class *class, entity *member);
+entity *get_class_member (type_class *class, int pos);
+void set_class_member (type_class *class, entity *member, int pos);
+
+void add_class_subtype (type_class *class, type_class *subtype);
+type_class *get_class_subtype (type_class *class, int pos);
+void set_class_subtype (type_class *class, type_class *subtype, int pos);
+
+void add_class_supertype (type_class *class, type_class *supertype);
+type_class *get_class_supertype (type_class *class, int pos);
+void set_class_supertype (type_class *class, type_class *supertype, int pos);
+
+
/* get_class_entity_arr
get_class_n_entities
get_class_entity(class, pos)
type_primitive primitive;
};
+
int is_type(void *thing);