#define CVf_CVGV_RC 0x0400 /* CvGV is reference counted */
#define CVf_DYNFILE 0x1000 /* The filename isn't static */
#define CVf_AUTOLOAD 0x2000 /* SvPVX contains AUTOLOADed sub name */
+#define CVf_HASEVAL 0x4000 /* contains string eval */
/* This symbol for optimised communication between toke.c and op.c: */
#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LVALUE)
#define CvAUTOLOAD_on(cv) (CvFLAGS(cv) |= CVf_AUTOLOAD)
#define CvAUTOLOAD_off(cv) (CvFLAGS(cv) &= ~CVf_AUTOLOAD)
+#define CvHASEVAL(cv) (CvFLAGS(cv) & CVf_HASEVAL)
+#define CvHASEVAL_on(cv) (CvFLAGS(cv) |= CVf_HASEVAL)
+#define CvHASEVAL_off(cv) (CvFLAGS(cv) &= ~CVf_HASEVAL)
+
/* Flags for newXS_flags */
#define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */
DEBUG_Xv(PerlIO_printf(Perl_debug_log,
"Pad clone on cv=0x%"UVxf"\n", PTR2UV(cv)));
CvCLONE_on(cv);
+ CvHASEVAL_on(cv);
}
}
}
CvROOT(cv) = OpREFCNT_inc(CvROOT(proto));
OP_REFCNT_UNLOCK;
CvSTART(cv) = CvSTART(proto);
- CvOUTSIDE(cv) = MUTABLE_CV(SvREFCNT_inc_simple(outside));
+ if (CvHASEVAL(cv))
+ CvOUTSIDE(cv) = MUTABLE_CV(SvREFCNT_inc_simple(outside));
CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(proto);
if (SvPOK(proto))
isnt($s[0], $s[1], "cloneable with //ee");
}
+# [perl #89544]
+{
+ sub trace::DESTROY {
+ push @trace::trace, "destroyed";
+ }
+
+ my $outer2 = sub {
+ my $a = bless \my $dummy, trace::;
+
+ my $outer = sub {
+ my $b;
+ my $inner = sub {
+ undef $b;
+ };
+
+ $a;
+ $inner
+ };
+
+ $outer->()
+ };
+
+ my $inner = $outer2->();
+ is "@trace::trace", "destroyed",
+ 'closures only close over named variables, not entire subs';
+}
done_testing();