static VALUE block_pass_fcall(VALUE recv, ID mid, VALUE args, VALUE proc) { #ifdef RUBY_VM /* TODO: need to set filename on node for 1.9 */ /* TODO: would be better to construct an iseq directly */ NODE * node = NEW_FCALL( mid, NEW_NODE( NODE_BLOCK_PASS, NEW_SPLAT( NEW_LIT(args)), NEW_LIT(proc), 0)); #else NODE * node = NEW_NODE( NODE_BLOCK_PASS, 0, NEW_LIT(proc), NEW_FCALL( mid, NEW_SPLAT( NEW_LIT(args)))); #endif return eval_ruby_node(node, recv, Qnil); }
static VALUE block_pass_call(VALUE recv, ID mid, VALUE args, VALUE proc) { /* TODO: need to set filename on node for 1.9 */ NODE * node = NEW_NODE( NODE_BLOCK_PASS, 0, NEW_LIT(proc), NEW_CALL( NEW_LIT(recv), mid, NEW_SPLAT( NEW_LIT(args)))); return eval_ruby_node(node, recv, Qnil); }
static NODE * build_Array_each_node(rb_iseq_t *iseq, NODE * node, NODE * lnode, VALUE param_vars, VALUE local_vars) { /* Special block for Array#each ary.each{|e| BODY } => {|e, _self| _i = 0 while _i < _self.length e = _self[_i] redo_point: BODY next_point: _i = _i.succ end } ary.each{ BODY } => {|_i, _self| _i = 0 while _i < _self.length redo_point: BODY next_point: _i = _i.succ end } */ ID _self = rb_intern("#_self"); ID _i = rb_intern("#_i"); if (iseq->argc == 0) { ID _e = rb_intern("#_e"); rb_ary_push(param_vars, ID2SYM(_e)); rb_ary_push(param_vars, ID2SYM(_self)); iseq->argc += 2; rb_ary_push(local_vars, ID2SYM(_i)); node = new_block(NEW_DASGN(_i, NEW_LIT(INT2FIX(0))), NEW_WHILE(NEW_CALL(NEW_DVAR(_i), idLT, new_ary(NEW_CALL (NEW_DVAR(_self), idLength, 0), 0)), new_block(NEW_OPTBLOCK(node), NEW_DASGN(_i, NEW_CALL(NEW_DVAR(_i), idSucc, 0))), Qundef)); } else { ID e = SYM2ID(rb_ary_entry(param_vars, 0)); NODE *assign; rb_ary_push(param_vars, ID2SYM(_self)); iseq->argc++; rb_ary_push(local_vars, ID2SYM(_i)); if (nd_type(lnode) == NODE_DASGN_CURR) { assign = NEW_DASGN(e, NEW_CALL(NEW_DVAR(_self), idAREF, new_ary(NEW_DVAR(_i), 0))); } else { assign = new_assign(lnode, NEW_CALL(NEW_DVAR(_self), idAREF, new_ary(NEW_DVAR(_i), 0))); } node = new_block(NEW_DASGN(_i, NEW_LIT(INT2FIX(0))), NEW_WHILE(NEW_CALL(NEW_DVAR(_i), idLT, new_ary(NEW_CALL (NEW_DVAR(_self), idLength, 0), 0)), new_block(assign, new_block (NEW_OPTBLOCK (node), NEW_DASGN (_i, NEW_CALL (NEW_DVAR (_i), idSucc, 0)))), Qundef)); } return node; }