diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-05-10 00:45:34 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-05-10 00:45:34 +0900 |
| commit | 48ac1f74f199d2845e107979e6908ff1418e90bf (patch) | |
| tree | 39792bf2c13c872723c353ac9e6895f5954c97e2 /mrbgems/mruby-kernel-ext | |
| parent | 64b30b65ee3f6787978dcd336e0c2490e290a3af (diff) | |
| parent | d0c0beb880f1e6b65851724d410ace6de0ad782f (diff) | |
| download | mruby-48ac1f74f199d2845e107979e6908ff1418e90bf.tar.gz mruby-48ac1f74f199d2845e107979e6908ff1418e90bf.zip | |
Merge pull request #2218 from take-cheeze/move_method
Move `__method__` to mruby-kernel-ext since it's not ISO method.
Diffstat (limited to 'mrbgems/mruby-kernel-ext')
| -rw-r--r-- | mrbgems/mruby-kernel-ext/src/kernel.c | 21 | ||||
| -rw-r--r-- | mrbgems/mruby-kernel-ext/test/kernel.rb | 14 |
2 files changed, 35 insertions, 0 deletions
diff --git a/mrbgems/mruby-kernel-ext/src/kernel.c b/mrbgems/mruby-kernel-ext/src/kernel.c index d13cf00da..1ce63ac94 100644 --- a/mrbgems/mruby-kernel-ext/src/kernel.c +++ b/mrbgems/mruby-kernel-ext/src/kernel.c @@ -1,12 +1,33 @@ #include "mruby.h" #include "mruby/error.h" +/* + * call-seq: + * __method__ -> symbol + * + * Returns the name at the definition 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->mid) + return mrb_symbol_value(ci->mid); + else + return mrb_nil_value(); +} + void mrb_mruby_kernel_ext_gem_init(mrb_state *mrb) { struct RClass *krn = mrb->kernel_module; mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_NONE()); + mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE()); } void diff --git a/mrbgems/mruby-kernel-ext/test/kernel.rb b/mrbgems/mruby-kernel-ext/test/kernel.rb index 97ef95d54..0e47e3b57 100644 --- a/mrbgems/mruby-kernel-ext/test/kernel.rb +++ b/mrbgems/mruby-kernel-ext/test/kernel.rb @@ -2,3 +2,17 @@ assert('Kernel.fail, Kernel#fail') do assert_raise(RuntimeError) { fail } assert_raise(RuntimeError) { Kernel.fail } end + +assert('Kernel#__method__') do + assert_equal(:m, Class.new {def m; __method__; end}.new.m) + assert_equal(:m, Class.new {define_method(:m) {__method__}}.new.m) + c = Class.new do + [:m1, :m2].each do |m| + define_method(m) do + __method__ + end + end + end + assert_equal(:m1, c.new.m1) + assert_equal(:m2, c.new.m2) +end |
