diff options
author | Chip Salzenberg <chip@atlantic.net> | 1996-12-24 09:07:00 +1200 |
---|---|---|
committer | Chip Salzenberg <chip@atlantic.net> | 1996-12-24 09:07:00 +1200 |
commit | 724421654fcf33f3acf0a7b8f4356b9255c9265a (patch) | |
tree | d012d222503a4083d0ede9c85a41b65fdb79bd1a /gv.c | |
parent | 9a089a51dfdd5e97da27c26fc8f4b6089cd8d22d (diff) | |
download | perl-724421654fcf33f3acf0a7b8f4356b9255c9265a.tar.gz |
[revert some function caching changes]perl-5.003_15
[remove] some function caching changes that were supposed to be
improvements, but weren't.
Diffstat (limited to 'gv.c')
-rw-r--r-- | gv.c | 33 |
1 files changed, 21 insertions, 12 deletions
@@ -143,18 +143,19 @@ I32 level; if (SvTYPE(topgv) != SVt_PVGV) gv_init(topgv, stash, name, len, TRUE); - if (cv = GvCV(topgv)) { - if (CvXSUB(cv) || CvROOT(cv)) { /* Not undefed. */ - if (!GvCVGEN(topgv) || /* not an inheritance cache */ - GvCVGEN(topgv) >= sub_generation) /* valid inh. cache */ - return topgv; + if (cv=GvCV(topgv)) { + if (GvCVGEN(topgv) >= sub_generation) + return topgv; /* valid cached inheritance */ + if (!GvCVGEN(topgv)) { /* not an inheritance cache */ + return topgv; + } + else { + /* stale cached entry, just junk it */ + GvCV(topgv) = cv = 0; + GvCVGEN(topgv) = 0; } - /* stale cached entry, just junk it */ - SvREFCNT_dec(cv); - GvCV(topgv) = cv = 0; - GvCVGEN(topgv) = 0; } - /* Now cv = 0, and there is no cv in topgv. */ + /* if cv is still set, we have to free it if we find something to cache */ gvp = (GV**)hv_fetch(stash,"ISA",3,FALSE); if (gvp && (gv = *gvp) != (GV*)&sv_undef && (av = GvAV(gv))) { @@ -171,9 +172,13 @@ I32 level; } gv = gv_fetchmeth(basestash, name, len, level + 1); if (gv) { + if (cv) { /* junk old undef */ + assert(SvREFCNT(topgv) > 1); + SvREFCNT_dec(topgv); + SvREFCNT_dec(cv); + } GvCV(topgv) = GvCV(gv); /* cache the CV */ GvCVGEN(topgv) = sub_generation; /* valid for now */ - SvREFCNT_inc(GvCV(gv)); return gv; } } @@ -182,9 +187,13 @@ I32 level; if (!level) { if (lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE)) { if (gv = gv_fetchmeth(lastchance, name, len, level + 1)) { + if (cv) { /* junk old undef */ + assert(SvREFCNT(topgv) > 1); + SvREFCNT_dec(topgv); + SvREFCNT_dec(cv); + } GvCV(topgv) = GvCV(gv); /* cache the CV */ GvCVGEN(topgv) = sub_generation; /* valid for now */ - SvREFCNT_inc(GvCV(gv)); return gv; } } |