レジスタからの参照 - GC
続いてはレジスタからの参照をチェックする。
いわゆる汎用レジスタとかそのあたりから参照されている部分も回収してはいけない。
インラインアセンブラで全レジスタを取り出したりとか、pusha とかでスタックに全部のっけてしまう方法もありだけど。
setjmp や getcontext でレジスタ情報を取るのが楽そうだし、移植性も上がる。(アーキテクチャが全然違うところに移植する予定はあまりないけど)
こんな感じですね。
void gc_mark_registers() { myjmp_buf registers; mysetjmp(registers); for (int i = 0; i < _JBLEN; i++) { uint32_t valueOnRegister = registers[i]; FOREACH_GC_NODE(&top, n) { if (GC_SAFE_POINTER(n->address) == valueOnRegister && !n->reachable) { GC_TRACE_OUT(" [mark ] %x\n", valueOnRegister); n->reachable = true; } } } }