aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--proc.c36
-rw-r--r--test/ruby/test_proc.rb8
2 files changed, 28 insertions, 16 deletions
diff --git a/proc.c b/proc.c
index 7e1985ceb1..749b6a8134 100644
--- a/proc.c
+++ b/proc.c
@@ -847,16 +847,8 @@ rb_block_lambda(void)
return proc_new(rb_cProc, TRUE, FALSE);
}
-/*
- * call-seq:
- * lambda { |...| block } -> a_proc
- *
- * Equivalent to Proc.new, except the resulting Proc objects check the
- * number of parameters passed when called.
- */
-
-static VALUE
-f_lambda(VALUE _)
+static void
+f_lambda_warn(void)
{
rb_control_frame_t *cfp = GET_EC()->cfp;
VALUE block_handler = rb_vm_frame_block_handler(cfp);
@@ -865,20 +857,36 @@ f_lambda(VALUE _)
switch (vm_block_handler_type(block_handler)) {
case block_handler_type_iseq:
if (RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)->ep == VM_BH_TO_ISEQ_BLOCK(block_handler)->ep) {
- break;
+ return;
}
- case block_handler_type_symbol:
break;
+ case block_handler_type_symbol:
+ return;
case block_handler_type_proc:
if (rb_proc_lambda_p(VM_BH_TO_PROC(block_handler))) {
- break;
+ return;
}
+ break;
case block_handler_type_ifunc:
- rb_warn_deprecated("lambda without a literal block", "the proc without lambda");
break;
}
}
+ rb_warn_deprecated("lambda without a literal block", "the proc without lambda");
+}
+
+/*
+ * call-seq:
+ * lambda { |...| block } -> a_proc
+ *
+ * Equivalent to Proc.new, except the resulting Proc objects check the
+ * number of parameters passed when called.
+ */
+
+static VALUE
+f_lambda(VALUE _)
+{
+ f_lambda_warn();
return rb_block_lambda();
}
diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb
index ca690dce0d..04c240813c 100644
--- a/test/ruby/test_proc.rb
+++ b/test/ruby/test_proc.rb
@@ -316,16 +316,20 @@ class TestProc < Test::Unit::TestCase
lambda(&b)
end
+ def_lambda_warning 'test_lambda_warning_pass_symbol_proc', '' do
+ lambda(&:to_s)
+ end
+
def_lambda_warning 'test_lambda_warning_pass_proc', /deprecated/ do
b = proc{}
lambda(&b)
end
- def_lambda_warning 'test_lambda_warning_pass_proc', /deprecated/ do
+ def_lambda_warning 'test_lambda_warning_pass_block', /deprecated/ do
helper_test_warn_lamda_with_passed_block{}
end
- def_lambda_warning 'test_lambda_warning_pass_proc', '' do
+ def_lambda_warning 'test_lambda_warning_pass_block_symbol_proc', '' do
# Symbol#to_proc returns lambda
helper_test_warn_lamda_with_passed_block(&:to_s)
end