Skip to content

Commit 113565a

Browse files
committed
hash.c (mrb_hash_to_s): add recursive inspect check to Hash#inspect
1 parent 5cb0c74 commit 113565a

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

mrblib/hash.rb

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -195,30 +195,6 @@ def merge(*others, &block)
195195
h
196196
end
197197

198-
# internal method for Hash inspection
199-
def _inspect(recur_list)
200-
return "{}" if self.size == 0
201-
return "{...}" if recur_list[self.object_id]
202-
recur_list[self.object_id] = true
203-
ary=[]
204-
keys=self.keys
205-
vals=self.values
206-
size=keys.size
207-
i=0
208-
while i<size
209-
ary<<(keys[i]._inspect(recur_list) + "=>" + vals[i]._inspect(recur_list))
210-
i+=1
211-
end
212-
"{"+ary.join(", ")+"}"
213-
end
214-
##
215-
# Return the contents of this hash as a string.
216-
#
217-
def inspect
218-
self._inspect({})
219-
end
220-
alias to_s inspect
221-
222198
##
223199
# call-seq:
224200
# hsh.reject! {| key, value | block } -> hsh or nil

src/hash.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1817,6 +1817,43 @@ mrb_hash_compact(mrb_state *mrb, mrb_value hash)
18171817
return hash;
18181818
}
18191819

1820+
/*
1821+
* call-seq:
1822+
* hash.to_s -> string
1823+
* hash.inspect -> string
1824+
*
1825+
* Return the contents of this hash as a string.
1826+
*/
1827+
static mrb_value
1828+
mrb_hash_to_s(mrb_state *mrb, mrb_value self)
1829+
{
1830+
mrb->c->ci->mid = MRB_SYM(inspect);
1831+
mrb_value ret = mrb_str_new_lit(mrb, "{");
1832+
int ai = mrb_gc_arena_save(mrb);
1833+
if (mrb_inspect_recursive_p(mrb, self)) {
1834+
mrb_str_cat_lit(mrb, ret, "...}");
1835+
return ret;
1836+
}
1837+
1838+
mrb_int i = 0;
1839+
struct RHash *h = mrb_hash_ptr(self);
1840+
h_each(h, entry, {
1841+
if (i++ > 0) mrb_str_cat_lit(mrb, ret, ", ");
1842+
h_check_modified(mrb, h, {
1843+
mrb_str_cat_str(mrb, ret, mrb_inspect(mrb, entry->key));
1844+
});
1845+
mrb_gc_arena_restore(mrb, ai);
1846+
mrb_str_cat_lit(mrb, ret, "=>");
1847+
h_check_modified(mrb, h, {
1848+
mrb_str_cat_str(mrb, ret, mrb_inspect(mrb, entry->val));
1849+
});
1850+
mrb_gc_arena_restore(mrb, ai);
1851+
});
1852+
mrb_str_cat_lit(mrb, ret, "}");
1853+
1854+
return ret;
1855+
}
1856+
18201857
void
18211858
mrb_init_hash(mrb_state *mrb)
18221859
{
@@ -1849,6 +1886,8 @@ mrb_init_hash(mrb_state *mrb)
18491886
mrb_define_method(mrb, h, "store", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.26 */
18501887
mrb_define_method(mrb, h, "value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.27 */
18511888
mrb_define_method(mrb, h, "values", mrb_hash_values, MRB_ARGS_NONE()); /* 15.2.13.4.28 */
1889+
mrb_define_method(mrb, h, "to_s", mrb_hash_to_s, MRB_ARGS_NONE());
1890+
mrb_define_method(mrb, h, "inspect", mrb_hash_to_s, MRB_ARGS_NONE());
18521891
mrb_define_method(mrb, h, "rehash", mrb_hash_rehash, MRB_ARGS_NONE());
18531892
mrb_define_method(mrb, h, "__merge", mrb_hash_merge_m, MRB_ARGS_REQ(1));
18541893
mrb_define_method(mrb, h, "__compact", mrb_hash_compact, MRB_ARGS_NONE()); /* implementation of Hash#compact! */

0 commit comments

Comments
 (0)