mirror of
https://github.com/Perl/perl5.git
synced 2026-01-26 08:38:23 +00:00
Revert "Revert "[perl #89544] Non-eval closures don’t need CvOUTSIDE""
This reverts commit 386907f061c1812ecaa5f3c88d9f729828408097. Reinstates the behaviour of CV outside references from 5.38, fixing #22547 Breaks #19370
This commit is contained in:
parent
7911101dcf
commit
90595091f2
6
cv.h
6
cv.h
@ -147,7 +147,7 @@ See L<perlguts/Autoloading with XSUBs>.
|
||||
#endif
|
||||
#define CVf_DYNFILE 0x1000 /* The filename is malloced */
|
||||
#define CVf_AUTOLOAD 0x2000 /* SvPVX contains AUTOLOADed sub name */
|
||||
/* 0x4000 previously CVf_HASEVAL */
|
||||
#define CVf_HASEVAL 0x4000 /* contains string eval */
|
||||
#define CVf_NAMED 0x8000 /* Has a name HEK */
|
||||
#define CVf_LEXICAL 0x10000 /* Omit package from name */
|
||||
#define CVf_ANONCONST 0x20000 /* :const - create anonconst op */
|
||||
@ -232,6 +232,10 @@ See L<perlguts/Autoloading with XSUBs>.
|
||||
#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)
|
||||
|
||||
#define CvNAMED(cv) (CvFLAGS(cv) & CVf_NAMED)
|
||||
#define CvNAMED_on(cv) (CvFLAGS(cv) |= CVf_NAMED)
|
||||
#define CvNAMED_off(cv) (CvFLAGS(cv) &= ~CVf_NAMED)
|
||||
|
||||
1
dump.c
1
dump.c
@ -1899,6 +1899,7 @@ const struct flag_to_name cv_flags_names[] = {
|
||||
{CVf_CVGV_RC, "CVGV_RC,"},
|
||||
{CVf_DYNFILE, "DYNFILE,"},
|
||||
{CVf_AUTOLOAD, "AUTOLOAD,"},
|
||||
{CVf_HASEVAL, "HASEVAL,"},
|
||||
{CVf_SLABBED, "SLABBED,"},
|
||||
{CVf_NAMED, "NAMED,"},
|
||||
{CVf_LEXICAL, "LEXICAL,"},
|
||||
|
||||
@ -364,8 +364,8 @@ do_test('reference to named subroutine without prototype',
|
||||
RV = $ADDR
|
||||
SV = PVCV\\($ADDR\\) at $ADDR
|
||||
REFCNT = (3|4)
|
||||
FLAGS = \\((?:HASEVAL,)?(?:NAMED)?\\) # $] < 5.015 || !thr
|
||||
FLAGS = \\(DYNFILE(?:,HASEVAL)?(?:,NAMED)?\\) # $] >= 5.015 && thr
|
||||
FLAGS = \\((?:HASEVAL(?:,NAMED)?)?\\) # $] < 5.015 || !thr
|
||||
FLAGS = \\(DYNFILE(?:,HASEVAL(?:,NAMED)?)?\\) # $] >= 5.015 && thr
|
||||
COMP_STASH = $ADDR\\t"main"
|
||||
START = $ADDR ===> \\d+
|
||||
ROOT = $ADDR
|
||||
@ -375,8 +375,8 @@ do_test('reference to named subroutine without prototype',
|
||||
DEPTH = 1(?:
|
||||
MUTEXP = $ADDR
|
||||
OWNER = $ADDR)?
|
||||
FLAGS = 0x(?:[c84]00)?0 # $] < 5.015 || !thr
|
||||
FLAGS = 0x[cd1459]000 # $] >= 5.015 && thr
|
||||
FLAGS = 0x(?:[c4]00)?0 # $] < 5.015 || !thr
|
||||
FLAGS = 0x[cd145]000 # $] >= 5.015 && thr
|
||||
OUTSIDE_SEQ = \\d+
|
||||
PADLIST = $ADDR
|
||||
PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
|
||||
|
||||
@ -2163,6 +2163,7 @@ my sub g {
|
||||
sub f { }
|
||||
}
|
||||
####
|
||||
# TODO only partially fixed
|
||||
# lexical state subroutine with outer declaration and inner definition
|
||||
# CONTEXT use feature 'lexical_subs', 'state'; no warnings 'experimental::lexical_subs';
|
||||
();
|
||||
|
||||
4
pad.c
4
pad.c
@ -1684,6 +1684,7 @@ Perl_pad_tidy(pTHX_ padtidy_type type)
|
||||
"Pad clone on cv=0x%" UVxf "\n", PTR2UV(cv)));
|
||||
CvCLONE_on(cv);
|
||||
}
|
||||
CvHASEVAL_on(cv);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1975,7 +1976,8 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned,
|
||||
PL_compcv = cv;
|
||||
if (newcv) SAVEFREESV(cv); /* in case of fatal warnings */
|
||||
|
||||
CvOUTSIDE(cv) = CvREFCNT_inc_simple(outside);
|
||||
if (CvHASEVAL(cv))
|
||||
CvOUTSIDE(cv) = CvREFCNT_inc_simple(outside);
|
||||
|
||||
SAVESPTR(PL_comppad_name);
|
||||
PL_comppad_name = protopad_name;
|
||||
|
||||
@ -687,7 +687,7 @@ $r = \$x
|
||||
isnt($s[0], $s[1], "cloneable with //ee");
|
||||
}
|
||||
|
||||
# [perl #89544] aka [GH #11286]
|
||||
# [perl #89544]
|
||||
{
|
||||
sub trace::DESTROY {
|
||||
push @trace::trace, "destroyed";
|
||||
@ -711,7 +711,6 @@ $r = \$x
|
||||
};
|
||||
|
||||
my $inner = $outer2->();
|
||||
local $TODO = "we need outside links for debugger behaviour";
|
||||
is "@trace::trace", "destroyed",
|
||||
'closures only close over named variables, not entire subs';
|
||||
}
|
||||
|
||||
@ -379,6 +379,7 @@ our $x = 1;
|
||||
is(db6(), 4);
|
||||
|
||||
# [GH #19370]
|
||||
local $TODO = "outside not available when needed";
|
||||
my sub d6 {
|
||||
DB::db3();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user