Created Tuesday 20 May 2008
WARNING: Deprecated. See instead Dispatched Objects
table distribuée: entre tous les modules ⇒ présente en un seul exemplaire ⇒ fournie par le programme principal ⇒ un symbole commun, par exemple lisaac_type_table ⇒ à expansion dynamique : utilise la mémoire dynamique : malloc(), free()
Proposition de structure:
struct { long long typehash; const char *typeid; // '\0' terminated // ... (@ des slots) } **lisaac_type_table;
Chaque objet non Expanded (les objets Expanded sont forcément Strict ... et donc leur type est connu à la compilation) contiendra un pointeur vers leur type dans cette table. Le type des objets peut donc ainsi être facilement comparé pisqu'il suffit de faire une comparaison de pointeurs.
(essai) ./lisaac-dynamic-binding.odg
On peut imaginer un prototype :
Section Header
+ name := STATIC_TYPE
Section Mapping
+ static_type :TYPE; + dynamic_type :DYNAMIC_TYPE;
+ plus_slot_1; + plus_slot_2; ...
et : Section Header
+ name := DYNAMIC_TYPE;
Section Inherit
+ type :Expanded STATIC_TYPE;
Un objet sera de type STATIC_TYPE lorsqu'il sera passé sur une interface implémentant cette ABI. Il sera possible de déterminer son type dynamique avec le pointeur dynamic_type.