summaryrefslogtreecommitdiff
path: root/pad.c
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2021-11-20 16:40:59 +0000
committerPaul Evans <leonerd@leonerd.org.uk>2021-11-29 10:35:46 +0000
commit6a2e756f8693f753bad68e1827d8eee014636c86 (patch)
treedc1908e352075eaf47d2e34f8babff880ec18dd6 /pad.c
parent2a98b8cbbc6f75b5aaefb10acc4da4427359fcea (diff)
downloadperl-6a2e756f8693f753bad68e1827d8eee014636c86.tar.gz
Add a builtin:: namespace, with true/false/isbool
This finishes the perl-visible API required for RFC 0008 https://github.com/Perl/RFCs/blob/master/rfcs/rfc0008.md It also begins the "builtin::" namespace of RFC 0009 https://github.com/Perl/RFCs/blob/master/rfcs/rfc0009.md
Diffstat (limited to 'pad.c')
-rw-r--r--pad.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/pad.c b/pad.c
index b5f88219b1..bc41a475bb 100644
--- a/pad.c
+++ b/pad.c
@@ -2208,11 +2208,22 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned)
CvNAME_HEK_set(cv, share_hek_hek(CvNAME_HEK(proto)));
else CvGV_set(cv,CvGV(proto));
CvSTASH_set(cv, CvSTASH(proto));
- OP_REFCNT_LOCK;
- CvROOT(cv) = OpREFCNT_inc(CvROOT(proto));
- OP_REFCNT_UNLOCK;
- CvSTART(cv) = CvSTART(proto);
- CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(proto);
+
+ /* It is unlikely that proto is an xsub, but it could happen; e.g. if a
+ * module has performed a lexical sub import trick on an xsub. This
+ * happens with builtin::import, for example
+ */
+ if (UNLIKELY(CvISXSUB(proto))) {
+ CvXSUB(cv) = CvXSUB(proto);
+ CvXSUBANY(cv) = CvXSUBANY(proto);
+ }
+ else {
+ OP_REFCNT_LOCK;
+ CvROOT(cv) = OpREFCNT_inc(CvROOT(proto));
+ OP_REFCNT_UNLOCK;
+ CvSTART(cv) = CvSTART(proto);
+ CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(proto);
+ }
if (SvPOK(proto)) {
sv_setpvn(MUTABLE_SV(cv), SvPVX_const(proto), SvCUR(proto));
@@ -2222,7 +2233,7 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned)
if (SvMAGIC(proto))
mg_copy((SV *)proto, (SV *)cv, 0, 0);
- if (CvPADLIST(proto))
+ if (!CvISXSUB(proto) && CvPADLIST(proto))
cv = S_cv_clone_pad(aTHX_ proto, cv, outside, cloned, newcv);
DEBUG_Xv(