summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-16 06:05:46 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-16 06:05:46 +0000
commitb0edb6968fecaa368d2980f0572e6c7cd203e734 (patch)
treefffb60aa130f9c80a26bbe2141485a5ae4540225 /eval.c
parentd18d1cea2ec069a98b803533d4f43b7252276ce5 (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.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index 182471cd6d..41124c2887 100644
--- a/eval.c
+++ b/eval.c
@@ -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);