Feature #11689 ยป 0001-Add-Method-visibility-and-UnboundMethod-visibility.patch
| proc.c | ||
|---|---|---|
| } | ||
| /* | ||
| * call-seq: | ||
| * meth.visibility -> symbol | ||
| * | ||
| * Returns a symbol (:public, :private, or :protected). | ||
| */ | ||
| static VALUE | ||
| rb_method_visibility(VALUE method) | ||
| { | ||
| const struct METHOD *data; | ||
| VALUE sym; | ||
| TypedData_Get_Struct(method, struct METHOD, &method_data_type, data); | ||
| switch(METHOD_ENTRY_VISI(data->me)) { | ||
| case METHOD_VISI_UNDEF: | ||
| case METHOD_VISI_PUBLIC: sym = ID2SYM(rb_intern("public")); break; | ||
| case METHOD_VISI_PRIVATE: sym = ID2SYM(rb_intern("private")); break; | ||
| case METHOD_VISI_PROTECTED: sym = ID2SYM(rb_intern("protected")); break; | ||
| default: UNREACHABLE; | ||
| } | ||
| return sym; | ||
| } | ||
| /* | ||
| * call-seq: | ||
| * local_jump_error.exit_value -> obj | ||
| * | ||
| ... | ... | |
| rb_define_method(rb_cMethod, "source_location", rb_method_location, 0); | ||
| rb_define_method(rb_cMethod, "parameters", rb_method_parameters, 0); | ||
| rb_define_method(rb_cMethod, "super_method", method_super_method, 0); | ||
| rb_define_method(rb_cMethod, "visibility", rb_method_visibility, 0); | ||
| rb_define_method(rb_mKernel, "method", rb_obj_method, 1); | ||
| rb_define_method(rb_mKernel, "public_method", rb_obj_public_method, 1); | ||
| rb_define_method(rb_mKernel, "singleton_method", rb_obj_singleton_method, 1); | ||
| ... | ... | |
| rb_define_method(rb_cUnboundMethod, "source_location", rb_method_location, 0); | ||
| rb_define_method(rb_cUnboundMethod, "parameters", rb_method_parameters, 0); | ||
| rb_define_method(rb_cUnboundMethod, "super_method", method_super_method, 0); | ||
| rb_define_method(rb_cUnboundMethod, "visibility", rb_method_visibility, 0); | ||
| /* Module#*_method */ | ||
| rb_define_method(rb_cModule, "instance_method", rb_mod_instance_method, 1); | ||
| test/ruby/test_method.rb | ||
|---|---|---|
| assert_nil(m, Feature9781) | ||
| end | ||
| def test_visibility_method | ||
| v = Visibility.new | ||
| assert_equal(:public, v.method(:mv1).visibility) | ||
| assert_equal(:private, v.method(:mv2).visibility) | ||
| assert_equal(:protected, v.method(:mv3).visibility) | ||
| end | ||
| def test_visibility_method_unbound | ||
| assert_equal(:public, Visibility.instance_method(:mv1).visibility) | ||
| assert_equal(:private, Visibility.instance_method(:mv2).visibility) | ||
| assert_equal(:protected, Visibility.instance_method(:mv3).visibility) | ||
| end | ||
| def rest_parameter(*rest) | ||
| rest | ||
| end | ||