mrubyにはCのデータポインタをmruby側に持ち込む方法としてDATA型とVOIDP型というものがある。公式のドキュメントがないのでなんともわからないけどソースや動作から推測すると、DATA型はポインタの所有権を持つ型で、VOIDPは持たない型になる。

DATA型は個別のデータ型を割り当てることができて(mrb_data_type型情報)、GCされたときには解放関数が呼び出される。 ただし、DATA型といっても内部に実体を持つ訳ではなくて、ポインタで持つ。 またDATA型が持っているポインタの先はGCの保護対象にはならないので、mrb_valueとかを内部に持つことはできない。

VOIDP型は追加の情報はいっさいなくて、単にポインタを保持するだけの用途として使う。GCされてもmrubyの変数が回収されるだけで、ポインタに対してはなにもしない。Luaでいうlightuserdataみたいなもん?

VOIDP型を使った場合に、内容を表示して確認しようとするとsegmentation faultが発生する。みたらVOIDP用のクラス情報がないことがわかった。このままではVOIDP型を安心して扱えないので、チェンジを作って投げた。

追記

  • Object型にするなんていうシンプルな解決法があったのか… 確かにVOIDP型なんていう謎の型名が表に出てくるのはまぎらわしいしな
  • voidpはobsoleteになり、cptrという名前に変更になった。