From bfe5d22f89a871b6c1cb556c0115145ade9fe286 Mon Sep 17 00:00:00 2001 From: 卜部昌平 Date: Thu, 29 Aug 2019 10:57:48 +0900 Subject: drop-in type check for rb_define_private_method We can check the function pointer passed to rb_define_private_method like how we do so in rb_define_method. Doing so revealed some problematic usages of rb_obj_dummy. They had to be split according to their arity. --- object.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index c3884aacd3..501fcfcffa 100644 --- a/object.c +++ b/object.c @@ -1141,11 +1141,23 @@ rb_obj_tap(VALUE obj) */ static VALUE -rb_obj_dummy(void) +rb_obj_dummy() { return Qnil; } +static VALUE +rb_obj_dummy0(VALUE _) +{ + return rb_obj_dummy(); +} + +static VALUE +rb_obj_dummy1(VALUE _x, VALUE _y) +{ + return rb_obj_dummy(); +} + /** * call-seq: * obj.tainted? -> true or false @@ -4486,16 +4498,16 @@ InitVM_Object(void) #undef rb_intern #define rb_intern(str) rb_intern_const(str) - rb_define_private_method(rb_cBasicObject, "initialize", rb_obj_dummy, 0); + rb_define_private_method(rb_cBasicObject, "initialize", rb_obj_dummy0, 0); rb_define_alloc_func(rb_cBasicObject, rb_class_allocate_instance); rb_define_method(rb_cBasicObject, "==", rb_obj_equal, 1); rb_define_method(rb_cBasicObject, "equal?", rb_obj_equal, 1); rb_define_method(rb_cBasicObject, "!", rb_obj_not, 0); rb_define_method(rb_cBasicObject, "!=", rb_obj_not_equal, 1); - rb_define_private_method(rb_cBasicObject, "singleton_method_added", rb_obj_dummy, 1); - rb_define_private_method(rb_cBasicObject, "singleton_method_removed", rb_obj_dummy, 1); - rb_define_private_method(rb_cBasicObject, "singleton_method_undefined", rb_obj_dummy, 1); + rb_define_private_method(rb_cBasicObject, "singleton_method_added", rb_obj_dummy1, 1); + rb_define_private_method(rb_cBasicObject, "singleton_method_removed", rb_obj_dummy1, 1); + rb_define_private_method(rb_cBasicObject, "singleton_method_undefined", rb_obj_dummy1, 1); /* Document-module: Kernel * @@ -4511,13 +4523,13 @@ InitVM_Object(void) */ rb_mKernel = rb_define_module("Kernel"); rb_include_module(rb_cObject, rb_mKernel); - rb_define_private_method(rb_cClass, "inherited", rb_obj_dummy, 1); - rb_define_private_method(rb_cModule, "included", rb_obj_dummy, 1); - rb_define_private_method(rb_cModule, "extended", rb_obj_dummy, 1); - rb_define_private_method(rb_cModule, "prepended", rb_obj_dummy, 1); - rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy, 1); - rb_define_private_method(rb_cModule, "method_removed", rb_obj_dummy, 1); - rb_define_private_method(rb_cModule, "method_undefined", rb_obj_dummy, 1); + rb_define_private_method(rb_cClass, "inherited", rb_obj_dummy1, 1); + rb_define_private_method(rb_cModule, "included", rb_obj_dummy1, 1); + rb_define_private_method(rb_cModule, "extended", rb_obj_dummy1, 1); + rb_define_private_method(rb_cModule, "prepended", rb_obj_dummy1, 1); + rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy1, 1); + rb_define_private_method(rb_cModule, "method_removed", rb_obj_dummy1, 1); + rb_define_private_method(rb_cModule, "method_undefined", rb_obj_dummy1, 1); rb_define_method(rb_mKernel, "nil?", rb_false, 0); rb_define_method(rb_mKernel, "===", rb_equal, 1); -- cgit v1.2.3