New
[libfirm] / testprograms / inheritance_example.c
index 4cc155d..a13c3da 100644 (file)
@@ -12,7 +12,8 @@
 # include "firm.h"
 
 /**
-***  This file constructs type information for the following pseudo-program:
+***  This file constructs type information for the following pseudo-program.
+***  The procedure code is not constructed.
 ***
 ***  interface I {
 ***    void m1 (void);
@@ -24,7 +25,7 @@
 ***  }
 ***
 ***  class D {
-***    int a;
+***    int b;
 ***  }
 ***
 ***  class E extends C, D {
 
 int main(int argc, char **argv)
 {
-  ident *ii, *ci, *di, *ei, *m1i, *m2i, *inti, *ai; /* suffix i names identifiers */
-  type_class  *it, *ct, *dt, *et;                   /*        t names types       */
-  type_method *m1t, *m2t;
-  type_primitive *intt;
-  entity *c_m1e, *c_m2e, *e_m2e, *d_ae, *e_ae;        /*        e names entities    */
-
-  ir_node *x;
+  ident *ii, *ci, *di, *ei, *m1i, *m2i, *inti, *ai, *bi; /* suffix i names identifiers */
+  type  *it, *ct, *dt, *et;                              /*        t names types       */
+  type  *m1t, *m2t;
+  type  *intt;
+  entity *i_m1e, *c_m1e, *c_m2e, *e_m2e, *d_be, *e_ae;   /*        e names entities    */
 
   printf("\nCreating type information...\n");
 
@@ -58,35 +57,45 @@ int main(int argc, char **argv)
   m2i = id_from_str("m2", strlen("m2"));
   inti= id_from_str("int",strlen("int"));
   ai  = id_from_str("a",  strlen("a"));
+  bi  = id_from_str("b",  strlen("b"));
 
   /** make the type information needed */
   /* Language defined types */
   intt = new_type_primitive(inti, mode_I);
   /* Program defined types */
-  it = new_type_class(ii);
+  it = new_type_class(ii);           /* The fact that this is an interface is
+                                       of no interest.  It's just a class without
+                                       fields and implementations.  But the
+                                       implementation will never be needed. */
   ct = new_type_class(ci);
   dt = new_type_class(di);
   et = new_type_class(ei);
+                                     /* Methods with the same type should use the same
+                                       method type information! */
   m1t = new_type_method(m1i, 0, 0);  /* 0 parameters, 0 results */
   m2t = new_type_method(m2i, 1, 0);  /* 1 parameter, 0 results */
 
   /** add structure to type graph **/
   /* parameters of methods */
-  set_method_param_type(m2t, 0, (type *)intt);
-  /* inheritance */
+  set_method_param_type(m2t, 0, intt);
+  /* inheritance. The other direction is added automatically. */
   add_class_subtype(it, ct);
   add_class_subtype(ct, et);
   add_class_subtype(dt, et);
-  add_class_supertype(ct, it);
-  add_class_supertype(et, ct);
-  add_class_supertype(et, dt);
 
   /** make entities **/
-  c_m1e = new_entity((type *)ct, m1i, (type *)m1t);
-  c_m2e = new_entity((type *)ct, m2i, (type *)m2t);
-  e_m2e = new_entity((type *)et, m2i, (type *)m2t);
-  d_ae = new_entity((type *)dt, ai, (type *)intt);
-  e_ae = new_entity((type *)et, ai, (type *)intt);
+  i_m1e = new_entity(it, m1i, m1t);
+  c_m1e = new_entity(ct, m1i, m1t);
+  c_m2e = new_entity(ct, m2i, m2t);
+  e_m2e = new_entity(et, m2i, m2t);
+  d_be  = new_entity(dt, bi, intt);
+  e_ae  = new_entity(et, ai, intt);
+
+  /** Add overwirtes relation **/
+  /* How these edges are added depends on the source language. */
+  add_entity_overwrites (c_m1e, i_m1e);
+  add_entity_overwrites (e_m2e, c_m2e);
+
 
   printf("Done building the graph.  Dumping it.\n");
   dump_all_types();