VALUE rb_iterate(VALUE(*ifunc)(VALUE), VALUE ary, VALUE(*cb)(ANYARGS), VALUE cb_data) { NativeMethodEnvironment* env = NativeMethodEnvironment::get(); // Minor optimization. if(ifunc == rb_each && kind_of<Array>(env->get_object(ary))) { for(size_t i = 0; i < rb_ary_size(ary); i++) { (*cb)(rb_ary_entry(ary, i), cb_data, Qnil); } return ary; } NativeMethod* nm = NativeMethod::create(env->state(), (String*)Qnil, env->state()->shared.globals.rubinius.get(), env->state()->symbol("call"), (void*)cb, Fixnum::from(ITERATE_BLOCK)); nm->set_ivar(env->state(), env->state()->symbol("cb_data"), env->get_object(cb_data)); Proc* prc = Proc::create(env->state(), env->state()->shared.globals.proc.get()); prc->bound_method(env->state(), nm); env->set_outgoing_block(env->get_handle(prc)); return (*ifunc)(ary); }
Proc* wrap_c_function(void* cb, VALUE cb_data, int arity) { NativeMethodEnvironment* env = NativeMethodEnvironment::get(); NativeMethod* nm = NativeMethod::create(env->state(), nil<String>(), env->state()->vm()->shared.globals.rubinius.get(), env->state()->symbol("call"), cb, Fixnum::from(arity), 0); nm->set_ivar(env->state(), env->state()->symbol("cb_data"), env->get_object(cb_data)); Object* current_block = env->block(); if(!current_block->nil_p()) { nm->set_ivar(env->state(), env->state()->symbol("original_block"), current_block); } Proc* prc = Proc::create(env->state(), env->state()->vm()->shared.globals.proc.get()); prc->bound_method(env->state(), nm); return prc; }
Proc* wrap_c_function(void* cb, VALUE cb_data, int arity) { NativeMethodEnvironment* env = NativeMethodEnvironment::get(); NativeMethod* nm = NativeMethod::create(env->state(), (String*)Qnil, env->state()->shared.globals.rubinius.get(), env->state()->symbol("call"), cb, Fixnum::from(arity)); nm->set_ivar(env->state(), env->state()->symbol("cb_data"), env->get_object(cb_data)); Proc* prc = Proc::create(env->state(), env->state()->shared.globals.proc.get()); prc->bound_method(env->state(), nm); return prc; }