46 lines
2.1 KiB
Plaintext
46 lines
2.1 KiB
Plaintext
|
TRProg:
|
|||
|
=======
|
|||
|
|
|||
|
In TRProg werden zun<75>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 <20>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<EFBFBD>r jede der n Methoden wird TRNext aufgerufen, der m Triples (sigma_j, ty_j, V_j) zur<75>ck gibt.
|
|||
|
D.h. m m<>gliche Typkombinationen f<>r diese eine Methode.
|
|||
|
F<EFBFBD>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<65>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<EFBFBD>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<75>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 <20>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<65>cksichtigt, d.h. entsprechende Substitutionen gleich durchgef<65>hrt.
|