Hoi 
Heb zelf een compiler geschreven die een java-achtig taaltje omzet in ANSI-C. Nu zit ik bij het genereren van C code voor het aanroepen van methods met een probleempje.
Deze code: obj.f(1,2,3); Waar obj van class-type 'A' is vertaalt naar iets als dit in ansi-c (zonder type casts etc om het duidelijk te houden)
((tmp = (obj))->vtable->f_A)(tmp, 1, 2, 3);
Uit het object wordt dus via zijn virtual/dispatch table het functie adres gehaald, en die wordt dan aangeroepen met het object als argument ('this' pointer)
Het gaat eigenlijk om die 'tmp'. Die is nodig omdat 'obj' ook een expressie kan zijn, bv een functie-call resultaat. Ik kan die expressie dus niet 2x evalueren, want dan zou ik een functie twee keer aan kunnen roepen.
(bv.: ((tmp = (foo()))->vtable->f_A(tmp, 1, 2, 3);)
Nou werkt het met die tmp op zich goed, maar ansi-C heet geen regels voor de orde van evaluatie van functie argumenten (woei). Dit is niet juist in ansi-c:
foo(buffer[2], buffer = null); (want als rechts naar links dan null[2], crash)
Dit gaat bij mij fout als ik deze code compile:
obj1.f(obj2.g(), 2, 3);
Vertaald naar:
((tmp = (obj1))->vtable->f_A)(tmp, ((tmp = (obj2))->vtable->g_B)(tmp), 2, 3);
Heeft iemand een idee om dit makkelijk en snel op te lossen? Dus niet met een lijst structuur van temporaries oid, ik kan ook niet in assembler het op de stack pushen (wat ideaal zou zijn). En ik wil dus ook geen stack data structuur gebruiken ervoor.
Als het niet duidelijk is (kan gebeuren
) reply ik wel met meer info... Thnx
Heb zelf een compiler geschreven die een java-achtig taaltje omzet in ANSI-C. Nu zit ik bij het genereren van C code voor het aanroepen van methods met een probleempje.
Deze code: obj.f(1,2,3); Waar obj van class-type 'A' is vertaalt naar iets als dit in ansi-c (zonder type casts etc om het duidelijk te houden)
((tmp = (obj))->vtable->f_A)(tmp, 1, 2, 3);
Uit het object wordt dus via zijn virtual/dispatch table het functie adres gehaald, en die wordt dan aangeroepen met het object als argument ('this' pointer)
Het gaat eigenlijk om die 'tmp'. Die is nodig omdat 'obj' ook een expressie kan zijn, bv een functie-call resultaat. Ik kan die expressie dus niet 2x evalueren, want dan zou ik een functie twee keer aan kunnen roepen.
(bv.: ((tmp = (foo()))->vtable->f_A(tmp, 1, 2, 3);)
Nou werkt het met die tmp op zich goed, maar ansi-C heet geen regels voor de orde van evaluatie van functie argumenten (woei). Dit is niet juist in ansi-c:
foo(buffer[2], buffer = null); (want als rechts naar links dan null[2], crash)
Dit gaat bij mij fout als ik deze code compile:
obj1.f(obj2.g(), 2, 3);
Vertaald naar:
((tmp = (obj1))->vtable->f_A)(tmp, ((tmp = (obj2))->vtable->g_B)(tmp), 2, 3);
Heeft iemand een idee om dit makkelijk en snel op te lossen? Dus niet met een lijst structuur van temporaries oid, ik kan ook niet in assembler het op de stack pushen (wat ideaal zou zijn). En ik wil dus ook geen stack data structuur gebruiken ervoor.
Als het niet duidelijk is (kan gebeuren
[ Voor 4% gewijzigd door Zoijar op 27-11-2002 21:09 ]