diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-16 06:05:46 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-16 06:05:46 +0000 |
commit | b0edb6968fecaa368d2980f0572e6c7cd203e734 (patch) | |
tree | fffb60aa130f9c80a26bbe2141485a5ae4540225 /eval.c | |
parent | d18d1cea2ec069a98b803533d4f43b7252276ce5 (diff) |
pass_block, etc.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@74 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -3396,6 +3396,28 @@ f_send(argc, argv, recv) return vid; } +static VALUE +f_pass_block(argc, argv, recv) + int argc; + VALUE *argv; + VALUE recv; +{ + VALUE vid; + + if (argc == 0) ArgError("no iterator name given"); + if (iterator_p()) + ArgError("iterator block given to pass_block"); + if (!f_iterator_p()) + ArgError("pass_block called out of iterator"); + + vid = argv[0]; argc--; argv++; + PUSH_ITER(ITER_PRE); + vid = rb_call(CLASS_OF(recv), recv, rb_to_id(vid), argc, argv, 1); + POP_ITER(); + + return vid; +} + #include <varargs.h> VALUE @@ -4248,6 +4270,7 @@ Init_eval() rb_define_global_function("global_variables", f_global_variables, 0); rb_define_method(mKernel, "send", f_send, -1); + rb_define_method(mKernel, "pass_block", f_pass_block, -1); rb_define_method(mKernel, "instance_eval", obj_instance_eval, 1); rb_define_private_method(cModule, "append_features", mod_append_features, 1); |