summaryrefslogtreecommitdiffstats
path: root/vm_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 4721de7c7..f64aa4afe 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -820,20 +820,24 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
{
int state;
volatile VALUE retval = Qnil;
- NODE *node = NEW_IFUNC(bl_proc, data2);
rb_thread_t *th = GET_THREAD();
rb_control_frame_t *volatile cfp = th->cfp;
+ rb_block_t *blockptr;
+ if (bl_proc) {
+ blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp);
+ blockptr->iseq = (void *)NEW_IFUNC(bl_proc, data2);
+ blockptr->proc = 0;
+ }
+ else {
+ blockptr = GC_GUARDED_PTR_REF(th->cfp->lfp[0]);
+ }
+ *(rb_block_t *volatile *)&blockptr = blockptr;
TH_PUSH_TAG(th);
state = TH_EXEC_TAG();
if (state == 0) {
iter_retry:
- {
- rb_block_t *blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp);
- blockptr->iseq = (void *)node;
- blockptr->proc = 0;
- th->passed_block = blockptr;
- }
+ th->passed_block = *(rb_block_t *volatile *)&blockptr;
retval = (*it_proc) (data1);
}
else {