トップ «前の日記(2011-04-11) 最新 次の日記(2011-04-13)» 編集

日々の破片

著作一覧

2011-04-12

_ 昨日の型エラー

最近仕事ではC#のやたら親切な型チェックに親しんでいるせいで、コンパイル言語で型が違っていてもエラーにならないと、そこはスルーしてしまっていた。

というわけで、Rubyのエンコーディングオブジェクトは、たとえばrb_ascii8bit_encoding()とかで取り出せるわけだが、これがVALUEだと信じ込んでしまっていた。(多分、rb_cObjectなどの仲間のような意識でいたらしい)。エンコーディングを使うのは、rb_external_str_new_with_encとかで(これは便利でtaintなStringをエンコーディング指定でいきなり作れる)、VALUE str = rb_external_str_new_with_enc("foobar", 6, rb_utf8_encoding())というように使うので、ますますVALUEっぽい。でも、実際にはrb_encoding*という型なのであった。

で、おそろしいことに、rb_hash_aset(hash, ID2SYM(rb_intern("encoding")), rb_ascii8bit_encoding())とか書いていたのですな。

当然、それはVALUE(つまりRubyのオブジェクト)ではないのでGCされたりするとその場で死ぬ。

というわけで、rb_encodingをC APIで利用してVALUEにするには、rb_enc_from_encoding(rb_encoding* enc);を呼び出す必要がある(encodingがC API用のrb_encoding*で、encがVALUEという名前っぽい。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え