From b8fa8865ee9e76b83cdd64d54d563ca3ef648831 Mon Sep 17 00:00:00 2001 From: ko1 Date: Tue, 10 Mar 2015 19:57:30 +0000 Subject: * vm_insnhelper.h: define struct IFUNC. * vm_eval.c (rb_iterate): use it. * vm_insnhelper.c (vm_yield_with_cfunc): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49925 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ vm_eval.c | 9 +++++---- vm_insnhelper.c | 4 ++-- vm_insnhelper.h | 8 ++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3caad0e5bb..a5ad3a02c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed Mar 11 04:56:04 2015 Koichi Sasada + + * vm_insnhelper.h: define struct IFUNC. + + * vm_eval.c (rb_iterate): use it. + + * vm_insnhelper.c (vm_yield_with_cfunc): ditto. + Wed Mar 11 03:52:12 2015 Koichi Sasada * eval_intern.h (THROW_DATA_P): use RB_TYPE_P() instead of diff --git a/vm_eval.c b/vm_eval.c index 9ba940c342..30849ccff6 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1104,22 +1104,23 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1, { int state; volatile VALUE retval = Qnil; - NODE *node = NEW_IFUNC(bl_proc, data2); + struct IFUNC *ifunc = (struct IFUNC *)NEW_IFUNC(bl_proc, data2); rb_thread_t *th = GET_THREAD(); rb_control_frame_t *volatile cfp = th->cfp; - node->nd_aid = rb_frame_this_func(); + ifunc->id = rb_frame_this_func(); + TH_PUSH_TAG(th); state = TH_EXEC_TAG(); if (state == 0) { VAR_INITIALIZED(th); - VAR_INITIALIZED(node); + VAR_INITIALIZED(ifunc); iter_retry: { rb_block_t *blockptr; if (bl_proc) { blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp); - blockptr->iseq = (void *)node; + blockptr->iseq = (void *)ifunc; blockptr->proc = 0; } else { diff --git a/vm_insnhelper.c b/vm_insnhelper.c index ada648e75f..f5f5634d09 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -2040,7 +2040,7 @@ vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, int argc, const VALUE *argv, const rb_block_t *blockargptr) { - NODE *ifunc = (NODE *) block->iseq; + struct IFUNC *ifunc = (struct IFUNC *)block->iseq; VALUE val, arg, blockarg; int lambda = block_proc_is_lambda(block->proc); @@ -2071,7 +2071,7 @@ vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, VM_ENVVAL_PREV_EP_PTR(block->ep), NULL /* cref */, 0, th->cfp->sp, 1, th->passed_bmethod_me, 0); - val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval, argc, argv, blockarg); + val = (*ifunc->func) (arg, ifunc->data, argc, argv, blockarg); th->cfp++; return val; diff --git a/vm_insnhelper.h b/vm_insnhelper.h index 6060a26b64..ccf0c46db8 100644 --- a/vm_insnhelper.h +++ b/vm_insnhelper.h @@ -283,4 +283,12 @@ THROW_DATA_STATE(const struct THROW_DATA *obj) return obj->throw_state; } +struct IFUNC { + VALUE flags; + VALUE reserved; + VALUE (*func)(ANYARGS); + void *data; + ID id; +}; + #endif /* RUBY_INSNHELPER_H */ -- cgit v1.2.3