Change 13584 by gsar@onru on 2001/12/10 02:04:58

        restrict change#13474 to eval"" CVs instead of any CV (avoids
        potential performance hit and change in semantics of closure
        lookups after C<undef &foo>)

Affected files ...

.... //depot/maint-5.6/perl/op.c#54 edit

Differences ...

==== //depot/maint-5.6/perl/op.c#54 (text) ====
Index: perl/op.c
--- perl/op.c.~1~       Sun Dec  9 19:15:06 2001
+++ perl/op.c   Sun Dec  9 19:15:06 2001
@@ -4088,6 +4088,7 @@
 {
     CV *outsidecv;
     CV *freecv = Nullcv;
+    bool is_eval = CvEVAL(cv) && !CvGV(cv);    /* is this eval"" ? */
 
 #ifdef USE_THREADS
     if (CvMUTEXP(cv)) {
@@ -4128,27 +4129,29 @@
     if (CvPADLIST(cv)) {
        /* may be during global destruction */
        if (SvREFCNT(CvPADLIST(cv))) {
-           /* inner references to cv must be fixed up */
            AV *padlist = CvPADLIST(cv);
-           AV *comppad_name = (AV*)AvARRAY(padlist)[0];
-           AV *comppad = (AV*)AvARRAY(padlist)[1];
-           SV **namepad = AvARRAY(comppad_name);
-           SV **curpad = AvARRAY(comppad);
            I32 ix;
-           for (ix = AvFILLp(comppad_name); ix > 0; ix--) {
-               SV *namesv = namepad[ix];
-               if (namesv && namesv != &PL_sv_undef
-                   && *SvPVX(namesv) == '&')
-               {
-                   CV *innercv = (CV*)curpad[ix];
-                   if (innercv && SvTYPE(innercv) == SVt_PVCV
-                       && CvOUTSIDE(innercv) == cv)
+           if (is_eval) {
+               /* inner references to eval's cv must be fixed up */
+               AV *comppad_name = (AV*)AvARRAY(padlist)[0];
+               AV *comppad = (AV*)AvARRAY(padlist)[1];
+               SV **namepad = AvARRAY(comppad_name);
+               SV **curpad = AvARRAY(comppad);
+               for (ix = AvFILLp(comppad_name); ix > 0; ix--) {
+                   SV *namesv = namepad[ix];
+                   if (namesv && namesv != &PL_sv_undef
+                       && *SvPVX(namesv) == '&')
                    {
-                       CvOUTSIDE(innercv) = outsidecv;
-                       if (!CvANON(innercv) || CvCLONED(innercv)) {
-                           (void)SvREFCNT_inc(outsidecv);
-                           if (SvREFCNT(cv))
-                               SvREFCNT_dec(cv);
+                       CV *innercv = (CV*)curpad[ix];
+                       if (innercv && SvTYPE(innercv) == SVt_PVCV
+                           && CvOUTSIDE(innercv) == cv)
+                       {
+                           CvOUTSIDE(innercv) = outsidecv;
+                           if (!CvANON(innercv) || CvCLONED(innercv)) {
+                               (void)SvREFCNT_inc(outsidecv);
+                               if (SvREFCNT(cv))
+                                   SvREFCNT_dec(cv);
+                           }
                        }
                    }
                }
End of Patch.

Reply via email to