diff options
author | Artur Bergman <sky@nanisky.com> | 2003-04-02 13:41:14 +0000 |
---|---|---|
committer | Artur Bergman <sky@nanisky.com> | 2003-04-02 13:41:14 +0000 |
commit | 081fc587427bbceff63d5141014aee022b3f9dd6 (patch) | |
tree | 40ce68e8875794031a9a20550881c9896268eeea /pp_hot.c | |
parent | 6ab58e4d47c419dca1df070f2fa15786b3285750 (diff) | |
download | perl-081fc587427bbceff63d5141014aee022b3f9dd6.tar.gz |
Add packname->stash cache before the check if a packname is a
filehandle or a package, it works because only packnames
that have been resolved to stashes are added to the cache,
and when a newIO is created we clean the cache.
Results in roughly 1.8 speed increase for class->method()
calls.
p4raw-id: //depot/perl@19133
Diffstat (limited to 'pp_hot.c')
-rw-r--r-- | pp_hot.c | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -2926,6 +2926,15 @@ S_method_common(pTHX_ SV* meth, U32* hashp) /* this isn't a reference */ packname = Nullch; + + if(SvOK(sv) && (packname = SvPV(sv, packlen))) { + HE* he = hv_fetch_ent(PL_stashcache, sv, 0, 0); + if (he) { + stash = HeVAL(he); + goto fetch; + } + } + if (!SvOK(sv) || !(packname = SvPV(sv, packlen)) || !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) || @@ -2946,6 +2955,11 @@ S_method_common(pTHX_ SV* meth, U32* hashp) stash = gv_stashpvn(packname, packlen, FALSE); if (!stash) packsv = sv; + else { + SvREFCNT_inc((SV*)stash); + if(!hv_store(PL_stashcache, packname, packlen, stash, 0)) + SvREFCNT_dec((SV*)stash); + } goto fetch; } /* it _is_ a filehandle name -- replace with a reference */ |