From: Tanaka Akira Date: 2005-11-28T18:37:23+09:00 Subject: [ruby-dev:27858] Re: tail call and conservertive GC In article , nobuyoshi nakada writes: > rb_parser_compile_string()のvparserもvolatileなはずですが、そっ > ちも消えてしまってるんでしょうか。 あー、そっか。たしかに。 rb_parser_compile_string には渡っているけれど、yycompile も やっぱり tail call されるので、今度こそここで消える、という ことでした。 (gdb) disassemble rb_parser_compile_string Dump of assembler code for function rb_parser_compile_string: 0x080b1100 : push %ebp 0x080b1101 : mov $0x12,%edx 0x080b1106 : mov %esp,%ebp 0x080b1108 : sub $0x18,%esp 0x080b110b : mov %ebx,0xfffffff4(%ebp) 0x080b110e : mov 0x10(%ebp),%ebx 0x080b1111 : mov %esi,0xfffffff8(%ebp) 0x080b1114 : mov 0x14(%ebp),%esi 0x080b1117 : mov %edi,0xfffffffc(%ebp) 0x080b111a : mov 0xc(%ebp),%edi 0x080b111d : mov %edx,0x4(%esp) 0x080b1121 : mov 0x8(%ebp),%ecx 0x080b1124 : mov %ecx,(%esp) 0x080b1127 : call 0x810c7d0 0x080b112c : mov 0x8(%ebp),%edx 0x080b112f : mov 0x10(%edx),%ecx 0x080b1132 : mov %ebx,0x4c(%ecx) 0x080b1135 : mov 0x814a958,%ebx 0x080b113b : movl $0x80b1cd0,0x6c(%ecx) 0x080b1142 : movl $0x0,0x68(%ecx) 0x080b1149 : movl $0x0,0x5c(%ecx) 0x080b1150 : movl $0x0,0x58(%ecx) 0x080b1157 : movl $0x0,0x54(%ecx) 0x080b115e : mov %ebx,0x34(%ecx) 0x080b1161 : mov 0xfffffff4(%ebp),%ebx 0x080b1164 : mov %esi,0x10(%ebp) 0x080b1167 : mov 0xfffffff8(%ebp),%esi 0x080b116a : mov %edi,0xc(%ebp) 0x080b116d : mov 0xfffffffc(%ebp),%edi 0x080b1170 : mov %ecx,0x8(%ebp) 0x080b1173 : mov %ebp,%esp 0x080b1175 : pop %ebp 0x080b1176 : jmp 0x80b1ac0 End of assembler dump. (gdb) >> まぁ、tail call になるのを防止すればいいわけですが、tail >> call になっているのはここに限らずかなりある感じです。 > > この推測が正しければ、volatileなローカル変数に保存しておくこと > で解決しないでしょうか。 解決しません。ローカル変数は stack frame の中にあって、その stack frame は tail call の時点で消えてしまうのです。 -- [田中 哲][たなか あきら][Tanaka Akira]