aboutsummaryrefslogtreecommitdiffstats
path: root/proc.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-12-11 11:54:50 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-11 11:57:25 +0900
commitb53ccb9c69abd24e3bdad66cbe4c7e7480eaef16 (patch)
treed8b5ab834dcbaf999de8ac5ad612924cdb5c914b /proc.c
parentad6573163f4a7b7eedb904f2f6f730c3cd2669e3 (diff)
downloadruby-b53ccb9c69abd24e3bdad66cbe4c7e7480eaef16.tar.gz
show deprecation warning correctly for lambda(&b)
lambda(&b) where b is given block of method (like: def foo(&b)) should warn correctly. [Feature #17361] Also labmda(&labmda_block) or lambda(&:to_s) (Symbol#to_proc) should not warn (but I'm not sure who cares about it).
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/proc.c b/proc.c
index ca70eb1a0a..7e1985ceb1 100644
--- a/proc.c
+++ b/proc.c
@@ -858,15 +858,23 @@ rb_block_lambda(void)
static VALUE
f_lambda(VALUE _)
{
- VALUE block_handler = rb_vm_frame_block_handler(GET_EC()->cfp);
+ rb_control_frame_t *cfp = GET_EC()->cfp;
+ VALUE block_handler = rb_vm_frame_block_handler(cfp);
if (block_handler != VM_BLOCK_HANDLER_NONE) {
switch (vm_block_handler_type(block_handler)) {
- case block_handler_type_proc:
+ case block_handler_type_iseq:
+ if (RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)->ep == VM_BH_TO_ISEQ_BLOCK(block_handler)->ep) {
+ break;
+ }
case block_handler_type_symbol:
+ break;
+ case block_handler_type_proc:
+ if (rb_proc_lambda_p(VM_BH_TO_PROC(block_handler))) {
+ break;
+ }
case block_handler_type_ifunc:
rb_warn_deprecated("lambda without a literal block", "the proc without lambda");
- default:
break;
}
}