dmdのGCの実装を見てみる。
k.inabaさんにおだてられたので、ざっと見てみました。
/src/phobos/gcstats.d
GCのステータスを保持する構造体GCStatsが定義されています。
/src/phobos/std/gc.d
これは、中身は何もないです。
/src/phobos/internal/gc/gc.d
ここに、GCの実態があります。大部分はGCクラスをよんでます。
/src/phobos/internal/gc/gcx.d
ここに、GCクラスの定義があります。
/src/phobos/internal/gc/gclinux.d
linux依存部分
/src/phobos/internal/gc/win32.d
win32依存部分
/src/phobos/internal/gc/gcbits.d
GCBitsクラスの定義
bit単位で何かするんだろうなぁ。
/src/phobos/internal/gc/gcstub.d
GCクラスの何も処理しないクラスがある。
/src/phobos/internal/gc/testgc.d
GCのテストをする
/src/phobos/internal/gc/linux.mak
/src/phobos/internal/gc/win32.mak
makeファイル
dmgc.libを作るらしい。
/src/phobos/win32.mak
/src/phobos/linux.mak
phobos全体のmakeファイル
これで、/src/phobos/internal/gc/
以下もphobosに入るっぽい。
だいたいそんなかんじみたいです。
実際makeしてみてませんが、
たぶん、dmdについてくるmake使えばすぐmakeできるんじゃないかと思います。
あとは、弄くればよさそうです。
うわぁ、これは非常に弄ってみたいところですなぁ。
追記:手元にあったd-for-gcc-r1f.tgzのソースをboehmでgrepした結果です。
config-lang.in(13): target_libs="target-boehm-gc" README(151): o Use parts of the Boehm garbage collector to determine the phobos\configure(5001): d_use_boehm=1 phobos\configure(5004): d_use_boehm=1 phobos\configure(5006): if test -n "$d_use_boehm"; then phobos\configure(5007): D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o" phobos\configure(5008): DCFG_GC_BITS="GNU_Boehm_GC" phobos\configure(5022): if test -n "$d_use_boehm"; then phobos\configure(5023): d_config_subdirs="boehm-gc" phobos\configure.in(253): d_use_boehm=1 phobos\configure.in(256): dnl For now, use Boehm GC by default phobos\configure.in(257): d_use_boehm=1 phobos\configure.in(259): if test -n "$d_use_boehm"; then phobos\configure.in(260): D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o" phobos\configure.in(261): DCFG_GC_BITS="GNU_Boehm_GC" phobos\configure.in(275): if test -n "$d_use_boehm"; then phobos\configure.in(276): d_config_subdirs="boehm-gc" phobos\Makefile.in(126): boehm-gc/d_os_dep.c: $(srcdir)/boehm-gc/os_dep.c phobos\Makefile.in(127): cp $(srcdir)/boehm-gc/os_dep.c $@ phobos\Makefile.in(128): patch -p0 < $(srcdir)/patch-boehm-gc-os_dep phobos\Makefile.in(129): boehm-gc/d_os_dep.o: boehm-gc/d_os_dep.c phobos\Makefile.in(130): cd boehm-gc && $(MAKE) d_os_dep.o phobos\Makefile.in(131): boehm-gc/dyn_load.o: phobos\Makefile.in(132): cd boehm-gc && $(MAKE) dyn_load.o phobos\Makefile.in(133): boehm-gc/d_init.c: $(srcdir)/gcc/boehm-gc-d_init.c phobos\Makefile.in(134): cp $(srcdir)/gcc/boehm-gc-d_init.c $@ phobos\Makefile.in(135): boehm-gc/d_init.o: boehm-gc/d_init.c phobos\Makefile.in(136): cd boehm-gc && $(MAKE) d_init.o phobos\patch-boehm-gc-os_dep(1): *** boehm-gc/os_dep.c Mon Sep 22 16:00:23 2003 phobos\patch-boehm-gc-os_dep(2): --- boehm-gc/d_os_dep.c Tue Apr 6 18:17:30 2004 phobos\prepcygwin.sh(7): rm -f boehm-gc phobos\prepcygwin.sh(8): cp -pR ../../../boehm-gc . phobos\autom4te.cache\output.0(4990): d_use_boehm=1 phobos\autom4te.cache\output.0(4993): d_use_boehm=1 phobos\autom4te.cache\output.0(4995): if test -n "$d_use_boehm"; then phobos\autom4te.cache\output.0(4996): D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o" phobos\autom4te.cache\output.0(4997): DCFG_GC_BITS="GNU_Boehm_GC" phobos\autom4te.cache\output.0(5011): if test -n "$d_use_boehm"; then phobos\autom4te.cache\output.0(5012): d_config_subdirs="boehm-gc" phobos\autom4te.cache\output.1(5001): d_use_boehm=1 phobos\autom4te.cache\output.1(5004): d_use_boehm=1 phobos\autom4te.cache\output.1(5006): if test -n "$d_use_boehm"; then phobos\autom4te.cache\output.1(5007): D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o" phobos\autom4te.cache\output.1(5008): DCFG_GC_BITS="GNU_Boehm_GC" phobos\autom4te.cache\output.1(5022): if test -n "$d_use_boehm"; then phobos\autom4te.cache\output.1(5023): d_config_subdirs="boehm-gc" phobos\gcc\gcgcc.d(73): // TODO: this isn't quite exclusive with GNU_Boehm_GC... phobos\gcc\gcgcc.d(85): version (GNU_Boehm_GC) { phobos\gcc\gcgcc.d(117): version (GNU_Boehm_GC) { phobos\gcc\gcgcc.d(120): // We can get the start/end, but Boehm GC adds the range explicitly phobos\gcc\gcgcc.d(141): // It doesn't seem like the Boehm GC code we use actually calls phobos\gcc\gcgcc.d(149): /* Really have to register a function to handle dylibs as in boehm gc */ phobos\gcc\gcgcc.d(219): version (GNU_Boehm_GC) {