From f0e5e05609f6e1472573dcd9f94d82d60d56e03c Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 19 Apr 2017 15:14:03 +0000 Subject: [PATCH] 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 --- vm_insnhelper.c | 5 +++-- 1 file 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; } }