-/* Collect the entity representing the implementation of this
- entity (not the same if inherited) and all entities for overwriting
- implementations in "set".
- If the implementation of the method is not included in the
- compilation unit "open" is set to true.
- A recursive descend in the overwritten relation.
- Cycle-free, therefore must terminate. */
-void collect_impls(entity *method, eset *set, int *size, bool *open) {
- int i;
- if (get_entity_peculiarity(method) == existent) {
- if (get_entity_visibility(method) == external_allocated) {
- assert(get_entity_irg(method) == NULL);
- *open = true;
- } else {
- assert(get_entity_irg(method) != NULL);
- if (!eset_contains(set, method)) {
- eset_insert(set, method);
- ++(*size);
- }
- }
- }
- if (get_entity_peculiarity(method) == inherited) {
- entity *impl_ent = get_inherited_methods_implementation(method);
- assert(impl_ent && "no implementation for inherited entity");
- if (get_entity_visibility(impl_ent) == external_allocated) {
- assert(get_entity_irg(impl_ent) == NULL);
- *open = true;
- } else {
- assert(get_entity_irg(impl_ent) != NULL);
- if (!eset_contains(set, impl_ent)) {
- eset_insert(set, impl_ent);
- ++(*size);
- }
- }
- }
- /** recursive descend **/
- for (i = get_entity_n_overwrittenby(method) - 1; i >= 0; --i)
- collect_impls(get_entity_overwrittenby(method, i), set, size, open);
-}
-
-
-/* Alle Methoden bestimmen, die die übergebene Methode überschreiben
- * (und implementieren). In der zurückgegebenen Reihung kommt jede
- * Methode nur einmal vor. Der Wert 'NULL' steht für unbekannte
- * (externe) Methoden. Die zurückgegebene Reihung muß vom Aufrufer
- * wieder freigegeben werden (siehe "DEL_ARR_F"). Gibt es überhaupt
- * keine Methoden, die die "method" überschreiben, so gibt die Methode
- * "NULL" zurück. */
-static entity ** get_impl_methods(entity * method) {
- eset * set = eset_create();
- int size = 0;
- entity ** arr;
- bool open = false;