Ik heb voor een java-like taal een compiler met two-space garbage collection geimplementeerd. Heel kort: Een object wordt gerepresenteerd als pointer naar een struct op de heap. Alle addressen van pointers in het programma (stack) worden opgeslagen in een root set. Bij garbage collection worden al deze rootset pointers recursief gevolgd, en mogelijk wordt het struct naar een andere heap locatie gekopieerd en word de programma pointer aangepast. Dit werkt goed, en is standaard two-space garabage collection.
Nu heb ik ook functies die call-by-reference argumenten kunnen hebben. Net zoals zeg maar een reference in C++ (bv. void foo(vector& v);) Het probleem zit hem erin dat die references pointers naar pointers naar heap structs zijn. Mocht het nu zo zijn dat de reference wijst naar een object in een object op de heap, dan lukt het garbage collecten niet. Dit omdat als het object verplaatst wordt, de dubbele pointer geen juist address meer heeft.
Voorbeeld:
Waarbij het argument 'aref' van foo als reference wordt gepassed (vandaar de 'var' ervoor)
Nu is mijn vraag uiteraard of iemand een (idee voor) oplossing heeft voor dit. Sorry dat ik het niet beter it kan leggen, maar dat zou meerdere blz tekst kosten...en ik verwacht niet dat iemand daar doorheen gaat lezen. Ik hoopte dat iemand misschien ooit is garabge collection heeft geimplementeerd en tegen dit probleem is aangelopen, over zich herinnerd er iets over gelezen te hebben.
Nu heb ik ook functies die call-by-reference argumenten kunnen hebben. Net zoals zeg maar een reference in C++ (bv. void foo(vector& v);) Het probleem zit hem erin dat die references pointers naar pointers naar heap structs zijn. Mocht het nu zo zijn dat de reference wijst naar een object in een object op de heap, dan lukt het garbage collecten niet. Dit omdat als het object verplaatst wordt, de dubbele pointer geen juist address meer heeft.
Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| class A is var q: A; end procedure foo(var aref : A) is begin (* hier wordt er garbage collected en wordt aref invalid *) aref.blaat(); (* crash, inhoud aref is null-pointer *) end a:= new A; a.q := new A; foo(a.q); (* pass-by-ref *) |
Waarbij het argument 'aref' van foo als reference wordt gepassed (vandaar de 'var' ervoor)
Nu is mijn vraag uiteraard of iemand een (idee voor) oplossing heeft voor dit. Sorry dat ik het niet beter it kan leggen, maar dat zou meerdere blz tekst kosten...en ik verwacht niet dat iemand daar doorheen gaat lezen. Ik hoopte dat iemand misschien ooit is garabge collection heeft geimplementeerd en tegen dit probleem is aangelopen, over zich herinnerd er iets over gelezen te hebben.