diff options
-rw-r--r-- | proc.c | 36 | ||||
-rw-r--r-- | test/ruby/test_proc.rb | 8 |
2 files changed, 28 insertions, 16 deletions
@@ -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 |