diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-04 17:57:35 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-04 17:57:35 +0900 |
| commit | 28c4f2f683d06777e17800a087c64d058c0bc6a6 (patch) | |
| tree | 30c95540fc438c7425c92b540294e2058c207fc2 /mrbgems/mruby-kernel-ext | |
| parent | 09f686cd7b964a77625dde368bf5bd0e8129d317 (diff) | |
| download | mruby-28c4f2f683d06777e17800a087c64d058c0bc6a6.tar.gz mruby-28c4f2f683d06777e17800a087c64d058c0bc6a6.zip | |
kernel.c: add `__method__`; ref #4468
Diffstat (limited to 'mrbgems/mruby-kernel-ext')
| -rw-r--r-- | mrbgems/mruby-kernel-ext/src/kernel.c | 23 | ||||
| -rw-r--r-- | mrbgems/mruby-kernel-ext/test/kernel.rb | 23 |
2 files changed, 36 insertions, 10 deletions
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 <mruby/range.h> #include <mruby/string.h> #include <mruby/numeric.h> +#include <mruby/proc.h> #include <mruby/presym.h> static mrb_value @@ -66,6 +67,27 @@ mrb_f_caller(mrb_state *mrb, mrb_value self) /* * call-seq: + * __method__ -> symbol + * + * Returns the called name of the current method as a Symbol. + * If called outside of a method, it returns <code>nil</code>. + * + */ +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 * * Returns the called name of the current method as a 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 diff --git a/mrbgems/mruby-kernel-ext/test/kernel.rb b/mrbgems/mruby-kernel-ext/test/kernel.rb index 1f682c42e..e5876f976 100644 --- a/mrbgems/mruby-kernel-ext/test/kernel.rb +++ b/mrbgems/mruby-kernel-ext/test/kernel.rb @@ -37,27 +37,30 @@ assert('Kernel.caller, Kernel#caller') do assert_raise(TypeError) { c.new.baz(nil) } end -assert('Kernel#__callee__') do +assert('Kernel#__method__') do c = Class.new do - def m1; __callee__ end - define_method(:m2) {__callee__} + def m1; __method__ end + define_method(:m2) {__method__} alias m3 m1 alias_method :m4, :m2 end assert_equal(:m1, c.new.m1) assert_equal(:m2, c.new.m2) - assert_equal(:m3, c.new.m3) - assert_equal(:m4, c.new.m4) + assert_equal(:m1, c.new.m3) + assert_equal(:m2, c.new.m4) +end +assert('Kernel#__callee__') do c = Class.new do - [:m1, :m2].each do |m| - define_method(m) do - __callee__ - end - end + def m1; __callee__ end + define_method(:m2) {__callee__} + alias m3 m1 + alias_method :m4, :m2 end assert_equal(:m1, c.new.m1) assert_equal(:m2, c.new.m2) + assert_equal(:m3, c.new.m3) + assert_equal(:m4, c.new.m4) end assert('Kernel#Integer') do |
