From 7bcfd9189a6a0b2ad58fed988faaf795a4987893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Wed, 28 Aug 2019 18:19:11 +0900 Subject: drop-in type check for rb_define_global_function We can check the function pointer passed to rb_define_global_function like we do so in rb_define_method. It turns out that almost anybody is misunderstanding the API. --- proc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'proc.c') diff --git a/proc.c b/proc.c index 1b8aa3953b..7a5ccd3508 100644 --- a/proc.c +++ b/proc.c @@ -836,6 +836,12 @@ rb_block_proc(void) return proc_new(rb_cProc, FALSE); } +static VALUE +f_proc(VALUE _) +{ + return rb_block_proc(); +} + /* * call-seq: * lambda { |...| block } -> a_proc @@ -850,6 +856,12 @@ rb_block_lambda(void) return proc_new(rb_cProc, TRUE); } +static VALUE +f_lambda(VALUE _) +{ + return rb_block_lambda(); +} + /* Document-method: Proc#=== * * call-seq: @@ -3623,8 +3635,8 @@ Init_Proc(void) rb_vm_register_special_exception(ruby_error_sysstack, rb_eSysStackError, "stack level too deep"); /* utility functions */ - rb_define_global_function("proc", rb_block_proc, 0); - rb_define_global_function("lambda", rb_block_lambda, 0); + rb_define_global_function("proc", f_proc, 0); + rb_define_global_function("lambda", f_lambda, 0); /* Method */ rb_cMethod = rb_define_class("Method", rb_cObject); -- cgit v1.2.3