From: Tanaka Akira Date: 2005-11-28T16:44:31+09:00 Subject: [ruby-dev:27851] tail call and conservertive GC x86_64-linux で、gcc 4.0.3 20051111 なるものを用いて ruby 1.9 を作ると install が失敗します。 % make install ./miniruby ./instruby.rb --dest-dir="" --make="make" --mflags="" --make-flags="" --mantype="doc" /tmp/a/ruby/lib/tempfile.rb:12: invalid identifier include? (NameError) from ./instruby.rb:12 make: *** [do-install-local] Error 1 zsh: exit 2 make install % ./miniruby -v ruby 1.9.0 (2005-11-28) [x86_64-linux] % gcc -v Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --enable-checking=release x86_64-linux-gnu Thread model: posix gcc version 4.0.3 20051111 (prerelease) (Debian 4.0.2-4) 調べてみると、 % ./miniruby -ve '10000.times { eval "" }' ruby 1.9.0 (2005-11-28) [x86_64-linux] *** glibc detected *** double free or corruption (fasttop): 0x00000000006d40c0 *** という問題まで絞りこめ、これはどうも rb_compile_string が rb_parser_compile_string を tail call していて、 呼び出される前に VALUE volatile な vparser がスタック上から 消えていて、GC されちゃっているということがわかりました。 (gdb) disassemble rb_compile_string Dump of assembler code for function rb_compile_string: 0x000000000045f7d0 : mov %rbx,0xffffffffffffffe8(%rsp) 0x000000000045f7d5 : mov %r12,0xfffffffffffffff0(%rsp) 0x000000000045f7da : mov %edx,%ebx 0x000000000045f7dc : mov %r13,0xfffffffffffffff8(%rsp) 0x000000000045f7e1 : sub $0x28,%rsp 0x000000000045f7e5 : mov %rdi,%r13 0x000000000045f7e8 : mov %rsi,%r12 0x000000000045f7eb : callq 0x44f400 0x000000000045f7f0 : mov %rax,0x8(%rsp) 0x000000000045f7f5 : mov 0x8(%rsp),%rdi 0x000000000045f7fa : mov %ebx,%ecx 0x000000000045f7fc : mov %r12,%rdx 0x000000000045f7ff : mov %r13,%rsi 0x000000000045f802 : mov 0x10(%rsp),%rbx 0x000000000045f807 : mov 0x18(%rsp),%r12 0x000000000045f80c : mov 0x20(%rsp),%r13 0x000000000045f811 : add $0x28,%rsp 0x000000000045f815 : jmpq 0x45f6e0 End of assembler dump. さて、どうしたもんでしょう? まぁ、tail call になるのを防止すればいいわけですが、tail call になっているのはここに限らずかなりある感じです。 -- [田中 哲][たなか あきら][Tanaka Akira]