(1), (2) spcamp29@ubuntu:~/devel/easy/easy$ touch test.rb spcamp29@ubuntu:~/devel/easy/easy$ make run ./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb ./test.rb name: encdb 0 (1) "name: encdb" は encoding.c:load_encoding の printf("name: %s\n", name); grep name: で発見 (2) "0" は eval.c:ruby_cleanup の printf("%d\n", state); gdb miniruby で break printf して run -e '' で発見。 (これが可能だったのははじめから configure --prefix=... optflags=-O0 として最適化を切っておいたためらしい) 49:00 (3) grep 'hello!' *.c で発見 // 単にhelloと表示するだけの機能 SJIS の「能」の最後のバイトが \ なのでコメントが継続している。 コメント行を削除して対処 最初 hard.zip の中を探していて見つからず、かなり時間を無駄にした。 37:00 (4) array.c の rb_ary_collect_hello で、for の body が brace で括られていない 括って対処 for (i = 0; i < RARRAY_LEN(ary); i++) result = rb_str_plus(hello, RARRAY_PTR(ary)[i]); rb_ary_push(collect, result); 34:12 (5) grep して object.c に rb_find_answer を発見。 コードの条件を修正 gdb で find_answer 42 で diff が -42 になっていることを発見 make object.o として gcc のコマンドラインを出して、-save-temps をつけて実行。 object.i を確認すると、long diff = 0 - answer となっていたので、 FIX2L0NG を探して (この時点では 0, O の違いは気がついていなかった) include/ruby/ruby.h に #define FIX2L0NG(x) 0 // use nice font! hehehe ;) を発見 19:42 (6),(7) make は rdoc で失敗 make install も同様に失敗 make install-nodoc した ./ruby test/runner.rb test/ruby -v ./ruby test/ruby/test_array.rb -v -n test_reverse 以下が失敗することを確認 $ ./ruby -e 'p [1].reverse' [false] rb_ary_reverse_m を修正: VALUE *p2 = RARRAY_PTR(dup) + len - 1; 11:00 ./ruby test/ruby/test_array.rb -v test_split_0 が落ちることを確認 以下が落ちる $ ./ruby -e 'p "The Book of Mormon".reverse!' $ ./ruby -e 'p "aa".reverse!' 5:21 (8) make miniruby までは問題ない make ruby はだめ make btest でいろいろ失敗 失敗の一つを単純化して以下 spcamp29@ubuntu:~/devel/veryhard/veryhard$ ./miniruby -e 'x = 1 if false; p x' 1 後置 if 以外の条件判定もおかしいことを確認 (普通の if や 3項演算子) spcamp29@ubuntu:~/devel/veryhard/veryhard$ ./miniruby -e 'p 1 if nil' 1 iseq_compile_each の以下のところを直した //COMPILE_(then_seq, "then", node->nd_else, poped); //COMPILE_(else_seq, "else", node->nd_body, poped); COMPILE_(then_seq, "then", node->nd_body, poped); COMPILE_(else_seq, "else", node->nd_else, poped); -3:00