X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=testprograms%2Finheritance_example.c;h=a13c3da632eac6b2af3c012e8b20a5e6eb98fac2;hb=e569ea0a211514dcb0d96207d2600dd0fb18e23b;hp=4cc155d8c166e53bb9f5cf46cc637c49528e2666;hpb=c133b9328891403004aabc67e05f1541e286e98b;p=libfirm diff --git a/testprograms/inheritance_example.c b/testprograms/inheritance_example.c index 4cc155d8c..a13c3da63 100644 --- a/testprograms/inheritance_example.c +++ b/testprograms/inheritance_example.c @@ -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 { @@ -36,13 +37,11 @@ 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();