summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-kernel-ext/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-10-23 23:42:34 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-10-23 23:42:34 +0900
commitd3c7e117ef38b4b0e6386dff5acf54b08f3e23a7 (patch)
treeba1a4c37b6916a8310629a821e9fb3424dfacd11 /mrbgems/mruby-kernel-ext/src
parent5616208e1a681d3a4ad1c41c2bd6447aa8817fad (diff)
parent9e053664516b470681c228c82381383e67869959 (diff)
downloadmruby-d3c7e117ef38b4b0e6386dff5acf54b08f3e23a7.tar.gz
mruby-d3c7e117ef38b4b0e6386dff5acf54b08f3e23a7.zip
Merge pull request #2617 from suzukaze/add-kernel.Hash
Add Kernel#Hash
Diffstat (limited to 'mrbgems/mruby-kernel-ext/src')
-rw-r--r--mrbgems/mruby-kernel-ext/src/kernel.c35
1 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 011c58049..10b0bc1ce 100644
--- a/mrbgems/mruby-kernel-ext/src/kernel.c
+++ b/mrbgems/mruby-kernel-ext/src/kernel.c
@@ -1,6 +1,7 @@
#include "mruby.h"
#include "mruby/error.h"
#include "mruby/array.h"
+#include "mruby/hash.h"
/*
* call-seq:
@@ -75,6 +76,39 @@ mrb_f_array(mrb_state *mrb, mrb_value self)
return tmp;
}
+/*
+ * call-seq:
+ * Hash(arg) -> hash
+ *
+ * Converts <i>arg</i> to a <code>Hash</code> by calling
+ * <i>arg</i><code>.to_hash</code>. Returns an empty <code>Hash</code> when
+ * <i>arg</i> is <tt>nil</tt> or <tt>[]</tt>.
+ *
+ * Hash([]) #=> {}
+ * Hash(nil) #=> {}
+ * Hash(key: :value) #=> {:key => :value}
+ * Hash([1, 2, 3]) #=> TypeError
+ */
+static mrb_value
+mrb_f_hash(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg, tmp;
+
+ mrb_get_args(mrb, "o", &arg);
+ if (mrb_nil_p(arg)) {
+ return mrb_hash_new(mrb);
+ }
+ tmp = mrb_check_convert_type(mrb, arg, MRB_TT_HASH, "Hash", "to_hash");
+ if (mrb_nil_p(tmp)) {
+ if (mrb_array_p(arg) && RARRAY_LEN(arg) == 0) {
+ return mrb_hash_new(mrb);
+ }
+ mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into Hash",
+ mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, arg)));
+ }
+ return tmp;
+}
+
void
mrb_mruby_kernel_ext_gem_init(mrb_state *mrb)
{
@@ -84,6 +118,7 @@ mrb_mruby_kernel_ext_gem_init(mrb_state *mrb)
mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE());
mrb_define_module_function(mrb, krn, "String", mrb_f_string, MRB_ARGS_REQ(1));
mrb_define_module_function(mrb, krn, "Array", mrb_f_array, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, krn, "Hash", mrb_f_hash, MRB_ARGS_REQ(1));
}
void