diff options
author | Nicholas Clark <nick@ccl4.org> | 2010-10-08 15:39:24 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2010-10-08 15:39:24 +0100 |
commit | e771aaa95f65a9c44af94b9391ba49f4fcbfda43 (patch) | |
tree | e59c975af9aefc329cd2aedb49c8e3a69969f4a7 /gv.c | |
parent | 4c43faf178da84900d2d5ff3de31d38bf7fab5d3 (diff) | |
download | perl-e771aaa95f65a9c44af94b9391ba49f4fcbfda43.tar.gz |
Perl_gv_fetchpvn_flags() can avoid copying when the package separator is ::
Diffstat (limited to 'gv.c')
-rw-r--r-- | gv.c | 17 |
1 files changed, 9 insertions, 8 deletions
@@ -1052,16 +1052,17 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, len = name_cursor - name; if (len > 0) { - char smallbuf[128]; char *tmpbuf; - if (len + 2 <= (I32)sizeof (smallbuf)) - tmpbuf = smallbuf; - else + if (name_cursor == ':') { + tmpbuf = name; + len += 2; + } else { Newx(tmpbuf, len+2, char); - Copy(name, tmpbuf, len, char); - tmpbuf[len++] = ':'; - tmpbuf[len++] = ':'; + Copy(name, tmpbuf, len, char); + tmpbuf[len++] = ':'; + tmpbuf[len++] = ':'; + } gvp = (GV**)hv_fetch(stash,tmpbuf,len,add); gv = gvp ? *gvp : NULL; if (gv && gv != (const GV *)&PL_sv_undef) { @@ -1070,7 +1071,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, else GvMULTI_on(gv); } - if (tmpbuf != smallbuf) + if (tmpbuf != name) Safefree(tmpbuf); if (!gv || gv == (const GV *)&PL_sv_undef) return NULL; |