diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-04-19 15:14:03 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-04-19 15:14:03 +0000 |
commit | f0e5e05609f6e1472573dcd9f94d82d60d56e03c (patch) | |
tree | 7a0c2fcfd6d25bd74fa2adeedd68f011911efbfc /vm_insnhelper.c | |
parent | 826f16d46581f9a66eeb5902b4f2f6e9f950ada0 (diff) |
fix infinite recursion
* vm_insnhelper.c (vm_once_dispatch): no guarantee that tail call
is always optimized away.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58405 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index d5b53314dc..a40a1c376e 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -3238,8 +3238,9 @@ static VALUE vm_once_dispatch(ISEQ iseq, IC ic, rb_thread_t *th) { rb_thread_t *const RUNNING_THREAD_ONCE_DONE = (rb_thread_t *)(0x1); - union iseq_inline_storage_entry *is = (union iseq_inline_storage_entry *)ic; + union iseq_inline_storage_entry *const is = (union iseq_inline_storage_entry *)ic; + again: if (is->once.running_thread == RUNNING_THREAD_ONCE_DONE) { return is->once.value; } @@ -3260,7 +3261,7 @@ vm_once_dispatch(ISEQ iseq, IC ic, rb_thread_t *th) /* waiting for finish */ RUBY_VM_CHECK_INTS(th); rb_thread_schedule(); - return vm_once_dispatch(iseq, ic, th); + goto again; } } |