diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | vm_eval.c | 9 | ||||
-rw-r--r-- | vm_insnhelper.c | 4 | ||||
-rw-r--r-- | vm_insnhelper.h | 8 |
4 files changed, 23 insertions, 6 deletions
@@ -1,3 +1,11 @@ +Wed Mar 11 04:56:04 2015 Koichi Sasada <ko1@atdot.net> + + * 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 <ko1@atdot.net> * eval_intern.h (THROW_DATA_P): use RB_TYPE_P() instead of @@ -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 */ |