summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-28 11:09:51 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-28 11:09:51 +0000
commit33379025f80282e59b4f4aff60190f2951a768db (patch)
tree4cc5d3ec88709f876136837a05be88dd81e84197 /vm_eval.c
parent3c000eab7cc53d194b9ac64c89563f824c990570 (diff)
merges r21660 from trunk into ruby_1_9_1.
* vm_eval.c, eval.c (rb_f_block_given_p): move definition of "iterator?" and "block_given?" to make static. * vm.c (vm_get_ruby_level_caller_cfp): make it static. * eval_intern.h, vm_insnhelper.c: move decl. of vm_get_ruby_level_caller_cfp() from eval_intern.h to vm_insnhelper.c. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@21850 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 74d70d33d7..2c98758dbe 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1376,11 +1376,52 @@ rb_f_local_variables(void)
return ary;
}
+/*
+ * call-seq:
+ * block_given? => true or false
+ * iterator? => true or false
+ *
+ * Returns <code>true</code> if <code>yield</code> would execute a
+ * block in the current context. The <code>iterator?</code> form
+ * is mildly deprecated.
+ *
+ * def try
+ * if block_given?
+ * yield
+ * else
+ * "no block"
+ * end
+ * end
+ * try #=> "no block"
+ * try { "hello" } #=> "hello"
+ * try do "hello" end #=> "hello"
+ */
+
+
+VALUE
+rb_f_block_given_p(void)
+{
+ rb_thread_t *th = GET_THREAD();
+ rb_control_frame_t *cfp = th->cfp;
+ cfp = vm_get_ruby_level_caller_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp));
+
+ if (cfp != 0 &&
+ (cfp->lfp[0] & 0x02) == 0 &&
+ GC_GUARDED_PTR_REF(cfp->lfp[0])) {
+ return Qtrue;
+ }
+ else {
+ return Qfalse;
+ }
+}
+
void
Init_vm_eval(void)
{
rb_define_global_function("eval", rb_f_eval, -1);
rb_define_global_function("local_variables", rb_f_local_variables, 0);
+ rb_define_global_function("iterator?", rb_f_block_given_p, 0);
+ rb_define_global_function("block_given?", rb_f_block_given_p, 0);
rb_define_global_function("catch", rb_f_catch, -1);
rb_define_global_function("throw", rb_f_throw, -1);