Skip to content

Commit

Permalink
Remove default Kernel#method_missing.
Browse files Browse the repository at this point in the history
Internal method_missing works without problems.
  • Loading branch information
matz committed Feb 27, 2017
1 parent b563bcb commit a76dc04
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 31 deletions.
4 changes: 4 additions & 0 deletions src/kernel.c
Expand Up @@ -969,6 +969,7 @@ mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args)
* r.xxiii #=> 23 * r.xxiii #=> 23
* r.mm #=> 2000 * r.mm #=> 2000
*/ */
#ifndef MRB_DEFAULT_METHOD_MISSING
static mrb_value static mrb_value
mrb_obj_missing(mrb_state *mrb, mrb_value mod) mrb_obj_missing(mrb_state *mrb, mrb_value mod)
{ {
Expand All @@ -981,6 +982,7 @@ mrb_obj_missing(mrb_state *mrb, mrb_value mod)
/* not reached */ /* not reached */
return mrb_nil_value(); return mrb_nil_value();
} }
#endif


static inline mrb_bool static inline mrb_bool
basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub) basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub)
Expand Down Expand Up @@ -1214,7 +1216,9 @@ mrb_init_kernel(mrb_state *mrb)
mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */ mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */
mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */ mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */
mrb_define_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.3.28 */ mrb_define_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.3.28 */
#ifndef MRB_DEFAULT_METHOD_MISSING
mrb_define_method(mrb, krn, "method_missing", mrb_obj_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */ mrb_define_method(mrb, krn, "method_missing", mrb_obj_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */
#endif
mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */ mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */
mrb_define_method(mrb, krn, "nil?", mrb_false, MRB_ARGS_NONE()); /* 15.3.1.3.32 */ mrb_define_method(mrb, krn, "nil?", mrb_false, MRB_ARGS_NONE()); /* 15.3.1.3.32 */
mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.33 */ mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.33 */
Expand Down
31 changes: 0 additions & 31 deletions test/t/nomethoderror.rb
Expand Up @@ -21,37 +21,6 @@
end end
end end


assert('Can still raise when Kernel#method_missing is removed') do
assert_raise(NoMethodError) do
begin
Kernel.alias_method(:old_method_missing, :method_missing)
Kernel.remove_method(:method_missing)
1.__send__(:foo)
ensure
Kernel.alias_method(:method_missing, :old_method_missing)
Kernel.remove_method(:old_method_missing)
end
end
end

assert('Can still call super when Kernel#method_missing is removed') do
assert_raise(NoMethodError) do
class A
def foo
super
end
end
begin
Kernel.alias_method(:old_method_missing, :method_missing)
Kernel.remove_method(:method_missing)
A.new.foo
ensure
Kernel.alias_method(:method_missing, :old_method_missing)
Kernel.remove_method(:old_method_missing)
end
end
end

assert("NoMethodError#new does not return an exception") do assert("NoMethodError#new does not return an exception") do
begin begin
class << NoMethodError class << NoMethodError
Expand Down

0 comments on commit a76dc04

Please sign in to comment.