From: nagachika Date: 2010-04-04T01:03:11+09:00 Subject: [ruby-dev:40911] iseq_s_load が filepath の指定のない ISeq で TypeError 発生 nagachika と申します。 ISeq で非公開の iseq_s_load を使って遊んでいて気がついたのですが、 trunk で文字列から compile した ISeq をロードさせようとすると 以下のように TypeError が発生します。 iseq_test.rb:12:in `load': can't convert nil into String (TypeError) iseq->filepath が nil の場合があるのに対応していないようでした。 以下にパッチを貼り付けます。 ついでに 1.9.2-preview1 と見比べて、ISeq#to_a の結果に filepath と lineno が 追加されているので、一応バージョンを上げるのが良いのではないかと思い minor を 2->3 にしてみました。 もっとも iseq_s_load でバージョンチェックしてないですし、そもそも iseq_s_load は 非公開なので、まだ上げるべき時ではないということであればこれは破棄してください。 以上、よろしくお願いします。 Index: iseq.c =================================================================== --- iseq.c (revision 27209) +++ iseq.c (working copy) @@ -458,7 +458,8 @@ name = CHECK_STRING(rb_ary_entry(data, i++)); filename = CHECK_STRING(rb_ary_entry(data, i++)); - filepath = CHECK_STRING(rb_ary_entry(data, i++)); + filepath = rb_ary_entry(data, i++); + filepath = NIL_P(filepath) ? Qnil : CHECK_STRING(filepath); line_no = CHECK_INTEGER(rb_ary_entry(data, i++)); type = CHECK_SYMBOL(rb_ary_entry(data, i++)); @@ -1321,7 +1322,7 @@ */ rb_ary_push(val, rb_str_new2("YARVInstructionSequence/SimpleDataFormat")); rb_ary_push(val, INT2FIX(1)); /* major */ - rb_ary_push(val, INT2FIX(2)); /* minor */ + rb_ary_push(val, INT2FIX(3)); /* minor */ rb_ary_push(val, INT2FIX(1)); rb_ary_push(val, misc); rb_ary_push(val, iseq->name);