diff options
| author | h2so5 <[email protected]> | 2013-04-21 17:50:54 +0900 |
|---|---|---|
| committer | h2so5 <[email protected]> | 2013-04-21 18:01:09 +0900 |
| commit | 2fa8bf468369ddadc26badd501b2b2c55dec4620 (patch) | |
| tree | 1c41c06c346253e4e6b940af454d4a01342b783f /mrbgems/mruby-symbol-ext | |
| parent | 4a311a4760af037f7a9b8e2b60b4448e92e7f5e4 (diff) | |
| download | mruby-2fa8bf468369ddadc26badd501b2b2c55dec4620.tar.gz mruby-2fa8bf468369ddadc26badd501b2b2c55dec4620.zip | |
Add Symbol#to_proc, Symbol.all_symbols
Diffstat (limited to 'mrbgems/mruby-symbol-ext')
| -rw-r--r-- | mrbgems/mruby-symbol-ext/mrbgem.rake | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-symbol-ext/mrblib/symbol.rb | 9 | ||||
| -rw-r--r-- | mrbgems/mruby-symbol-ext/src/symbol.c | 55 | ||||
| -rw-r--r-- | mrbgems/mruby-symbol-ext/test/symbol.rb | 12 |
4 files changed, 80 insertions, 0 deletions
diff --git a/mrbgems/mruby-symbol-ext/mrbgem.rake b/mrbgems/mruby-symbol-ext/mrbgem.rake new file mode 100644 index 000000000..8e40c743b --- /dev/null +++ b/mrbgems/mruby-symbol-ext/mrbgem.rake @@ -0,0 +1,4 @@ +MRuby::Gem::Specification.new('mruby-symbol-ext') do |spec| + spec.license = 'MIT' + spec.authors = 'mruby developers' +end diff --git a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb new file mode 100644 index 000000000..f716162e8 --- /dev/null +++ b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb @@ -0,0 +1,9 @@ +class Symbol + + def to_proc + Proc.new do |obj, *args| + obj.send(self, *args) + end + end + +end diff --git a/mrbgems/mruby-symbol-ext/src/symbol.c b/mrbgems/mruby-symbol-ext/src/symbol.c new file mode 100644 index 000000000..e2906d916 --- /dev/null +++ b/mrbgems/mruby-symbol-ext/src/symbol.c @@ -0,0 +1,55 @@ +#include "mruby.h" +#include "mruby/khash.h" +#include "mruby/array.h" + +typedef struct symbol_name { + size_t len; + const char *name; +} symbol_name; + +KHASH_DECLARE(n2s, symbol_name, mrb_sym, 1) + +/* + * call-seq: + * Symbol.all_symbols => array + * + * Returns an array of all the symbols currently in Ruby's symbol + * table. + * + * Symbol.all_symbols.size #=> 903 + * Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink, + * :chown, :EOFError, :$;, :String, + * :LOCK_SH, :"setuid?", :$<, + * :default_proc, :compact, :extend, + * :Tms, :getwd, :$=, :ThreadGroup, + * :wait2, :$>] + */ +static mrb_value +mrb_sym_all_symbols(mrb_state *mrb, mrb_value self) +{ + khiter_t k; + mrb_sym sym; + khash_t(n2s) *h = mrb->name2sym; + mrb_value ary = mrb_ary_new_capa(mrb, kh_size(h)); + + for (k = kh_begin(h); k != kh_end(h); k++) { + if (kh_exist(h, k)) { + sym = kh_value(h, k); + mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); + } + } + + return ary; +} + +void +mrb_mruby_symbol_ext_gem_init(mrb_state* mrb) +{ + struct RClass *s = mrb->symbol_class; + mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, ARGS_NONE()); +} + +void +mrb_mruby_symbol_ext_gem_final(mrb_state* mrb) +{ +} diff --git a/mrbgems/mruby-symbol-ext/test/symbol.rb b/mrbgems/mruby-symbol-ext/test/symbol.rb new file mode 100644 index 000000000..b04847b3f --- /dev/null +++ b/mrbgems/mruby-symbol-ext/test/symbol.rb @@ -0,0 +1,12 @@ +## +# Symbol(Ext) Test + +assert('Symbol#to_proc') do + assert_equal :abs.to_proc[-5], 5 +end + +assert('Symbol.all_symbols') do + foo = [:__symbol_test_1, :__symbol_test_2, :__symbol_test_3].sort + symbols = Symbol.all_symbols.select{|sym|sym.to_s.include? '__symbol_test'}.sort + assert_equal symbols, foo +end |
