summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-08-30 22:14:10 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-08-30 22:30:36 +0900
commitf6564dd83e058fee6b264b5ce6db6d868c22d94a (patch)
tree279aea8c7c7fe58c03dde17c2d214754c5c1239b
parente471d37ca5f1422860a1eaa81d4c9f1b3c8b6aed (diff)
downloadmruby-f6564dd83e058fee6b264b5ce6db6d868c22d94a.tar.gz
mruby-f6564dd83e058fee6b264b5ce6db6d868c22d94a.zip
Add new function `mrb_ensure_hash_type()`; ref #4097
Unlike `mrb_check_hash_type()` that returns `nil` if the argument is not a `Hash`, `mrb_ensure_hash_type()` raises a `TypeError` exception.
-rw-r--r--include/mruby/hash.h1
-rw-r--r--src/hash.c8
2 files changed, 8 insertions, 1 deletions
diff --git a/include/mruby/hash.h b/include/mruby/hash.h
index 2026c8e0d..449a7d4bc 100644
--- a/include/mruby/hash.h
+++ b/include/mruby/hash.h
@@ -25,6 +25,7 @@ struct RHash {
#define mrb_hash_value(p) mrb_obj_value((void*)(p))
MRB_API mrb_value mrb_hash_new_capa(mrb_state*, mrb_int);
+MRB_API mrb_value mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash);
MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash);
/*
diff --git a/src/hash.c b/src/hash.c
index 122f5b5d5..7d81bc343 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -321,6 +321,12 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)
}
MRB_API mrb_value
+mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash)
+{
+ return mrb_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash");
+}
+
+MRB_API mrb_value
mrb_check_hash_type(mrb_state *mrb, mrb_value hash)
{
return mrb_check_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash");
@@ -959,7 +965,7 @@ mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2)
khiter_t k;
mrb_hash_modify(mrb, hash1);
- hash2 = mrb_check_hash_type(mrb, hash2);
+ hash2 = mrb_ensure_hash_type(mrb, hash2);
h1 = RHASH_TBL(hash1);
h2 = RHASH_TBL(hash2);