summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-04 19:12:52 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-04 19:12:52 +0000
commitcbee6e017de269d902e870d5f52d15df1a4dac2e (patch)
tree005e4eec64df8bff6830e144d18c54f57cccc1b0 /eval.c
parentd9046f918d8c703ee2497fc630f37c738a461292 (diff)
* eval.c (rb_frame_callee): check if prev_cfp can be accessible.
a patch from Yoshinori Sano <yoshinori.sano at gmail.com> in [ruby-dev:30252]. solves [ruby-dev:30200] and [ruby-core:9856]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11628 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/eval.c b/eval.c
index 6396496165..e8e2e70612 100644
--- a/eval.c
+++ b/eval.c
@@ -1879,7 +1879,13 @@ rb_frame_this_func(void)
ID
rb_frame_callee(void)
{
- return frame_func_id(GET_THREAD()->cfp + 1);
+ yarv_thread_t *th = GET_THREAD();
+ yarv_control_frame_t *prev_cfp = YARV_PREVIOUS_CONTROL_FRAME(th->cfp);
+ /* check if prev_cfp can be accessible */
+ if ((void *)(th->stack + th->stack_size) == (void *)(prev_cfp)) {
+ return 0;
+ }
+ return frame_func_id(prev_cfp);
}
void