From 28c4f2f683d06777e17800a087c64d058c0bc6a6 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 4 Sep 2021 17:57:35 +0900 Subject: kernel.c: add `__method__`; ref #4468 --- mrbgems/mruby-kernel-ext/src/kernel.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'mrbgems/mruby-kernel-ext/src') diff --git a/mrbgems/mruby-kernel-ext/src/kernel.c b/mrbgems/mruby-kernel-ext/src/kernel.c index 152ce0e8d..de386c590 100644 --- a/mrbgems/mruby-kernel-ext/src/kernel.c +++ b/mrbgems/mruby-kernel-ext/src/kernel.c @@ -5,6 +5,7 @@ #include #include #include +#include #include static mrb_value @@ -64,6 +65,27 @@ mrb_f_caller(mrb_state *mrb, mrb_value self) return mrb_ary_new_from_values(mrb, n, RARRAY_PTR(bt)+lev+1); } +/* + * call-seq: + * __method__ -> symbol + * + * Returns the called name of the current method as a Symbol. + * If called outside of a method, it returns nil. + * + */ +static mrb_value +mrb_f_method(mrb_state *mrb, mrb_value self) +{ + mrb_callinfo *ci = mrb->c->ci; + ci--; + if (ci->proc->e.env->tt == MRB_TT_ENV && ci->proc->e.env->mid) + return mrb_symbol_value(ci->proc->e.env->mid); + else if (ci->mid) + return mrb_symbol_value(ci->mid); + else + return mrb_nil_value(); +} + /* * call-seq: * __callee__ -> symbol @@ -246,6 +268,7 @@ mrb_mruby_kernel_ext_gem_init(mrb_state *mrb) mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2)); mrb_define_module_function(mrb, krn, "caller", mrb_f_caller, MRB_ARGS_OPT(2)); + mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE()); mrb_define_method(mrb, krn, "__callee__", mrb_f_callee, MRB_ARGS_NONE()); mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ARG(1,1)); #ifndef MRB_NO_FLOAT -- cgit v1.2.3