ささだです. SASADA Koichi wrote:: >> このcallbackですが >> >> (*callback)(VALUE *values, size_t run, void* data) >> >> でよいんでないですかね。「VALUEにstrideを足す」という操作が >> 不安です。 > > これは,RVALUE の配列である heaps_slot を直接渡すんじゃなくて,一回 > VALUE の配列に live object をコピーして渡す,というインターフェースで > しょうか.今のところ,RVALUE のサイズは,gc.c 以外からは見れないように > なっています.それを隠蔽するための stride という引数になっています. > > で,これはコピーのオーバヘッドを考えると,嫌だなぁ,と思います.この > API は,速いけど難しいインターフェースで取り扱い注意,というのだと弱いで > しょうか. 本件,まつもとさんとチャットで議論させてもらったんですが, ・速度的な問題があるのは認めるので stride でもよい ・start, end の型は VALUE よりは VALUE * に という話になりました. void rb_objspace_each_objects( enum objspace_walk_retval (*callback)(VALUE *start, VALUE *end, size_t stride, void *data), void *data0 こんな感じ. とりあえず,難しいのは難しいので,コメントに,使うな,と書いておきます (詳しい説明と). -- // SASADA Koichi at atdot dot net