From: Tanaka Akira Date: 2004-12-13T13:09:44+09:00 Subject: [ruby-dev:25172] Re: core dump on NetBSD 2.0 In article <1102906796.625997.23964.nullmailer@x31.priv.netlab.jp>, Yukihiro Matsumoto writes: > 結局、allocaの実装が(GCに使う目的としては)信頼できなかったと > いうことにつきるように思います。 うぅむ。それだけの情報からは「alloca は使わないほうがいい」という以上 に細かい判断が出来ないですね。ついでにいえば私の知的好奇心も満たされな いので悲しいです。 まぁ、私の知的好奇心はついでなので気にしないことにして、でもやっぱり気 になるので前田さんあたりに聞きたい所なのですがそれはともかく、alloca を使わずに書くという方向でやるとすれば、やりかたは 2つ思い浮かびます。 ひとつは [ruby-dev:25163] で書いた、関数をひとつ呼んだ中で __builtin_frame_address(0) を呼ぶというものです。 __attribute__ ((noinline)) static VALUE * stack_end_address(void) { return (VALUE *)__builtin_frame_address(0); } # define SET_STACK_END VALUE *stack_end = stack_end_address() もうひとつは、やはり関数をひとつ呼んだ中で、ローカル変数のアドレスを返 すというものです。 __attribute__ ((noinline)) static VALUE * stack_end_address(void) { VALUE stack_end; return &stack_end; } # define SET_STACK_END VALUE *stack_end = stack_end_address() どちらも inline されてしまうとうまく動かない可能性があるので、inline しないという意志を __attribute__ ((noinline)) と表現していますが、実際 にはその記述はなくても inline されないんじゃないかと思います。 -- [田中 哲][たなか あきら][Tanaka Akira]