https://github.com/anonymous1337/FB-Garbage-Collector
Currently, there exists a GarbageCollector interface/mock class which behaves like normal Ctors/Dtors. A ReferenceCounter then implements/overrides it. A visitor-ish pattern is called whenever we have construction, destruction or assignment. This lets the GC decide when stuff is constructed, destructed or assigned.
A reference count is hard-coded in the reference type, but I think the ReferenceCounter GC is the only class that uses it, so it can probably be ignored by additional GCs until it's removed. Tbh, I just didn't want to bother making a DynamicArray class/macro just so the ReferenceCounter could store a list of references and how many external references to them there are.
Here's a demo:
Code: Select all
' Seems like everything can be included except this for now...
'#include "GarbageCollector.bi"
#include "ReferenceCounter.bi"
#include "Reference.bi"
#include "RInteger.bi"
#include "GarbageCollector.bas"
#include "ReferenceCounter.bas"
#include "Reference.bas"
#include "RInteger.bas"
#macro str_iif( c, t, f )
*cast( zstring ptr, iif( c, @t, @f ))
#endmacro
#macro str_expr( c )
str_iif( c, "true", "false" )
#endmacro
using anonymous1337.gc.core
' This default collector does nothing special. Just prints what's going on.
dim as GarbageCollector default_collector
'garbage_collector = @default_collector
' For now, our most complex "garbage collector" is just a reference counter.
dim as ReferenceCounter reference_counter
garbage_collector = GarbageCollector.from(@reference_counter)
sub main()
dim as RInteger my_age
dim as RInteger your_age
dim as RInteger our_age
my_age = 23
your_age = 23
our_age = my_age
print ""
print "My age: " & int(my_age)
print "Your age: " & int(your_age)
print "Our age: " & int(our_age)
print ""
print "My age type_id: " & Reference.from(@my_age)->type_id
print "Your age type_id: " & Reference.from(@your_age)->type_id
print "Our age type_id: " & Reference.from(@our_age)->type_id
print ""
print "Do my_age and your_age have equal values?: " & str_expr( my_age = your_age )
print "Do my_age and your_age have equal reference values?: " & str_expr( *Reference.from(@my_age) = *Reference.from(@your_age) )
print ""
print "Do our_age and my_age have equal values?: " & str_expr( my_age = our_age )
print "Do our_age and my_age have equal reference values?: " & str_expr( *Reference.from(@my_age) = *Reference.from(@our_age) )
print ""
print "Do our_age and your_age have equal values?: " & str_expr( your_age = our_age )
print "Do our_age and your_age have equal reference values?: " & str_expr( *Reference.from(@your_age) = *Reference.from(@our_age) )
sleep
end sub
main()
sleep
Code: Select all
Constructed a reference with value: 0
Constructed a reference with value: 7673880
Constructed a reference with value: 0
Constructed a reference with value: 7673912
Constructed a reference with value: 0
Constructed a reference with value: 7677968
Assigned reference 1638108 to reference 1638044
My age: 23
Your age: 23
Our age: 23
My age type_id: __RInteger
Your age type_id: __RInteger
Our age type_id: __RInteger
Do my_age and your_age have equal values?: true
Do my_age and your_age have equal reference values?: false
Do our_age and my_age have equal values?: true
Do our_age and my_age have equal reference values?: true
Do our_age and your_age have equal values?: true
Do our_age and your_age have equal reference values?: false
Destructed a reference with value: 7673880
Destructed a reference with value: 7673880
Destructed a reference with value: 7673912
Destructed a reference with value: 7673912
Destructed a reference with value: 7673880
Destructed a reference with value: 7673880
1) I only get to work on this during the weekends because I am fully employed.
2) It's already been a couple weeks and I'm getting impatient.
3) FB's had some feature additions/changes since I last updated and I don't want my time to be wasted.
4) I don't know much about garbage collection yet. I've essentially brought to you pseudo-smart pointers. Enjoy.