add patch to improve method caching, regen headers
Joshua Pritikin [Mon, 6 Jul 1998 09:19:29 +0000 (05:19 -0400)]
Message-Id: <H00000e50008a518@MHS>
Subject: [PATCH _70] cache missing methods

p4raw-id: //depot/perl@1350

embedvar.h
gv.c
interp.sym
intrpvar.h
perlvars.h

index e0c0920..0822ff2 100644 (file)
 #define stdingv                        (curinterp->Istdingv)
 #define strchop                        (curinterp->Istrchop)
 #define strtab                 (curinterp->Istrtab)
+#define sub_generation         (curinterp->Isub_generation)
 #define sublex_info            (curinterp->Isublex_info)
 #define sv_arenaroot           (curinterp->Isv_arenaroot)
 #define sv_count               (curinterp->Isv_count)
 #define Istdingv               stdingv
 #define Istrchop               strchop
 #define Istrtab                        strtab
+#define Isub_generation                sub_generation
 #define Isublex_info           sublex_info
 #define Isv_arenaroot          sv_arenaroot
 #define Isv_count              sv_count
 #define stdingv                        Perl_stdingv
 #define strchop                        Perl_strchop
 #define strtab                 Perl_strtab
+#define sub_generation         Perl_sub_generation
 #define sublex_info            Perl_sublex_info
 #define sv_arenaroot           Perl_sv_arenaroot
 #define sv_count               Perl_sv_count
 #define sh_path                        (Perl_Vars.Gsh_path)
 #define sighandlerp            (Perl_Vars.Gsighandlerp)
 #define specialsv_list         (Perl_Vars.Gspecialsv_list)
-#define sub_generation         (Perl_Vars.Gsub_generation)
 #define subline                        (Perl_Vars.Gsubline)
 #define subname                        (Perl_Vars.Gsubname)
 #define sv_mutex               (Perl_Vars.Gsv_mutex)
 #define Gsh_path               sh_path
 #define Gsighandlerp           sighandlerp
 #define Gspecialsv_list                specialsv_list
-#define Gsub_generation                sub_generation
 #define Gsubline               subline
 #define Gsubname               subname
 #define Gsv_mutex              sv_mutex
 #define sh_path                        Perl_sh_path
 #define sighandlerp            Perl_sighandlerp
 #define specialsv_list         Perl_specialsv_list
-#define sub_generation         Perl_sub_generation
 #define subline                        Perl_subline
 #define subname                        Perl_subname
 #define sv_mutex               Perl_sv_mutex
diff --git a/gv.c b/gv.c
index 07c0b19..816caab 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -103,6 +103,7 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
     GvSV(gv) = NEWSV(72,0);
     GvLINE(gv) = curcop->cop_line;
     GvFILEGV(gv) = curcop->cop_filegv;
+    GvCVGEN(gv) = sub_generation - 1;   /* as old as possible */
     GvEGV(gv) = gv;
     sv_magic((SV*)gv, (SV*)gv, '*', name, len);
     GvSTASH(gv) = (HV*)SvREFCNT_inc(stash);
@@ -117,7 +118,6 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
        GvCV(gv) = compcv;
        LEAVE;
 
-       GvCVGEN(gv) = 0;
        sub_generation++;
        CvGV(GvCV(gv)) = (GV*)SvREFCNT_inc(gv);
        CvFILEGV(GvCV(gv)) = curcop->cop_filegv;
@@ -176,13 +176,15 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
            gv_init(topgv, stash, name, len, TRUE);
        if (cv = GvCV(topgv)) {
            /* If genuine method or valid cache entry, use it */
-           if (!GvCVGEN(topgv) || GvCVGEN(topgv) >= sub_generation)
+           if (!GvCVGEN(topgv) || GvCVGEN(topgv) == sub_generation)
                return topgv;
            /* Stale cached entry: junk it */
            SvREFCNT_dec(cv);
            GvCV(topgv) = cv = Nullcv;
            GvCVGEN(topgv) = 0;
        }
+       else if (GvCVGEN(topgv) == sub_generation)
+           return 0;  /* cache indicates sub doesn't exist */
     }
 
     gvp = (GV**)hv_fetch(stash, "ISA", 3, FALSE);
@@ -258,6 +260,10 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
                }
                return gv;
            }
+           else if (topgv && GvREFCNT(topgv) == 1) {
+               /* cache the fact that the method is not defined */
+               GvCVGEN(topgv) = sub_generation;
+           }
        }
     }
 
index 66e539b..2e76cc4 100644 (file)
@@ -182,6 +182,7 @@ statusvalue_vms
 stdingv
 strchop
 strtab
+sub_generation
 sublex_info
 sv_count
 sv_objcount
index ea5159a..75fb556 100644 (file)
@@ -104,6 +104,7 @@ PERLVAR(Ibeginav,   AV *)           /* names of BEGIN subroutines */
 PERLVAR(Iendav,                AV *)           /* names of END subroutines */
 PERLVAR(Iinitav,       AV *)           /* names of INIT subroutines */
 PERLVAR(Istrtab,       HV *)           /* shared string table */
+PERLVARI(Isub_generation,U32,1)                /* incr to invalidate method cache */
 
 /* memory management */
 PERLVAR(Isv_count,     I32)            /* how many SV* are currently allocated */
index 115ec5a..4e9d3b8 100644 (file)
@@ -50,7 +50,6 @@ PERLVAR(Gan,          U32)            /* malloc sequence number */
 PERLVAR(Gcop_seqmax,   U32)            /* statement sequence number */
 PERLVAR(Gop_seqmax,    U16)            /* op sequence number */
 PERLVAR(Gevalseq,      U32)            /* eval sequence number */
-PERLVAR(Gsub_generation,U32)           /* incr to invalidate method cache */
 PERLVAR(Gorigenviron,  char **)
 PERLVAR(Gorigalen,     U32)
 PERLVAR(Gpidstatus,    HV *)           /* pid-to-status mappings for waitpid */