From: Tanaka Akira Date: 2005-11-28T18:45:12+09:00 Subject: [ruby-dev:27859] Re: tail call and conservertive GC In article <87veydyuzc.fsf@m17n.org>, Tanaka Akira writes: > (gdb) disassemble rb_parser_compile_string ぐあ、これは x86 のでした。 まぁ、x86_64 では次のようになって、やっぱり tail call になっていますが。 (gdb) disassemble rb_parser_compile_string Dump of assembler code for function rb_parser_compile_string: 0x000000000045f6e0 : mov %rbx,0xffffffffffffffe8(%rsp) 0x000000000045f6e5 : mov %r12,0xfffffffffffffff0(%rsp) 0x000000000045f6ea : mov %rdx,%rbx 0x000000000045f6ed : mov %r13,0xfffffffffffffff8(%rsp) 0x000000000045f6f2 : sub $0x28,%rsp 0x000000000045f6f6 : mov %rsi,%r13 0x000000000045f6f9 : mov %rdi,0x8(%rsp) 0x000000000045f6fe : mov 0x8(%rsp),%rdi 0x000000000045f703 : mov $0x12,%esi 0x000000000045f708 : mov %ecx,%r12d 0x000000000045f70b : callq 0x4a6390 0x000000000045f710 : mov 0x8(%rsp),%rax 0x000000000045f715 : mov %r12d,%edx 0x000000000045f718 : mov %r13,%rsi 0x000000000045f71b : mov 0x20(%rax),%rdi 0x000000000045f71f : mov 1762027(%rip),%eax # 0x60da10 0x000000000045f725 : movq $0x44c680,0xa0(%rdi) 0x000000000045f730 : movl $0x0,0x98(%rdi) 0x000000000045f73a : mov %rbx,0x68(%rdi) 0x000000000045f73e : movq $0x0,0x88(%rdi) 0x000000000045f749 : movq $0x0,0x80(%rdi) 0x000000000045f754 : movq $0x0,0x78(%rdi) 0x000000000045f75c : mov %eax,0x44(%rdi) 0x000000000045f75f : mov 0x10(%rsp),%rbx 0x000000000045f764 : mov 0x18(%rsp),%r12 0x000000000045f769 : mov 0x20(%rsp),%r13 0x000000000045f76e : add $0x28,%rsp 0x000000000045f772 : jmpq 0x45f230 End of assembler dump. (gdb) [ruby-dev:27856] のパッチを当てると、次のようになります。 (gdb) disassemble rb_parser_compile_string Dump of assembler code for function rb_parser_compile_string: 0x000000000045f6e0 : mov %rbx,0xffffffffffffffe0(%rsp) 0x000000000045f6e5 : mov %r12,0xffffffffffffffe8(%rsp) 0x000000000045f6ea : mov %rdi,%rbx 0x000000000045f6ed : mov %r13,0xfffffffffffffff0(%rsp) 0x000000000045f6f2 : mov %r14,0xfffffffffffffff8(%rsp) 0x000000000045f6f7 : sub $0x38,%rsp 0x000000000045f6fb : mov %rsi,%r14 0x000000000045f6fe : mov $0x12,%esi 0x000000000045f703 : mov %rdx,%r12 0x000000000045f706 : mov %ecx,%r13d 0x000000000045f709 : mov %rdi,0x10(%rsp) 0x000000000045f70e : callq 0x4a6390 0x000000000045f713 : mov 0x20(%rbx),%rdi 0x000000000045f717 : mov 1762035(%rip),%eax # 0x60da10 0x000000000045f71d : mov %r13d,%edx 0x000000000045f720 : mov %r14,%rsi 0x000000000045f723 : movq $0x44c680,0xa0(%rdi) 0x000000000045f72e : movl $0x0,0x98(%rdi) 0x000000000045f738 : mov %r12,0x68(%rdi) 0x000000000045f73c : movq $0x0,0x88(%rdi) 0x000000000045f747 : movq $0x0,0x80(%rdi) 0x000000000045f752 : movq $0x0,0x78(%rdi) 0x000000000045f75a : mov %eax,0x44(%rdi) 0x000000000045f75d : mov 0x18(%rsp),%rbx 0x000000000045f762 : mov 0x20(%rsp),%r12 0x000000000045f767 : mov 0x28(%rsp),%r13 0x000000000045f76c : mov 0x30(%rsp),%r14 0x000000000045f771 : add $0x38,%rsp 0x000000000045f775 : jmpq 0x45f230 End of assembler dump. (gdb) スタックに書き込んではいるようですが、yycompile の動作中には、 > 解決しません。ローカル変数は stack frame の中にあって、その > stack frame は tail call の時点で消えてしまうのです。 というわけで存在しないも同じです。 -- [田中 哲][たなか あきら][Tanaka Akira]