ささだです.

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