diff options
author | Paul "LeoNerd" Evans <leonerd@leonerd.org.uk> | 2023-02-13 16:03:04 +0000 |
---|---|---|
committer | Paul Evans <leonerd@leonerd.org.uk> | 2023-02-13 17:41:49 +0000 |
commit | 39e1ad85b8062369b2b64cd49b203ef9ea7f6ebc (patch) | |
tree | 92b481d900a5498f0d3fe7fadd063122f281aa28 /pad.c | |
parent | 2efb2c40b438770605e2af0399d6d7b27f29f1fc (diff) | |
download | perl-39e1ad85b8062369b2b64cd49b203ef9ea7f6ebc.tar.gz |
Ensure that sv_dup() handles new class structures
It needs to:
* clone SVt_PVOBJ instances
* clone the xhv_class_* fields of an SVt_PVHV
* clone the PadnameFIELDINFO structure of a padname
Diffstat (limited to 'pad.c')
-rw-r--r-- | pad.c | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -2864,6 +2864,16 @@ Perl_padname_dup(pTHX_ PADNAME *src, CLONE_PARAMS *param) PadnameTYPE (dst) = (HV *)sv_dup_inc((SV *)PadnameTYPE(src), param); PadnameOURSTASH(dst) = (HV *)sv_dup_inc((SV *)PadnameOURSTASH(src), param); + if(PadnameIsFIELD(src)) { + struct padname_fieldinfo *sinfo = PadnameFIELDINFO(src); + struct padname_fieldinfo *dinfo; + Newxz(dinfo, 1, struct padname_fieldinfo); + + dinfo->fieldix = sinfo->fieldix; + dinfo->fieldstash = hv_dup_inc(sinfo->fieldstash, param); + + PadnameFIELDINFO(dst) = dinfo; + } dst->xpadn_low = src->xpadn_low; dst->xpadn_high = src->xpadn_high; dst->xpadn_gen = src->xpadn_gen; |