46 lines
2.1 KiB
Plaintext
Executable File
46 lines
2.1 KiB
Plaintext
Executable File
TRProg:
|
|
=======
|
|
|
|
In TRProg werden zunächst die unterschiedlichen Mengen von Typannahmen zusammengebaut.
|
|
|
|
V_fields_methods:
|
|
Die Typannahmen aller Membervariablen und aller Methoden (Parametertypen und Rückgabetyp)
|
|
|
|
V_1 bis V_n:
|
|
Die Typannahmen aller Parameter einer Methode V_i als Typannahmen für lokale Variablen.
|
|
|
|
Danach wird TRStart gerufen, dessen Rückgabewert eine Menge von 2-Tupeln aus Unifiern und
|
|
Mengen von Typannahmen ist. Diese Tupel müssen eventuell noch über einen Intersection-Typ
|
|
strukturiert werden, bilden aber prinzipiell das Ergebnis des Typrekonstruktionsalgorithmus:
|
|
Alle möglichen Typkombinationen für diese Klasse in Form von unterschiedlichen Typannahmemengen.
|
|
|
|
|
|
TRStart:
|
|
========
|
|
|
|
TRStart bekommt als Argumente n TypeAssumptionSets V_n für jede der n Methoden eine.
|
|
|
|
Für jede der n Methoden wird TRNext aufgerufen, der m Triples (sigma_j, ty_j, V_j) zurück gibt.
|
|
D.h. m mögliche Typkombinationen für diese eine Methode.
|
|
Für jede der m Möglichkeiten wird daraufhin eine Menge von möglichen Unifier für den ReturnType berechnet.
|
|
|
|
Dann wird auf jedes V_j der m Möglichkeiten alle zugehörigen Unifier unify element unify_j angewendet
|
|
und eine Menge von Tupeln (sigma_z, V_z) gebildet. Diese Mengen von Tupeln aller V_j werden zu einer
|
|
Ergebnismenge vereinigt.
|
|
|
|
Dieser ganze Ablauf passiert für jede der m Methode n Mal, wobei die Erkenntnisse der vorher gehenden
|
|
Durchläufe immer als Eingabewert für den nächste Durchlauf dienen.
|
|
Nach dem letzten Durchlauf wird die Ergebnismenge von Tupeln (sigma, V) von TRStart zurückgegeben.
|
|
|
|
|
|
TRNext:
|
|
=======
|
|
|
|
TRNext hat im Prinzip die Aufgabe, die bisherigen Teilergebnisse in Form von Typannahmen um weitere
|
|
Informationen aus der aktuellen Methode zu erweitern.
|
|
|
|
Dabei werden für alle n V_i der übergebenen Tupel (sigma, V) TRStatement des Blocks der aktuellen Methode
|
|
aufgerufen. Zuvor werden aus dem jeweiligen V_i noch die Typannahmen für die Parameter der letzten Methode
|
|
(als lokale Variable) entfernt und um die Typannahmen der neuen Parameter (als lokale Variablen) erweitert.
|
|
Dabei werden die bisher ermittelten Unifier berücksichtigt, d.h. entsprechende Substitutionen gleich durchgeführt.
|