Removed `to_hash` conversion method.

parent b4a35344
......@@ -27,9 +27,9 @@ class Hash
length = object.length
if length == 1
o = object[0]
if o.respond_to?(:to_hash)
if Hash === o
h = self.new
object[0].to_hash.each { |k, v| h[k] = v }
o.each { |k, v| h[k] = v }
return h
elsif o.respond_to?(:to_a)
h = self.new
......@@ -82,7 +82,7 @@ class Hash
#
def merge!(other, &block)
raise TypeError, "can't convert argument into Hash" unless other.respond_to?(:to_hash)
raise TypeError, "Hash required (#{other.class} given)" unless Hash === other
if block
other.each_key{|k|
self[k] = (self.has_key?(k))? block.call(k, self[k], other[k]): other[k]
......@@ -310,11 +310,7 @@ class Hash
# h1 < h1 #=> false
#
def <(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size < hash.size and all? {|key, val|
hash.key?(key) and hash[key] == val
}
......@@ -334,11 +330,7 @@ class Hash
# h1 <= h1 #=> true
#
def <=(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size <= hash.size and all? {|key, val|
hash.key?(key) and hash[key] == val
}
......@@ -358,11 +350,7 @@ class Hash
# h1 > h1 #=> false
#
def >(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size > hash.size and hash.all? {|key, val|
key?(key) and self[key] == val
}
......@@ -382,11 +370,7 @@ class Hash
# h1 >= h1 #=> true
#
def >=(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size >= hash.size and hash.all? {|key, val|
key?(key) and self[key] == val
}
......
......@@ -184,9 +184,9 @@ mrb_f_array(mrb_state *mrb, mrb_value self)
* 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>.
* Returns a <code>Hash</code> if <i>arg</i> is a <code>Hash</code>.
* Returns an empty <code>Hash</code> when <i>arg</i> is <tt>nil</tt>
* or <tt>[]</tt>.
*
* Hash([]) #=> {}
* Hash(nil) #=> {}
......@@ -197,21 +197,13 @@ mrb_f_array(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_hash(mrb_state *mrb, mrb_value self)
{
mrb_value arg, tmp;
mrb_value arg;
mrb_get_args(mrb, "o", &arg);
if (mrb_nil_p(arg)) {
if (mrb_nil_p(arg) || (mrb_array_p(arg) && RARRAY_LEN(arg) == 0)) {
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;
return mrb_ensure_hash_type(mrb, arg);
}
/*
......
......@@ -233,7 +233,7 @@ get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv)
if (argc != 2) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
}
tmp = mrb_check_convert_type(mrb, argv[1], MRB_TT_HASH, "Hash", "to_hash");
tmp = mrb_check_hash_type(mrb, argv[1]);
if (mrb_nil_p(tmp)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
}
......
......@@ -12,9 +12,7 @@ class Hash
# ISO 15.2.13.4.1
def ==(hash)
return true if self.equal?(hash)
begin
hash = hash.to_hash
rescue NoMethodError
unless Hash === hash
return false
end
return false if self.size != hash.size
......@@ -32,9 +30,7 @@ class Hash
# ISO 15.2.13.4.32 (x)
def eql?(hash)
return true if self.equal?(hash)
begin
hash = hash.to_hash
rescue NoMethodError
unless Hash === hash
return false
end
return false if self.size != hash.size
......@@ -154,9 +150,8 @@ class Hash
#
# ISO 15.2.13.4.23
def replace(hash)
raise TypeError, "can't convert argument into Hash" unless hash.respond_to?(:to_hash)
raise TypeError, "Hash required (#{hash.class} given)" unless Hash === hash
self.clear
hash = hash.to_hash
hash.each_key{|k|
self[k] = hash[k]
}
......@@ -179,8 +174,7 @@ class Hash
#
# ISO 15.2.13.4.22
def merge(other, &block)
raise TypeError, "can't convert argument into Hash" unless other.respond_to?(:to_hash)
other = other.to_hash
raise TypeError, "Hash required (#{other.class} given)" unless Hash === other
h = self.dup
if block
other.each_key{|k|
......
......@@ -492,18 +492,6 @@ mrb_notimplement_m(mrb_state *mrb, mrb_value self)
return mrb_nil_value();
}
static mrb_value
check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)
{
mrb_value tmp;
tmp = mrb_check_convert_type(mrb, val, t, c, m);
if (mrb_nil_p(tmp)) {
mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));
}
return tmp;
}
#define CHECK_TYPE(mrb, val, t, c) do { \
if (mrb_type(val) != (t)) {\
mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_lit(mrb, c));\
......@@ -527,7 +515,8 @@ to_ary(mrb_state *mrb, mrb_value val)
static mrb_value
to_hash(mrb_state *mrb, mrb_value val)
{
return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash");
CHECK_TYPE(mrb, val, MRB_TT_HASH, "Hash");
return val;
}
#define to_sym(mrb, ss) mrb_obj_to_sym(mrb, ss)
......
......@@ -320,18 +320,6 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)
return;
}
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");
}
MRB_API khash_t(ht)*
mrb_hash_tbl(mrb_state *mrb, mrb_value hash)
{
......@@ -787,20 +775,6 @@ mrb_hash_empty_m(mrb_state *mrb, mrb_value self)
return mrb_false_value();
}
/* 15.2.13.4.29 (x)*/
/*
* call-seq:
* hsh.to_hash => hsh
*
* Returns +self+.
*/
static mrb_value
mrb_hash_to_hash(mrb_state *mrb, mrb_value hash)
{
return hash;
}
/* 15.2.13.4.19 */
/*
* call-seq:
......@@ -1022,6 +996,4 @@ mrb_init_hash(mrb_state *mrb)
mrb_define_method(mrb, h, "store", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.26 */
mrb_define_method(mrb, h, "value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.27 */
mrb_define_method(mrb, h, "values", mrb_hash_values, MRB_ARGS_NONE()); /* 15.2.13.4.28 */
mrb_define_method(mrb, h, "to_hash", mrb_hash_to_hash, MRB_ARGS_NONE()); /* 15.2.13.4.29 (x)*/
}
......@@ -623,6 +623,23 @@ mrb_check_array_type(mrb_state *mrb, mrb_value ary)
return ary;
}
MRB_API mrb_value
mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash)
{
if (!mrb_hash_p(hash)) {
mrb_raisef(mrb, E_TYPE_ERROR, "%S cannot be converted to Hash",
inspect_type(mrb, hash));
}
return hash;
}
MRB_API mrb_value
mrb_check_hash_type(mrb_state *mrb, mrb_value hash)
{
if (!mrb_hash_p(hash)) return mrb_nil_value();
return hash;
}
MRB_API mrb_value
mrb_inspect(mrb_state *mrb, mrb_value obj)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment