Feature #7047
closedAdd new C API: rb_newobj_with
Description
nariです。
現在のCRubyではオブジェクトを割り当てる際に rb_newobj() という関数を利
用していますが、引数にtypeやklassがないため、たとえばT_STRINGだけ違うと
ころに割り当てるなどの特別な処理がやりづらくなっています。
そこで以下のC APIの追加を提案します。
- VALUE rb_newobj_with(VALUE, enum ruby_value_type);
- #define NEWOBJ_WITH(obj,type,klass,flags)
ruby内部でrb_newobj()を使っているところはrb_newobj_with()に置き換えたい
と考えています。互換性のためにrb_newobj・NEWOBJ・OBJSETUP自体は残します
が、将来的には消したいですね。ただ2.0では難しそうです。
パッチは以下のとおりです。
https://github.com/authorNari/ruby/compare/trunk...rb_newobj2.patch
また、rb_newobj_withという名前よりよい名前(rb_newobj2以外)があれば教
えてもらえると嬉しいです。
Updated by ko1 (Koichi Sasada) about 12 years ago
- Description updated (diff)
ささだです.
1点気になるのが, rb_newobj_with(VALUE, enum ruby_value_type) が flag 取らなくてもいいんかな,という点でして.いや,NEWOBJ_WITH() だと,問答無用で enum ruby_value_type じゃなくて,flag を渡しているようなんですが.その辺が整理出来ていない気がしています.
rb_newobj_with(klass, enum ruby_value_type type, VALUE flag) なんてのもアリなのかとか,
rb_newobj_with(klass, VALUE flag) もアリかもとか.
_with という名前は,私もあまり妙案が無い感じです.with 何? という気もします.rb_typed_newobj だと誤解を生みそうですね.なんか無いかな.
Updated by authorNari (Narihiro Nakamura) about 12 years ago
レビューありがとうございます。
rb_newobj_with(klass, VALUE flags) でパッチを修正しました。
https://github.com/authorNari/ruby/compare/trunk...rb_newobj2
flagsさえ引数にとればenum ruby_value_type相当の情報は取れるはずなので問
題ないのかなと思います。
また名前の候補を考えたり、教えていただいたりしていました。
- rb_type_new (青木さん案)
- rb_typed_newobj (ささださん案)
- rb_newobj_with_setup
- rb_new_segregated_obj
- rb_new_distinct_obj
- rb_new_typed_obj
- rb_gc_newobj
いまいちこれといった名前が思いつかないですね。
(rb_newobjがやっぱり適切な名前なんですよねぇ…)
私は rb_new_typed_obj あたりが好きです。
Updated by ko1 (Koichi Sasada) about 12 years ago
(2012/09/26 22:22), authorNari (Narihiro Nakamura) wrote:
rb_newobj_with(klass, VALUE flags) でパッチを修正しました。
flags を取るようにしたので,rb_newobj_with_flags でどうでしょうか.
何かしら,マクロで隠蔽して,実質こいつは呼ばない,となると,長い名前でも
良いのではないか,と思うのですが(別に長くてもいいか?).
--
// SASADA Koichi at atdot dot net
Updated by authorNari (Narihiro Nakamura) about 12 years ago
ko1 (Koichi Sasada) wrote:
(2012/09/26 22:22), authorNari (Narihiro Nakamura) wrote:
rb_newobj_with(klass, VALUE flags) でパッチを修正しました。
flags を取るようにしたので,rb_newobj_with_flags でどうでしょうか.
何かしら,マクロで隠蔽して,実質こいつは呼ばない,となると,長い名前でも
良いのではないか,と思うのですが(別に長くてもいいか?).
まつもとさんに直接意見を聞いてみました。
with_flagsでもいいと思うんだけど、引数としてはflagsもklassも、どちらも
何かしらのタイプを受け取るので、 rb_newobj_of(xxx) がいいのじゃないか、
とおっしゃってました。new obj of class みたいな意味で。
- rb_newobj_of(klass, VALUE flags)
- NEWOBJ_OF(obj,type,klass,flags)
反対意見がでなければこれで進めようかと思うのですが、いかがでしょうか?
あとでruby-coreの方にも聞いてみます。¶
Updated by ko1 (Koichi Sasada) about 12 years ago
(2012/10/01 13:15), authorNari (Narihiro Nakamura) wrote:
with_flagsでもいいと思うんだけど、引数としてはflagsもklassも、どちらも
何かしらのタイプを受け取るので、 rb_newobj_of(xxx) がいいのじゃないか、
とおっしゃってました。new obj of class みたいな意味で。
- rb_newobj_of(klass, VALUE flags)
- NEWOBJ_OF(obj,type,klass,flags)
+1
短くて判りやすいですね.
今後は ..._of パターンが増えるんでしょうか.
しかし,やはりバリエーションを増やそうとすると困るな.
--
// SASADA Koichi at atdot dot net
Updated by kou (Kouhei Sutou) about 12 years ago
rb_obj_new()はどうでしょうか。
rb_obj_がprefixのみなさんとまぎらわしいかしら。
Updated by authorNari (Narihiro Nakamura) about 12 years ago
kou (Kouhei Sutou) wrote:
rb_obj_new()はどうでしょうか。
rb_obj_がprefixのみなさんとまぎらわしいかしら。
ありがとうございます。
でも、おっしゃる通りすこし紛らわしい気がしますねぇ。
Updated by authorNari (Narihiro Nakamura) about 12 years ago
- Category set to core
- Assignee set to authorNari (Narihiro Nakamura)
Updated by authorNari (Narihiro Nakamura) about 12 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r37275.
Narihiro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
-
include/ruby/ruby.h: add C APIs.
VALUE rb_newobj_of(VALUE klass, VALUE flags)
#define NEWOBJ_OF(obj,type,klass,flags)
These allow to change a allocation strategy depending on klass
or flags. -
gc.c: ditto
-
array.c: use new C API.
-
bignum.c: ditto
-
class.c: ditto
-
complex.c: ditto
-
ext/socket/ancdata.c: ditto
-
ext/socket/option.c: ditto
-
hash.c: ditto
-
io.c: ditto
-
marshal.c: ditto
-
numeric.c: ditto
-
object.c: ditto
-
random.c: ditto
-
range.c: ditto
-
rational.c: ditto
-
re.c: ditto
-
string.c: ditto