Skip to content

Commit f8ac814

Browse files
atoomictonycoz
authored andcommitted
Reduce malloc&free for S_parse_gv_stash_name
S_parse_gv_stash_name was using multiple malloc and free when using ' as package separator. We can malloc & free only once the tmpbuffer as we know the size max. This is also sligthly improving iterations when using :: as we do not need to check if we need to free the tmp buffer. This is also saving an extra '*gv && *gv != (const GV *)&PL_sv_undef' check.
1 parent 97fcda7 commit f8ac814

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

gv.c

+13-12
Original file line numberDiff line numberDiff line change
@@ -1595,6 +1595,7 @@ S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name,
15951595
STRLEN *len, const char *nambeg, STRLEN full_len,
15961596
const U32 is_utf8, const I32 add)
15971597
{
1598+
char *tmpbuf = NULL;
15981599
const char *name_cursor;
15991600
const char *const name_end = nambeg + full_len;
16001601
const char *const name_em1 = name_end - 1;
@@ -1627,26 +1628,25 @@ S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name,
16271628
key = *name;
16281629
*len += 2;
16291630
}
1630-
else {
1631-
char *tmpbuf;
1632-
Newx(tmpbuf, *len+2, char);
1631+
else { /* using ' for package separator */
1632+
if (tmpbuf == NULL) /* only malloc&free once, a little more than needed */
1633+
Newx(tmpbuf, full_len+2, char);
16331634
Copy(*name, tmpbuf, *len, char);
16341635
tmpbuf[(*len)++] = ':';
16351636
tmpbuf[(*len)++] = ':';
16361637
key = tmpbuf;
16371638
}
16381639
gvp = (GV**)hv_fetch(*stash, key, is_utf8 ? -((I32)*len) : (I32)*len, add);
16391640
*gv = gvp ? *gvp : NULL;
1640-
if (*gv && *gv != (const GV *)&PL_sv_undef) {
1641-
if (SvTYPE(*gv) != SVt_PVGV)
1642-
gv_init_pvn(*gv, *stash, key, *len, (add & GV_ADDMULTI)|is_utf8);
1643-
else
1644-
GvMULTI_on(*gv);
1645-
}
1646-
if (key != *name)
1647-
Safefree(key);
1648-
if (!*gv || *gv == (const GV *)&PL_sv_undef)
1641+
if (!*gv || *gv == (const GV *)&PL_sv_undef) {
1642+
Safefree(tmpbuf);
16491643
return FALSE;
1644+
}
1645+
/* here we know that *gv && *gv != &PL_sv_undef */
1646+
if (SvTYPE(*gv) != SVt_PVGV)
1647+
gv_init_pvn(*gv, *stash, key, *len, (add & GV_ADDMULTI)|is_utf8);
1648+
else
1649+
GvMULTI_on(*gv);
16501650

16511651
if (!(*stash = GvHV(*gv))) {
16521652
*stash = GvHV(*gv) = newHV();
@@ -1681,6 +1681,7 @@ S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name,
16811681
MUTABLE_HV(SvREFCNT_inc_simple(PL_defstash));
16821682
}
16831683
}
1684+
Safefree(tmpbuf);
16841685
return TRUE;
16851686
}
16861687
}

0 commit comments

Comments
 (0)