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/src | |
| 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/src')
| -rw-r--r-- | mrbgems/mruby-symbol-ext/src/symbol.c | 55 |
1 files changed, 55 insertions, 0 deletions
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) +{ +} |
