summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorh2so5 <[email protected]>2013-04-21 17:50:54 +0900
committerh2so5 <[email protected]>2013-04-21 18:01:09 +0900
commit2fa8bf468369ddadc26badd501b2b2c55dec4620 (patch)
tree1c41c06c346253e4e6b940af454d4a01342b783f
parent4a311a4760af037f7a9b8e2b60b4448e92e7f5e4 (diff)
downloadmruby-2fa8bf468369ddadc26badd501b2b2c55dec4620.tar.gz
mruby-2fa8bf468369ddadc26badd501b2b2c55dec4620.zip
Add Symbol#to_proc, Symbol.all_symbols
-rw-r--r--build_config.rb3
-rw-r--r--mrbgems/mruby-symbol-ext/mrbgem.rake4
-rw-r--r--mrbgems/mruby-symbol-ext/mrblib/symbol.rb9
-rw-r--r--mrbgems/mruby-symbol-ext/src/symbol.c55
-rw-r--r--mrbgems/mruby-symbol-ext/test/symbol.rb12
5 files changed, 83 insertions, 0 deletions
diff --git a/build_config.rb b/build_config.rb
index de7cf0383..31d20d4fa 100644
--- a/build_config.rb
+++ b/build_config.rb
@@ -47,6 +47,9 @@ MRuby::Build.new do |conf|
# Use extensional Proc class
conf.gem "#{root}/mrbgems/mruby-proc-ext"
+ # Use extensional Symbol class
+ conf.gem "#{root}/mrbgems/mruby-symbol-ext"
+
# Use Random class
conf.gem "#{root}/mrbgems/mruby-random"
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