aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compile.c4
-rw-r--r--gc.c2
-rw-r--r--re.c6
3 files changed, 6 insertions, 6 deletions
diff --git a/compile.c b/compile.c
index 0e56820055..f92eabaa13 100644
--- a/compile.c
+++ b/compile.c
@@ -7203,7 +7203,7 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
case TS_CDHASH:
{
int i;
- VALUE map = rb_hash_new();
+ VALUE map = rb_hash_new_with_size(RARRAY_LEN(op)/2);
rb_hash_tbl_raw(map)->type = &cdhash_type;
op = rb_convert_type_with_id(op, T_ARRAY, "Array", idTo_ary);
@@ -8525,7 +8525,7 @@ static VALUE
ibf_load_object_hash(const struct ibf_load *load, const struct ibf_object_header *header, ibf_offset_t offset)
{
const struct ibf_object_hash *hash = IBF_OBJBODY(struct ibf_object_hash, offset);
- VALUE obj = rb_hash_new();
+ VALUE obj = rb_hash_new_with_size(hash->len);
int i;
for (i=0; i<hash->len; i++) {
diff --git a/gc.c b/gc.c
index 7f6c1a7a79..3a27e4ee67 100644
--- a/gc.c
+++ b/gc.c
@@ -6735,7 +6735,7 @@ static const char *type_name(int type, VALUE obj);
static void
gc_count_add_each_types(VALUE hash, const char *name, const size_t *types)
{
- VALUE result = rb_hash_new();
+ VALUE result = rb_hash_new_with_size(T_MASK);
int i;
for (i=0; i<T_MASK; i++) {
const char *type = type_name(i, 0);
diff --git a/re.c b/re.c
index abdacb816d..c1c29aea37 100644
--- a/re.c
+++ b/re.c
@@ -820,9 +820,9 @@ reg_named_captures_iter(const OnigUChar *name, const OnigUChar *name_end,
static VALUE
rb_reg_named_captures(VALUE re)
{
- VALUE hash = rb_hash_new();
- rb_reg_check(re);
- onig_foreach_name(RREGEXP_PTR(re), reg_named_captures_iter, (void*)hash);
+ regex_t *reg = (rb_reg_check(re), RREGEXP_PTR(re));
+ VALUE hash = rb_hash_new_with_size(onig_number_of_names(reg));
+ onig_foreach_name(reg, reg_named_captures_iter, (void*)hash);
return hash;
}